python cookbook 迭代器與生成器

2022-07-27 16:00:24 字數 4023 閱讀 9360

**迭代

a = [1, 2, 3]

fori in iter(a):

print(i)

fori in a.__iter__():

print(i)

這裡的兩個方法是一樣的,呼叫iter()其實就是簡單的呼叫了物件的__iter__()方法。

使用生成器建立新的迭代器

def frange(start, stop, increment):

x =start

while x yield x

x +=increment

for n in frange(0, 4, 0.5):

print(n)

print(list(frange(0, 4, 0.5)))

看下面這個

>>>def countdown (n):

... print ('starting to count from', n)

...

while n > 0:

... yield n

... n -= 1... print ('done!')

...>>> c = countdown(3)

>>>c

>>>next(c)

starting to count from 3

3>>>next(c)

2>>>next(c)

1>>>next(c)

done!traceback (most recent call last):

file "", line 1, in < module >stopiteration

乙個生成器函式主要特徵是它只會回應在迭代中使用到的 next 操作。 一旦生成器函式返回退出,迭代終止。我們在迭代中通常使用的for語句會自動處理這些細節,所以你無需擔心。

def frange(start, stop, increment):

x =start

while x yield

x x +=increment

for n in frange(0, 4, 0.5

): print(n)

print(list(frange(

0, 4, 0.5)))

反向迭代

a = [1, 2, 3, 4]

for x in

reversed(a):

print(x, end='

')

主要想說的是,物件重寫__reversed__()方法即可呼叫reversed()進行反向迭代

itertools的一些使用

def

count(n):

while

true:

yield

n n += 1c =count(0)

import

itertools

for x in itertools.islice(c, 10, 20):

print(x, end="")

with open(

'test.txt

') as f:

for line in

f:

print(line, end='')

print(format('

開始部分的注釋不顯示

', '

*>30'))

with open(

'test.txt

') as f:

for line in itertools.dropwhile(lambda line: line.startswith('#'

), f):

print(line, end=''

)

items = ['

a', '

b', 'c'

] #items的所有可能組合,不包含相同元素

for p in

itertools.permutations(items):

print(p, end='')

print

()

#指定長度的所有排序

for p in itertools.permutations(items, 2):

print(p, end='

')

如果遇到一些複雜的迭代器的使用,可以先看看itertools裡有沒有可用的方法。

同時迭代多個序列

a = [1, 2, 3]

b = ['

w', '

x', '

y', 'z'

] for i in

zip(a,b):

print

(i)輸出:

(1, 'w')

(2, 'x')

(3, 'y')

for i in

itertools.zip_longest(a, b):

print(i)

輸出:(1, 'w')

(2, 'x')

(3, 'y')

(none, 'z')

不同序列上的迭代

import

itertools

a = [1, 2, 3, 4]

b = ['

x', '

y', 'z'

] for x in

itertools.chain(a, b):

print(x)

這樣比 a + b 在進行迭代要好很多

展開巢狀的序列

from collections import

iterable

def flattern(items, ignore_types=(str, bytes)):

for x in

items:

if isinstance(x, iterable) and

notisinstance(x, ignore_types):

yield

from

flattern(x)

else

:

yield

x items = [1, 2, [3, 4, [5, '

hello world

'], 7], 8]

for x in

flattern(items):

print(x, end='

')

def count(n):    while true:      yield n      n += 1  c = count(0)  import itertools  for x in itertools.islice(c, 10, 20):    print(x, end=" ")      with open('test.txt') as f:    for line in f:      print(line, end='')  print(format('開始部分的注釋不顯示', '*>30'))  with open('test.txt') as f:    for line in itertools.dropwhile(lambda line: line.startswith('#'), f):      print(line, end='')        items = ['a', 'b', 'c']  #items的所有可能組合,不包含相同元素  for p in itertools.permutations(items):    print(p, end=' ')  print()  #指定長度的所有排序  for p in itertools.permutations(items, 2):    print(p, end=' ')

Python Cookbook學習記錄

4.迭代器和生成器 4.9迭代所有可能的組合和排列 import itertools items a b c permutations 接受乙個元素集合,將其中的元素重排列為所有可能的情況,並以元組形式返回 for p in itertools.permutations items print p ...

python cookbook學習筆記十一

csv檔案讀取 csv檔案格式如下 分別有2行三列。訪問 如下 f open r e py prj test.csv rb f csv csv.reader f forf inf csv printf 在這裡f是乙個元組,為了訪問某個字段,需要用索引來訪問對應的值,如f 0 訪問的是first,f ...

每天學點Python Cookbook(四)

任務 尋找上乙個星期五的日期。解決方案 通過python標準庫的datetime模組,可以快速完成此任務。import datetime,calendar def find last friday last friday datetime.date.today oneday datetime.tim...