面試題-python 什麼是迭代器?

2021-03-02 從零開始學自動化測試
前言

python 裡面有 3 大神器:迭代器,生成器,裝飾器。在了解迭代器之前,需弄清楚2個概念:
1.什麼是迭代
2.什麼是可迭代對象

迭代

如果給定一個list或tuple,我們可以通過for循環來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)
在Python中,迭代是通過for … in來完成的。

"""
列表a中大於0的值,得到新的列表
"""
a = [1, -2, 3, -5, 7]

c = []
for i in a:
if i > 0:
c.append(i)
print(c) # [1, 3, 7]

Iterable 可迭代對象

在python 裡面 list、tuple、dict、set、str 這些基礎數據類型都是可以作用於for循環的。
可以使用 isinstance() 判斷一個對象是否是 Iterable 對象:

"""
isinstance 判斷實例類型
Iterable 可迭代對象
"""

from collections import Iterable

a = 12
print(isinstance(a, Iterable))
b = "abc"
print(isinstance(b, Iterable))
c = [1, 2, 3]
print(isinstance(c, Iterable))
d = (1, 2, 3)
print(isinstance(d, Iterable))
e = {1, 2, 3}
print(isinstance(e, Iterable))
f = {"key": 1}
print(isinstance(f, Iterable))

運行結果
False
True
True
True
True
True

除了上面的6種基礎的是可迭代的,還有一類是 生成器(generator),包括生成器和帶yield的 生成器函數

Iterator 迭代器

可以被 next() 函數調用並不斷返回下一個值的對象稱為迭代器:Iterator。
可以使用isinstance() 判斷一個對象是否是 Iterator 對象:

from collections import Iterable, Iterator

a = 12
print(isinstance(a, Iterator))
b = "abc"
print(isinstance(b, Iterator))
c = [1, 2, 3]
print(isinstance(c, Iterator))
d = (1, 2, 3)
print(isinstance(d, Iterator))
e = {1, 2, 3}
print(isinstance(e, Iterator))
f = {"key": 1}
print(isinstance(f, Iterator))
結果返回
False
False
False
False
False
False

list、dict、str雖然是可迭代對象 (Iterable),卻不是 迭代器 (Iterator), 可以使用 iter() 函數,變成迭代器

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

from collections import Iterable, Iterator

b = "abc"
new_b = iter(b)

print(new_b)
print(isinstance(new_b, Iterator))

c = [1, 2, 3]
print(iter(c))
print(isinstance(iter(c), Iterator))

d = (1, 2, 3)
print(iter(d))
print(isinstance(iter(d), Iterator))

e = {1, 2, 3}
print(iter(e))
print(isinstance(iter(e), Iterator))

f = {"key": 1}
print(iter(f))
print(isinstance(iter(f), Iterator))

迭代器 iter() 和 next()

迭代器有兩個基本的方法:iter() 和 next()。
使用iter() 創建一個迭代器後,可以使用next() 輸出迭代器的下一個元素

a = [1, 2, 3, 4]
it = iter(a) # 創建迭代器對象
print(next(it)) # 輸出迭代器的下一個元素

print(next(it))

輸出結果
1
2

也可以使用 for 來遍歷

a = [1, 2, 3, 4]
it = iter(a) # 創建迭代器對象
for x in it:
print(x, end=" ")
輸出結果
1 2 3 4

如果用next() 函數取值,一直取到沒有了,那就會拋出」StopIteration」 異常

a = [1, 2, 3, 4]
it = iter(a) # 創建迭代器對象

print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it)) # StopIteration

運行結果

1
2
3
4
Traceback (most recent call last):
File "D:/xx.py", line 9, in <module>
print(next(it))
StopIteration

如果用next()輸出全部值,可以加個try…expect

a = [1, 2, 3, 4]
it = iter(a) # 創建迭代器對象

while True:
try:
print(next(it))
except StopIteration:
break

創建迭代器

把一個類作為一個迭代器使用需要在類中實現兩個方法 __iter__() 與 __next__() 。
__iter__() 方法返回一個特殊的迭代器對象, 這個迭代器對象實現了__next__() 方法並通過 StopIteration 異常標識迭代的完成。
__next__() 方法(Python 2 裡是 next())會返回下一個迭代器對象。
創建一個返回數字的迭代器,初始值為 1,逐步遞增 1:

