一篇文章帶你學習Python3的高級特性(2)
1.生成器
# 一邊循環一邊計算的機制,稱為生成器:generator; # 創建generator方法: # 1.把一個列表生成式的[]改成() numsList = [num * num for num in range(10)] print("列表生成式生成numsList:",numsList) numsGenerator = (num * num for num in range(10)) print("生成器生成numsGenerator:",numsGenerator) # 使用next()函數獲得generator的下一個返回值 print("打印numsGenerator第一個元素:",next(numsGenerator)) print("打印numsGenerator第二個元素:",next(numsGenerator)) print("--------------------------------------------------------") # 使用for循環打印generator元素 print("使用循環打印生成器中的元素!") for num in numsGenerator: print(num,end = " ") print("\n") print("--------------------------------------------------------") # 斐波拉契數列(Fibonacci):除第一個和第二個數外,任意一個數均可由前兩個數相加得到 # 1,1,2,3,5,8,13,21,34 def fibonacci(num): n, a, b = 0, 0, 1 while n < num: print(b,end = " ") a, b = b, a + b n = n + 1 return "Done" print("Fibonacci前10項為:") fibonacci(10) print("\n") print("--------------------------------------------------------") # 2.把fibonacci()函數變成generator函數 def fibonacci(num): n, a, b = 0, 0, 1 while n < num: yield b a, b = b, a + b n = n + 1 return "Done" # Tips: # 1.如果一個函數定義中包含yield關鍵字,則這個函數是一個generator函數; # 2.調用一個generator函數將返回一個generator; fib = fibonacci(10) print("fib的值:",fib)
# 結果輸出:
列表生成式生成numsList: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
生成器生成numsGenerator: <generator object <genexpr> at 0x0000028F0E6ACB88>
打印numsGenerator第一個元素: 0
打印numsGenerator第二個元素: 1
——————————————————–
使用循環打印生成器中的元素!
4 9 16 25 36 49 64 81——————————————————–
Fibonacci前10項為:
1 1 2 3 5 8 13 21 34 55——————————————————–
fib的值: <generator object fibonacci at 0x0000028F0E7839A8>
# 普通函數和generator函數的執行流程: # 1.普通函數:順序執行,遇到return語句或最後一行函數語句就返回; # 2.generator函數:在每次調用next()的時候執行,遇到yield語句返回; # 3.再次執行時從上次返回的yield語句處繼續執行; # 實例:定義一個generator函數,依次返回"Willard",18,"Engineer" def willardInfo(): print("STEP1") yield "Willard" print("--------") print("STEP2") yield 18 print("--------") print("STEP3") yield "Engineer" # 調用willardInfo()這個generator函數,先生成一個generator對象 # 然後用next()函數不斷獲得下一個返回值,即可用循環直接打印 willardInfoObject = willardInfo() for willard in willardInfoObject: print(willard)
# 結果輸出:
STEP1
Willard
——–
STEP2
18
——–
STEP3
Engineer
2.迭代器
# 可直接用於for循環的數據類型: # 1.list、tuple、dict、set、str等; # 2.generator,包括:生成器和帶yield的generator function; # 3.可以直接作用於for循環的對象稱為可迭代對象:Iterable; # 4.使用isinstance()判斷一個對象是否為Iterable對象; from collections.abc import Iterable print("判斷list是否為可迭代對象!",isinstance([],Iterable)) print("判斷dict是否為可迭代對象!",isinstance({},Iterable)) print("判斷str是否為可迭代對象!",isinstance("Willard",Iterable)) print("判斷生成式是否為可迭代對象!",isinstance((num for num in range(10)),Iterable)) print("判斷number是否為可迭代對象!",isinstance(99,Iterable))
# 結果輸出:
判斷list是否為可迭代對象! True
判斷dict是否為可迭代對象! True
判斷str是否為可迭代對象! True
判斷生成式是否為可迭代對象! True
判斷number是否為可迭代對象! False
# 可以被next()函數調用並不斷返回下一個值的對象稱為迭代器:Iterator # 使用isinstance()判斷一個對象是否為Iterator對象; from collections.abc import Iterator print("判斷生成器是否為迭代器!",isinstance((num for num in range(10)),Iterator)) print("判斷list是否為迭代器!",isinstance([],Iterator)) print("判斷dict是否為迭代器!",isinstance({},Iterator)) print("判斷str是否為迭代器!",isinstance("Willard",Iterator)) print("----------------------------------------------------------") # Tips: # 1.生成器都是Iterator對象,但list、dict、str是Iterable但不是Iterator; # 2.Iterator對象表示數據流,Iterator對象可以被next()函數調用並不斷返回下一個數據, # 直到沒有數據時拋出StopIteration錯誤;這個數據流可以看作一個有序序列, # 但不能提前知道序列的長度,隻能不斷通過next()函數實現按需計算下一個數據, # Iterator的計算是惰性的,隻有在需要返回下一個數據時才計算; # 3.使用iter()函數把list、dict、str變成Iterator; print("使用iter()函數把list、dict、str變成Iterator.") print("判斷list是否為迭代器!",isinstance(iter([]),Iterator)) print("判斷dict是否為迭代器!",isinstance(iter({}),Iterator)) print("判斷str是否為迭代器!",isinstance(iter("Willard"),Iterator))
# 結果輸出:
判斷生成器是否為迭代器! True
判斷list是否為迭代器! False
判斷dict是否為迭代器! False
判斷str是否為迭代器! False
———————————————————-
使用iter()函數把list、dict、str變成Iterator.
判斷list是否為迭代器! True
判斷dict是否為迭代器! True
判斷str是否為迭代器! True
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- 一篇文章帶你學習Python3的高級特性(1)
- Python淺析迭代器Iterator的使用
- Python生成器與迭代器詳情
- Python高級特性之切片迭代列表生成式及生成器詳解
- Python元類與迭代器生成器案例詳解