迭代器,生成器,装饰器

一. 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
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/regit/p/9881167.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值