Python3 7學習筆記24 迭代器與生成器

2021-10-05 21:18:10 字數 3890 閱讀 2735

python3.7學習筆記24-迭代器

容器

可迭代的物件

迭代器可迭代物件通過iter()函式返回乙個迭代器,在通過next()函式就可以實現遍歷。我們之前學習的for in 其實把這個過程隱式化了。它的原理就是這樣的。

如下演示的是乙個列表的迭代過程

data = [1,2,3,4]

die_dai_qi = iter(data) # 建立乙個迭代器 迭代的物件是乙個列表

print(next(die_dai_qi)) # 每次只迭代乙個元素

print(next(die_dai_qi))

print(next(die_dai_qi))

print(next(die_dai_qi))

print(next(die_dai_qi)) # 當元素迭代完成 迭代器結束 再次迭代報錯

/usr/local/bin/python3.7 /users/zhonglinglong/pycharmprojects/whole_world/臨時檔案.py

traceback (most recent call last):

file "/users/zhonglinglong/pycharmprojects/whole_world/臨時檔案.py", line 18, in print(next(die_dai_qi))

stopiteration12

34process finished with exit code 1

如下演示的是迭代乙個類的過程

class demo:

def __iter__(self):

self.a = 1

return self

def __next__(self):

x = self.a

self.a += 1

return x

die_dai_qi = iter(demo())

print(next(die_dai_qi))

print(next(die_dai_qi))

print(next(die_dai_qi))

print(next(die_dai_qi))

print(next(die_dai_qi))

print(next(die_dai_qi))

print(next(die_dai_qi))

生成器其實是一種特殊的迭代器。它的本質就是乙個返回迭代器的函式 。

# 顯示當前 python 程式占用的記憶體大小

def show_memory_info(hint):

pid = os.getpid()

p = psutil.process(pid)

info = p.memory_full_info()

memory = info.uss / 1024. / 1024

print('{} 程式占用記憶體: {} mb'.format(hint, memory))

def test_iterator():

show_memory_info('未生成迭代器之前占用的記憶體')

list_1 = [i for i in range(10000)]

show_memory_info('使用迭代器之後占用的記憶體')

print(sum(iter(list_1)))

show_memory_info('求和之後占用的記憶體')

def test_generator():

show_memory_info('未生成生代器之前占用的記憶體')

list_2 = (i for i in range(10000))

show_memory_info('生成生代器之後占用的記憶體')

print(sum(list_2))

show_memory_info('求和之後占用的記憶體')

test_iterator()

test_generator()

/usr/local/bin/python3.7 /users/zhonglinglong/pycharmprojects/whole_world/臨時檔案.py

未生成迭代器之前占用的記憶體 程式占用記憶體: 47.8984375 mb

使用迭代器之後占用的記憶體 程式占用記憶體: 48.234375 mb

49995000

求和之後占用的記憶體 程式占用記憶體: 48.234375 mb

未生成生代器之前占用的記憶體 程式占用記憶體: 48.234375 mb

生成生代器之後占用的記憶體 程式占用記憶體: 48.234375 mb

49995000

求和之後占用的記憶體 程式占用記憶體: 48.234375 mb

process finished with exit code 0

def generator(k):

i = 1

while true:

yield i ** k

i += 1

gen_1 = generator(1)

gen_3 = generator(3)

print(gen_1)

print(gen_3)

def get_sum(n):

sum_1, sum_3 = 0, 0

for i in range(n):

next_1 = next(gen_1)

next_3 = next(gen_3)

print('next_1 = {}, next_3 = {}'.format(next_1, next_3))

sum_1 += next_1

sum_3 += next_3

print(sum_1 * sum_1, sum_3)

get_sum(8)

/usr/local/bin/python3.7 /users/zhonglinglong/pycharmprojects/whole_world/臨時檔案.py

next_1 = 1, next_3 = 1

next_1 = 2, next_3 = 8

next_1 = 3, next_3 = 27

next_1 = 4, next_3 = 64

next_1 = 5, next_3 = 125

next_1 = 6, next_3 = 216

next_1 = 7, next_3 = 343

next_1 = 8, next_3 = 512

1296 1296

process finished with exit code 0

綜述對比迭代器和生成器。

給乙個列表,和值。求值在列表中的下標。如下演示**通過正常寫法和用生成器的寫法(要注意的是。生成器返回的是乙個物件。要list轉化成列表) 

def index_normal(l, target):

result =

for i, num in enumerate(l):

if num == target:

return result

print(index_normal([1, 6, 2, 4, 5, 2, 8, 6, 3, 2], 2))

def index_generator(l, target):

for i, num in enumerate(l): # 把可迭代的序列組合成索引和值。類似於字典的item

if num == target:

yield i # 條件滿足的時候生成器追加乙個元素

print(list(index_generator([1, 6, 2, 4, 5, 2, 8, 6, 3, 2], 2)))

Python3 7學習筆記25 裝飾器

python3.7學習筆記25 裝飾器 我們在之前的學習中其實接觸過很多的裝飾器。它本質其實就是乙個函式。def demo7 func print 模擬裝飾器 func def demo8 print 簡單裝飾器的應用 test demo7 demo8 test usr local bin pyth...

Python3 7學習筆記03 輸入與輸出

python3.7學習筆記03 輸入與輸出。本文輸出。是指列印在編輯器的控制台。輸入是指在控制台上輸入值來執行程式 print 單行列印 print 列印1 列印2 3 for i in range 5 print i,end d python3.7 python3.exe d pythonproj...

python3 7學習之判斷閏年

閏年分為普通閏年和世紀閏年。普通閏年 能被4整除但不能被100整除的年份為普通閏年。如2004年就是閏年,1900年不是閏年 世紀閏年 能被400整除的為世紀閏年。如2000年是世紀閏年,1900年不是世紀閏年 用if語句巢狀實現 year int input 輸入乙個年份 if year 4 0 ...