1、什麼是迭代器app
迭代指的是一個重複的過程,每一次重複都是基於上一次的結果而來的ide
# 這裏的循環也是一個迭代,每次基於上一次的結果而取值
li = 'hello' i = 0 while i < len(li): print(li[i]) i += 1
迭代器指的是迭代取值的工具,該工具的特色是能夠不依賴於索引取值函數
2、爲什麼要用迭代器工具
爲了找出一種通用的、能夠不依賴於索引的迭代取值方式spa
3、如何使用迭代器code
可迭代的對象:但凡內置有 __iter__ 方法的對象都稱之爲可迭代的對象對象
如:str、list、tuple、dict、set、文件對象blog
迭代器對象:既內置有 __iter__方法,又內置有 __next__ 方法索引
如:文件對象it
關於 __iter__ 方法:
調用可迭代對象的 __iter__ 會的到一個迭代器對象
調用迭代器對象的 __iter__ 會的到迭代器自己
可迭代對象能夠轉化爲迭代器對象:調用可迭代對象內置的 __iter__ 方法會有一個返回值,該返回值就是對應的迭代器對象
dic = {'x':1, 'y':2, 'z':3} iter_dic = dic.__iter__() print(iter_dic) res1 = iter_dic.__next__() print(res1) res2 = iter_dic.__next__() print(res2) res3 = iter_dic.__next__() print(res3) # 每次取一個值, 取完了沒有就會報錯
res4 = iter_dic.__next__() print(res4)
dic = {'x':1, 'y':2, 'z':3} # 注意:這樣每次只會取到x,由於每次取值都是從dic去取,不是基於上一次的結果
print(dic.__iter__().__next__()) print(dic.__iter__().__next__()) print(dic.__iter__().__next__())
4、for循環的本質
for循環的本質就是一個迭代器,原理以下:
一、先調用for語句中in後面的值的 __iter__ 方法,獲得迭代器對象
二、執行迭代器 __next__ 方法獲得一個返回值,而後賦值給一個變量,運行循環體代碼
三、循環往復,直到迭代器取值完畢拋出異常,而後捕捉異常自動結束循環
5、生成器
常規定義函數,可是,使用yield語句而不是return語句返回結果。yield語句執行一次返回一個結果
yield關鍵字:只能用在函數內
在函數內但凡包含有yield關鍵字,再去執行函數,就不會馬上運行函數體代碼,會獲得一個返回值,該返回值成之爲生成器對象,生成器本質就是迭代器
總結 yield:
一、提供一種自定義迭代器的解決方案
二、yield可用於返回值,和return相比,相同點是均可以用於返回值,不一樣點是yield能夠暫停函數,能夠返回屢次值,而return只能返回值一次值函數就馬上終止
def func(): # 這是一個簡單的函數
a = 1
return a print(func()) def func(): print('aaaaaaaaaaa') a = 1
yield a # 返回第一個值
print('bbbbbb') yield 12 # 返回第二個值
ret = func() # 得拿到一個生成器 # print(ret) # 返回的是一個地址
print(next(ret)) # 取第一個值
print(next(ret)) # 取第二個值
print(next(ret)) # 取第三個值,會報錯,由於沒有yield第三個值
練習:寫一個功能,在Python3中實現Python2使用range函數的效果
Python2中使用 range 會將結果打印出來,Python3則不會
def my_range(start, stop, step=1): while start < stop: yield start start += step res = my_range(1, 5, 2) # 1 3
next(res) next(res)
補充:
三元表達式:將簡單的 if--else 語句用一條語句完成
x = 10 y = 20
if x > y: res = x else: res = y print(res) # ========================================================================================
x = 10 y = 20 res = x if x > y else y print(res)
列表生成式
names = ['qiu', 'xi', 'qiuxi', 'zhi', 'fei'] l = [] for name in names: if name != 'qiu': res = '%s_1024' %name l.append(res) print(l) # ========================================================================================
l = ['%s_1024' %name for name in names if name != 'qiuxi'] print(l)
字典生成式
items = [('name', 'qiuxi'), ('age', 22), ('sex', 'male')] dic = {} for k, v in items: dic[k] = v print(dic) # ========================================================================================
res = {k: v for k, v in items if k != 'sex'} print(res)
生成器表達式
res=(i**2 for i in range(3)) print(res) print(next(res)) print(next(res)) print(next(res)) print(next(res))