Python Cookbook学习记录

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()会创建一个迭代器,然后重复调用用户提供的可调用对象,直到它返回哨兵值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值