class MyNumbers:

def __iter__(self):
self.a = 1
return self

def __next__(self):
x = self.a
self.a += 1
return x

myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
輸出結果
1
2
3

StopIteration

StopIteration 異常用於標識迭代的完成,防止出現無限循環的情況,在 __next__() 方法中我們可以設置在完成指定循環次數後觸發 StopIteration 異常來結束迭代。

class MyNumbers:

def __iter__(self):
self.a = 1
return self

def __next__(self):
if self.a <= 3:
x = self.a
self.a += 1
return x
else:
raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
# 第4次會拋異常
print(next(myiter))

在 3 次迭代後停止執行

斐波那契數列

斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13,特別指出:第0項是0,第1項是第一個1。從第三項開始,每一項都等於前兩項之和
求出小於100 的所有的斐波那契數列

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

class MyNumbers:

def __iter__(self):
self.n1 = 0
self.n2 = 1
self.count = 1
return self

def __next__(self):
self.n1, self.n2 = self.n2, self.count
self.count = self.n1 + self.n2
if self.count <= 100:
return self.count
else:
raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)
while True:
try:
print(next(myiter), end=" ")
except StopIteration:
break

輸出結果:2 3 5 8 13 21 34 55 89

2021年第六期《python接口自動化+測試開發》課程,1月9號開學(火熱報名中!)

本期上課時間:1月9號-4月18號,每周六、周日晚上20:30-22:30
聯繫微信/QQ:283340479

