Python的迭代器與生成器

2022-06-04 01:12:11 字數 2134 閱讀 3504

宣告:迭代器和生成器、裝飾器,兩者之間沒有直連關係。

迭代和遞迴的概念請參考:

雙下方法:雙下劃線的方法,如__name__();由c語言編寫的,不止一種呼叫方式;

iterable(可迭代):擁有__iter__()方法的資料型別 --> 可迭代協議

iterator(迭代器):擁有__iter__()方法和__next__()方法 --> 迭代器協議

能夠被for迴圈操作的資料型別都屬於可迭代型別(即__iter__()方法);

可迭代資料型別加入__iter__()方法則可以將乙個可迭代物件變成乙個迭代器。(這裡為什麼不是加入__next__()方法我到現在沒想明白)

print

(dir())

#dir():返回指定引數可使用的方法

print([1].__add__([2]))

print([1]+([2]))

#其實『+』 就是在呼叫__add__()方法,雙下方法一般不直接呼叫。

print('

__iter__

'in dir(123))

print('

__iter__

'in dir('

123'))#

判斷數字和字串中是否有可迭代方法

from collections import

iterable

from collections import

iterator

print

(isinstance(,iterator))

print

(isinstance(,iterable))

#簡單做乙個判斷,判斷迭代協議與可迭代協議的真實性

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)

注意:生成器每次只去一次值,沒取完的值也不會消失,在後續可以繼續呼叫

send使用

#

生成器函式高階之send使用

deffunc1():

print('

line1')

line = yield 1

print(line,'

sendline')

print('

line2')

yield 2f =func1()

ret = f.__next__

()print

(ret)

ret = f.send( '

one'

)print(ret)

列表推導式

#

語法 [迴圈值 迴圈體 判斷(判斷語句可不寫)]

list = [i for i in range(30) if i%3 ==0]

print(list)

生成器表示式

#格式#

(迴圈值 迴圈體)

list = (i for i in range(10))

for i in

list:

print(i)

字典推導式

#

將乙個字典的key和value對調

mcase =

mcase_frequency =

print(mcase_frequency)

集合推導式

#

集合推導式和列表推導式差不多,多乙個去重功能

squared =

print(squared)

Python生成器與迭代器

生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...

python 迭代器與生成器

迭代器和生成器 print 1 in 1,2,3 print 1 not in 1,2,3 print 4 in print 4 not in 1,2,3 print x not in dlkjfxfei 可迭代物件 iterable 可以被next 函式呼叫並不斷返回下乙個值 知道沒有資料時丟擲s...

Python 迭代器與生成器

一 迭代器 理解迭代器需要搞清楚容器 container 迭代器協議 可迭代物件 iterable 迭代器 iterator 生成器 generator 1 容器 container 容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in,not in關鍵字判斷元素是否...