Python基础——迭代器、装饰器、生成器

一、迭代器

迭代概念:

是访问集合元素的一种方式,按照某种顺序逐个访问集合中的每一项。

可迭代对象: 能够被迭代的对象,称为可迭代对象。
判定依据: 能作用于for in。
判定方法:
import collections
Isinstance(obj, collections.Iterable)
在这里插入图片描述
迭代器: 是可以记录遍历位置的对象,从第一个元素开始,往后通过next()函数进行遍历,只能往后,不能往前。
判定依据: 能作用于for in
判定方法: import collections
Isinstance(obj, collections.Iterator)
注意: 迭代器也是可迭代对象,所以也可以作用于for in
在这里插入图片描述
迭代器的优势:

  1. 仅仅在迭代到某个元素时,才处理该元素,在此之前,元素可以不存在。在此之后,元素可以被销毁,特别适合用于遍历一些巨大的或是无限的集合
  2. 提供了一个统一的访问集合的接口,可以把所有的可迭代对象,转换成迭代器进行使用。Iter(Iterable)
    迭代器的简单使用:
  3. 使用next()函数,从迭代器中取出下一个对象,从元素1 开始
  4. 可以直接作用与for in,内部会自动调用迭代器对象的next(),会自动处理迭代完毕的错误

迭代器注意事项:
1.如果取出完毕,再继续取,则会报错:StopIteration。
2.迭代器一般不能多次迭代。

二、装饰器

补充

偏函数:

创建一个新函数,指定我们要使用的函数的某个参数,为某个固定的值,这个新函数就是“偏函数”。
在这里插入图片描述
其他方式创建偏函数: import functools
在这里插入图片描述

高阶函数:

当一个函数A的参数,接收的又是另一个函数时,把这个函数A称为时高阶函数。比如sorted函数(排序)
在这里插入图片描述
使用案例: 动态计算两个数据
在这里插入图片描述

匿名函数:

也称为“lambda函数”
语法: lambda 参数1,参数2…:表达式,只能写一个表达式,不能用return,表达式结果就是返回值,只适用于一些简单的操作。
在这里插入图片描述

闭包:

在函数嵌套的前提下,内层函数引用了外层函数的变量(包括参数),外层函数又把内层函数当做返回值进行返回。这个内层函数+所引用的外层变量,称为“闭包”
在这里插入图片描述
注意事项:

  1. 闭包中,如果要修改引用的外部变量,需要使用nonlocal变量声明,否则当做是比包内,新定义的变量。
  2. 当闭包内,引用了一个,后期会发生变化的变量,一定要注意。

装饰器:

在函数名以及函数体不改变的前提下,给下一个函数附加一些额外代码。
开放封闭原则: 已经写好的代码尽可能不修改,如果想要新增功能,在原先代码的基础上,单独进行扩展。
装饰器: 语法糖,执行时间是立即执行。装饰器可以实现函数名不发生改变,函数体内部的代码不会发生改变。
在这里插入图片描述

生成器:

是一个特殊的迭代器,拥有迭代器的特性:惰性计算数据,节省内存,能够记录状态,并通过next()函数,访问下一个状态,具备可迭代特性。

创建方法:
生成器表达式:把别列表推导式[]改成()
在这里插入图片描述
生成器函数: 函数中包含yield语句,函数的执行结果就是生成器
在这里插入图片描述
产生数据的方式:
next()函数 等价于 生成器.next()
for in
send()方法 : send()方法有一个参数,指定的时上一次被刮起的yield语句的返回值,相比生成器.next(),可以额外给yield语句传值,注意第一次调用d.send(None)
在这里插入图片描述
在这里插入图片描述
生成器关闭:
在这里插入图片描述

注意事项: 如果碰到return,会直接终止,跑出StopIteration异常提示,生成器只会遍历一次
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值