4.迭代器和生成器
4.9迭代所有可能的組合和排列
import itertools
items = ['a', 'b', 'c']
#permutations()接受乙個元素集合,將其中的元素重排列為所有可能的情況,
#並以元組形式返回
for p in itertools.permutations(items):
print(p)
#得到較短長度的全排列,提供乙個可選的長度引數
for p in itertools.permutations(items, 2):
print(p)
#產生組合, 選擇過的元素將從可能的候選元素中移除,即元素不會重複出現
for c in itertools.combinations(items, 3):
print(c)
for c in itertools.combinations(items, 2):
print(c)
for c in itertools.combinations(items, 1):
print(c)
#允許相同的元素得到多次選擇
for c in itertools.combinations_with_replacement(items, 3):
print(c)
4.10以索引-值對的形式迭代序列
'''
迭代乙個序列同時記錄下序列當前處理的元素索引
enumerate()返回enumerate物件例項,是乙個迭代器,返回連續的元組,
元祖由索引和next(iterator)返回的值組成
'''my_list = ['a', 'b', 'c', 'd']
for x in enumerate(my_list):
print(x)
#傳入start引數作為起始索引
for x in enumerate(my_list, 1):
print(x)#(1, 'a')開始
data = [(1, 2), (3, 4), (5, 6), (7, 8)]
#error enumerate例項一次返回兩個值,只能由兩個變數接受分解結果
#for n, x, y in enumerate(data, 1):
#print(n, x, y)
for n, (x, y) in enumerate(data, 1):
print(n, x, y, sep=" ")
4.11同時迭代多個元素
xpts = [1, 5, 4, 2, 10, 7]
ypts = [101, 78, 37, 15, 62, 99]
for x, y in zip(xpts, ypts):
print(x, y)
#zip()建立出乙個迭代器,該迭代器可產生元組。整個迭代的長度和其中最短的輸入序列長度相同
a = [1, 2, 3]
b = ['w', 'x', 'y', 'z']
for i in zip(a, b):
print(i)
#想以長序列為主
from itertools import zip_longest
for i in zip_longest(a, b):
print(i)
#選擇填充元素
for i in zip_longest(a, b, fillvalue=0):
print(i)
#建立字典
print(dict(zip(xpts, ypts)))
print(dict(zip_longest(a, b)))
l = [1, 2, 3]
m = [10, 11]
n = ['x', 'y', 'z']
#迭代多個序列
for i in zip(l, m, n):
print(i)
4.12在不同的容器中進行迭代
'''
對許多物件執行相同操作,但這些物件在不同的容器中
'''from itertools import chain
a = [1, 2, 3, 4]
b = ['x', 'y', 'z']
#chain接受多個序列引數, 不考慮序列型別, 返回迭代器物件
for x in chain(a, b):
print(x)
4.13略
4.14扁平化處理巢狀型序列
from collections import iterable
def flatten(items, ignore_types=(str, bytes)):
for item in items:
if isinstance(item, iterable) and not isinstance(item, ignore_types):
yield from flatten(item)
#相當於
#for x in flatten(item):
#yield x
else:
yield item
items = [1, 2, [3, 4, [5, 6], 7], 8]
for x in flatten(items):
print(x)
4.15合併多個序列,在對整個序列進行迭代
import heapq
a = [1, 4, 7, 10]
b = [2, 5, 6, 11]
#heapq.merge()要求所有輸入序列都是有序的。它不會將所有資料讀取到堆中
#或預先做任何的排序操作,它只檢查每個輸入序列的第乙個元素,將最小的發出去
#再從之前選擇的序列讀取乙個新的元素,再重複執行這個步驟,直到所有序列耗盡
for c in heapq.merge(a, b):
print(c)
4.16用迭代器取代while迴圈
chunksize = 8192
def reader(s):
while true:
data = s.recv(chunksize)
if data == b'':
break
#process_data(data)
def reader(s):
for chunk in iter(lambda :s.recv(chunksize), b''):
#process_data(chunk)
pass
#iter()可以選擇性的接受乙個無參的可呼叫物件以及乙個哨兵(結束)值作為輸入
#iter()會建立乙個迭代器,然後重複呼叫使用者提供的可呼叫物件,直到它返回哨兵值
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...
python cookbook讀書筆記
今天開始讀 python cookbook 書裡有許多python優雅的寫法,可以作為python的一本高階書。以下是我個人的一些筆記 1 遞迴並不是python擅長的 2 關於生成器 generator 乙個函式中需要有乙個yield語句即可將其轉換為乙個生成器。跟普通函式不同的是,生成器只能用於...