Python Cookbook學習記錄

2021-09-27 03:32:39 字數 3435 閱讀 3326

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語句即可將其轉換為乙個生成器。跟普通函式不同的是,生成器只能用於...