**迭代
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的一些使用
defcount(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='')
()
#指定長度的所有排序
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):
(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')
不同序列上的迭代
importitertools
a = [1, 2, 3, 4]
b = ['
x', '
y', 'z'
] for x in
itertools.chain(a, b):
print(x)
這樣比 a + b 在進行迭代要好很多
展開巢狀的序列
from collections importiterable
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...