相關焦點

  • 好程式設計師Python教程分享常見的Python面試題
    好程式設計師Python教程分享常見的Python面試題,程式設計師面試難免會需要進行筆試,筆試是考驗程式設計師基礎功底的重要環節,根據很多小夥伴的面試反饋,今天總結分享了一些常見的Python面試題,想要看Python面試是不是可以順利通過,這些常見的Python面試題你應該看看。
  • 2020Python常見面試題及答案-開課吧
    Python面試題【Python面試題】-iterable(可迭代對象)和iterator(迭代器)的區別?判斷迭代器 : isinstance([], Iterator)。判斷可迭代對象: isinstance([], Iterable)。【Python面試題】怎樣聲明多個變量並賦值?
  • Python中迭代器和生成器的區別?
    公眾號新增加了一個欄目,就是每天給大家解答一道Python常見的面試題,反正每天不貪多,一天一題,正好合適,只希望這個面試欄目,給那些正在準備面試的同學
  • 什麼是Python的迭代器和生成器?(附代碼)
    utm_source=blog&utm_medium=python-iterators-and-generators這是我們要介紹的內容:什麼是可迭代對象?什麼是Python迭代器?在Python中創建一個迭代器熟悉Python中的生成器實現Python中的生成器表達式為什麼你應該使用迭代器?
  • 一文搞懂Python迭代器和生成器
    很多童鞋搞不懂python迭代器和生成器到底是什麼?它們之間又有什麼樣的關係?
  • 長達兩個月的面經,50道python開發常見基礎面試題!
    轉眼已經5月份,學員們經過三金四銀求職季積累了大量的面經,在小U的反覆催促下終於讓python將這兩個月面試常見題整理下來,不要以為你記憶力很好,這道題太奇葩了你絕對不會忘,事實證明記憶力是靠不住,話不多說來看看學員們整理的python面試題!小U 還會不斷催促學員們將新遇到的問題記錄下來。
  • Python每日3題-為什麼函數名字可以當做參數用?
    每日3題是麥叔的面試系列專題之一,每天包括初級,中級,高級難度題目各一道。 每日3題,100天之後成為大牛! 如果有不明白的,給麥叔留言。 [Easy] 為什麼函數名字可以當做參數用?
  • Python 爬蟲面試題 170 道
    最近在刷面試題,所以需要看大量的 Python 相關的面試題,從大量的題目中總結了很多的知識,同時也對一些題目進行拓展了,但是在看了網上的大部分面試題都有這幾個問題:有些部分還是 Python2 的代碼回答的很簡單,關鍵的題目沒有點出為什麼
  • python中的yield和return—迭代器和生成器
    文章目錄很多人學習python,不知道從何學起。很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
  • 【Python基礎】可迭代對象&迭代器對象及其實現
    首選確保for循環的in後面是一個可迭代對象,這樣就能通過python內置函數iter()得到一個迭代器對象(iterator)我們再看看迭代的籤名, 要麼傳入的參數(對象)本身有迭代器,要麼是一個序列。 我們這裡list__test本身就有迭代器,而str_test是有__getItem__這種序列的接口。
  • 精選Python面試100題
    通過對網絡資料的收集整理,本文列出了100道Python的面試題以及答案,你可以根據需求閱讀測試。python基礎Q1.什麼是Python? Python是一種面向對象的,交互式的,解釋型的電腦程式設計語言。
  • Python 爬蟲面試題 170 道:2019 版
    引言最近在刷面試題,所以需要看大量的 Python 相關的面試題,從大量的題目中總結了很多的知識,同時也對一些題目進行拓展了,但是在看了網上的大部分面試題不是很滿意。通過本場 Chat,你將獲得如下知識點掌握 Python 的基礎語法語法常見的 Python 應用場景掌握 Python 閉包的使用以及裝飾器的使用生成器和迭代器的使用
  • 傳智播客鄭州校區Python學習之迭代器與生成器
    尼古拉斯趙四",encoding="utf-8") as f:    print(f.readlines()) 這行代碼讓Python去打開文件夾files下的「尼古拉斯趙四」這個文件,在Windows系統中,文件路徑使用反斜槓(\)而不是斜槓(/)絕對路徑可以將文件在計算機中的準確位置告訴Python,這樣就不用關心當前運行的程序存儲在什麼地方
  • 很全的 Python 面試題
    http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format9 迭代器和生成器這個是stackoverflow裡python排名第一的問題,值得一看: http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python
  • python面試輕鬆搞定,助你搞定面試官,內附15題及答案(08期)
    小夥伴們,有沒有發現,越是好的公司面試,面試官給你的題目,全都是考你的「基本功」。下面我給大家集齊了一些面試題,拿走,不用客氣!1.__new__和__init__的區別答:這個__new__確實很少見到,先做了解吧.1. __new__是一個靜態方法,而__init__是一個實例方法.2.
  • Python 迭代器和 C++ 迭代器,最大的不同竟然是……
    無論是 Python 的基礎內置函數,還是各類高級話題,都處處可見迭代器的身影。那麼,迭代器究竟是怎樣的一個概念?其又為什麼會廣泛存在於各種程式語言中?本文將基於 C++ 與 Python,深入討論這一系列問題。什麼是迭代器?我們為什麼要使用迭代器?什麼是迭代器?
  • 吐血整理的 Python 面試題,請務必收藏!
    年關將至,給年後準備跳槽的準備一份面試指南,希望大家在漲薪和成長的路上多一點指引!python2和python3區別?Python3 使用 print 必須要以小括號包裹列印內容,比如 print('hi')Python2 既可以使用帶小括號的方式,也可以使用一個空格來分隔列印內容,比如 print 'hi'Python2 range(1,10)返回列表,python3中返回迭代器,節約內存Python2 中使用 ascii 編碼,python中使用 utf-8 編碼
  • Python 拓展之迭代器
    「迭代」相信對你來說已經不陌生了,我前面曾經專門用一篇文章來講,如果你已經沒有什麼印象的話,就再點進去看看(零基礎學習 Python 之初識迭代)。顯而易見的是,迭代器對象必然是可迭代的,反正則不一定。且 Python 中迭代器對象實現的是 __next__() 方法。
  • 一周學全Python面試基礎(2)
    通過列出30個python面試問題和答案,本文涵蓋在Python面試中經常問到的問題。如果您是該行業的新手,本基礎篇將極大地幫助您。我們衷心希望這篇文章在準備面試時會有所幫助。Python的需求量很大,必須與成千上萬擁有與python技能的申請人競爭,才能在就業市場中找到工作。
  • Python Web 面試總結(二) - Python概念
    中的迭代器與生成器是什麼Python 中的裝飾器是什麼?Python 中的迭代器與生成器是什麼注意是生成器不是生成式.生成器:如果列表元素可以按照某種算法推算出來,那麼就可以在後續循環中不斷推算得出元素, 不必創建完整的list,從而節省大量的內存.