迭代器、生成器与装饰器

三大神器:迭代器、生成器与装饰器

迭代器(iter)

怎么创建迭代器

方式一:通过iter将其他序列转换成迭代器

# 语法:
iter(序列)

方式二:创建生成器对象(生成器可以看成是一种特殊的迭代器)

什么是迭代器

1.打印迭代器的时候无法打印里面的元素;迭代器不支持len操作

iter1 = iter('abc')
print(iter1)  #  <str_iterator object at 0x00000187A1825E20>
# print(len(iter1))   # 报错 TypeError: object of type 'str_iterator' has no len()

2.迭代器是容器型数据类型,可以同时保存多个数据;可以被遍历;也可以转换成列表和元组
3.如果需要迭代器中的元素,必须将元素从迭代器中取出,而且一旦取出元素,这个元素在迭代器中就不存在了并且无法添加

# 获取迭代器中的元素
# 迭代器不管以什么样的方式获取到了它的元素,那么被获取到的元素就会从迭代器中消失。
	#	例如:类型转换,获取单个元素,遍历
# 1)获取单个元素:next(迭代器)
iter1 = iter('abc')
print(next(iter1))	 #  'a'
print(next(iter1))   #  'b'
print(next(iter1))   #  'c'
# print(next(iter1))	# 报错 StopIteration
# 2)遍历:for 变量 in 迭代器:
iter1 = iter('abc')
for i in iter1:
    print(i,end='|')  # a|b|c|

生成器(generator)

生成器是具备能够产生多个数据能力的一种容器
生成器是容器型数据类型,但是生成器中存储的并不是数据,而是产生数据的算法
生成器在获取数据的时候和迭代器一样

怎么创建生成器

调用一个带有yield关键字的函数就可以得到一个生成器对象
注意:(如果一个函数中有yield,那么这个函数在调用的时候不会执行函数体,也不会获取返回值,而是得到一个生成器)

# 语法:
def func()
    pass
    yield	#	只要存在于函数内不管位置
a = func()	# 调用func时产生一个生成器a

控制生成器产生数据的能力

执行生成器对应的函数会遇到几次yield这个生成器就能产生多个数据,每次遇到yield的时候,yield后面值就是对应可以产生的数据

def func()
	for i in range(10):
		yield i
a = func()
for i in a:
	print(i,end='-')  # 0-1-2-3-4-5-6-7-8-9-

def func()
	for i in range(10):
		if i%2:
			yield i
a = func()
for i in a:
	print(i,end='-')  # 1-3-5-7-9-

# 练习:写一个函数可以创建一个生成器,产生这些数据:stu001, stu002, ... stu999
def func():
    for i in range(1,1000):
        yield 'stu'+str(i).zfill(3)
        #	yield f'stu{i:0>3}'


a = func()
for i in a:
    print(i, end='-') # stu001-stu002- ... -stu999-

生成器产生数据原理

在通过生成器对象获取数据的时候,程序才会执行生成器对应的函数,每次只执行到yield就会停止,将yield后面的数据作为这次获取到的数据,记录结束位置,下一次获取数据的时候从上一次结束的位置开始执行

装饰器

装饰器=实参高级函数+返回值高阶函数+糖语法
装饰器是用来给已经定义好的函数添加功能的

装饰器语法

# 1.无参装饰器
def 装饰器名称(原函数对应的形参):
	def 新函数名(*args,**kwargs):
		原函数返回值 = 原函数(*args,**kwargs)
		新增功能
		return 原函数返回值
	return 新函数

# 2.有参装饰器
from functools import wraps
def 装饰器名称(参数):
    def 函数(原函数对应的形参):
    	@wraps(原函数) # 接受一个函数来进行装饰,并加入了复制函数名称、注释文档、参数列表等等的功能。这可以让我们在装饰器里面访问在装饰之前的函数的属性。
        def 新函数名(*args,**kwargs):
            原函数返回值 = 原函数(*args,**kwargs)
            新增功能
            return 原函数返回值
        return 新函数
    return 函数
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值