一. python中的迭代协议说明
1. 什么是迭代器
迭代器是访问集合内部元素的一种方式,一般用于遍历数据
2. 迭代器和用下标的访问方式不一样,也就是说迭代器是不能返回数据的,迭代器提供了一种惰性方式产生数据
3. 可迭代实质上是由__iter__来实现的
4. 迭代器必须要同时有__iter__和__next__魔法函数
from collections.abc import Iterable, Iterator
a = [1, 2]
print(isinstance(a, Iterable))
print(isinstance(a, Iterator))
输出如下
True
False
说明列表是可迭代的,但不是迭代器
二. 迭代器和可迭代对象的区别
1. 改写上面代码
from collections.abc import Iterable, Iterator
a = [1, 2]
iter_rator = iter(a)
print(type(iter_rator))
print(isinstance(a, Iterable))
print(isinstance(iter_rator, Iterator))
输出如下
<class 'list_iterator'>
True
True
注意:
使用iter()函数就可以把一个列表变成迭代器
我们用for循环进行遍历时,python内部首先会查看类中是否有__iter__魔法函数,如果有就优先调用,它的返回值必须是迭代器类型;
如果没有__iter__,就查找是否有__getitem__魔法函数,它同样可以实现循环遍历
三. 在一个for语句中迭代多个可迭代对象
1. (并行)语文,数学,英语分别存在3个列表中,同时迭代三个列表,计算每个学生的总分
解决方案1:使用zip,将多个可迭代对象合并,每次迭代返回一个元组
chinese = [ 68, 98, 77]
math = [12, 88, 90]
english = [99, 22, 87]
t = []
for s1, s2, s3 in zip(chinese, math, english):
t.append(s1+s2+s3)
解决方案2:使用map,
x = map(lambda s1, s2, s3: s1+s2+s3, chinese, math, english)
list(x)即可输出总分的列表
2. (串行) 一年级3个班,某次考试每班英语成绩分别存在3个列表中,依次迭代每个列表,统计成绩高于90分的人数
解决方法:使用itertools. chain, 把多个列表当作一个列表来使用
from itertools import chain
from random import randint
c1 = [randint(60, 100) for _ in range(20)]
c2 = [randint(60, 100) for _ in range(23)]
c2 = [randint(60, 100) for _ in range(25)]
len([x for x in chain(c1, c2, c3) if x > 90])
四. 生成器函数的使用
函数里只要有yield关键字就是生成器函数,yield返回的是一个生成器对象,可以用for循环来遍历生成器对象里的值
def gen_fun():
yield 1
yield 2
yield 3
x = gen_fun()
for value in x:
print(value)
for循环每一次调用的都是调用生成器对象中的__next__魔法函数
五. 装饰器
装饰器是用来装饰函数的,其实就是一个嵌套函数。
比如3个函数, f1, f2, f3。f1是外部函数;f2是内部函数;f3是f1的参数,会在f2内部执行,一般作为新功能的扩展.
首先定义装饰器如下
def f1(func)
def f2():
print("---正在验证---")
func()
return f2
使用装饰器
@f1
def f3:
pass