生成器與迭代器
生成器generator
定義:在Python中,這種一邊回圈一邊計算的機制,稱為生成器:generator,
1.生成器函式
生成器函式 ——本質上就是我們自己寫的函式
只要含有yield關鍵字的函式都是生成器函式,yield不能和return共用且需要寫在函式內
def generator():
print(a)
yield 1
ret=generator()
#生成器函式 : 執行之后會得到一個生成器作為回傳值
print(ret)
def generator():
print(1)
yield 'a'
print(2)
yield 'b'
yield 'c'
g = generator()
for i in g:
print(i)
ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)
2.串列推到式與字典推導式
串列推導式
語法[結果,for回圈 條件篩選]
需求:要求把串列[0,1,2,3,4,5,6,7,8,9]里的每個值加1
這里可以用串列生成式搞定
lst=[i+1 for i in range(10)]
print(lst)
字典推導式
lst=[11,22,33,44]
dic={i:lst[i] for i in range(len(lst))}
print(dic)
輸出
{0: 11, 1: 22, 2: 33, 3: 44}
生成器運算式
g=(x+1 for x in range(10))
print(g)
輸出
<generator object <genexpr> at 0x00000223B825C890>#生成器記憶體地址
其實就是把串列生成式的[]改成(),就創建了一個生成器
迭代器
l = [1,2,3]
索引
回圈 for
for i in l:
pass
for k in dic:
pass
'''list
dic
str
set
tuple'''
f = open()
range()
enumerate
print(dir([])) #告訴我串列擁有的所有方法
ret = set(dir([]))&set(dir({}))&set(dir(''))&set(dir(range(10)))
print(ret) #iterable
print('__iter__' in dir(int))
print('__iter__' in dir(bool))
print('__iter__' in dir(list))
print('__iter__' in dir(dict))
print('__iter__' in dir(set))
print('__iter__' in dir(tuple))
print('__iter__' in dir(enumerate([])))
print('__iter__' in dir(range(1)))
只要是能被for回圈的資料型別 就一定擁有__iter__方法
print([].__iter__())
一個串列執行了__iter__()之后的回傳值就是一個迭代器
print(dir([]))
print(dir([].__iter__()))
print(set(dir([].__iter__())) - set(dir([])))
print([1,'a','bbb'].__iter__().__length_hint__()) #元素個數
l = [1,2,3]
iterator = l.__iter__()
print(iterator.__next__())
print(iterator.__next__())
print(iterator.__next__())
print(iterator.__next__())
Iterable 可迭代的 -- > iter #只要含有__iter__方法的都是可迭代的
[].iter() 迭代器 -- > next #通過next就可以從迭代器中一個一個的取值
只要含有__iter__方法的都是可迭代的 —— 可迭代協議
print('__iter__' in dir( [].__iter__()))
print('__next__' in dir( [].__iter__()))
from collections import Iterable
from collections import Iterator
print(isinstance([],Iterator))
print(isinstance([],Iterable))
class A:
def __iter__(self):
pass
def __next__(self):
pass
a = A()
print(isinstance(a,Iterator))
print(isinstance(a,Iterable))
l = [1,2,3,4]
for i in l.__iter__():
print(i)
迭代器的概念iteration
迭代器協議 —— 內部含有__next__和__iter__方法的就是迭代器
迭代器協議和可迭代協議
可以被for回圈的都是可迭代的
可迭代的內部都有__iter__方法
只要是迭代器 一定可迭代
可迭代的.iter()方法就可以得到一個迭代器
迭代器中的__next__()方法可以一個一個的獲取值
for回圈其實就是在使用迭代器
iterator:可迭代物件
直接給你記憶體地址
print([].__iter__())
print(range(10))
只有是可迭代物件的時候才能用for
當我們遇到一個新的變數,不確定能不能for回圈的時候,就判斷它是否可迭代
for i in l:
pass
iterator = l.__iter__()
iterator.__next__()
迭代器的好處:
1.從容器型別中一個一個的取值,會把所有的值都取到,
2.節省記憶體空間
#迭代器并不會在記憶體中再占用一大塊記憶體,
# 而是隨著回圈 每次生成一個
# 每次next每次給我一個
l = [1,2,3,45]
iterator = l.__iter__()
while True:
print(iterator.__next__())
print(range(100000000000000))
print(range(3))
print(list(range(3)))
def func():
for i in range(2000000):
i = 'python%s'%i
return i
func()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/114460.html
標籤:Python
上一篇:Gin框架 - 資料系結和驗證
下一篇:Python基礎-字串
