1 迭代器(iter)
1)迭代器是容器型数据类型
2)如何创建迭代器:a.将其他序列转化成迭代器;b.创建生成器
3)特点:打印时不能查看元素;无法获取元素个数;获取元素的时候必须将元素从迭代器中取出,取出后元素会从迭代器中消失,并且无法再添加
#创建迭代器
i1=iter('abc')
print(i1) #<str_iterator object at 0x00000195F695C128>
print(len(i1)) #报错!
1.1 迭代器获取元素
注释:迭代器不管以什么方式获取到了它的元素,那么被获取到的元素就会从迭代器中消失
1)获取单个元素
next(迭代器) ——获取迭代器最前面那个元素
i1=iter('abc')
print(next(i1)) #'a'
print(next(i1)) #'b'
print(next(i1)) #'c'
print(next(i1)) #报错!
2)遍历
for 变量 in 迭代器
pass
i2=iter([1,2,'s',5])
next(i2)
for x in i2:
print(f'x:{x}') # x:2 x:s x:5
i3=iter('abc123')
result=list(i3)
print(result) #['a', 'b', 'c', '1', '2', '3']
print(next(i3)) #报错! StopIteration
2 生成器
2.1 定义
1)生成器是容器型数据类型,但是生成器中存储的并不是数据,而是产生数据的算法
2)生成器就是(从获取数据的角度来看还是)迭代器
2.2 创建生成器
1)调用一个带有yield关键字的函数就可以得到一个生成器对象
注意:如果被调用的函数中有yield,那么调用函数的时候就不会执行函数体,也不会获取函数返回值,而是得到一个生成器
def func1():
print('+++')
print('---')
yield
return 100
print(func1()) #<generator object func1 at 0x000001EE07144138>
2)控制生成器元素的个数和值
执行创建生成器函数的函数体时,会遇到几次yield,那么对应的生成器就可以创建几个数据;每次遇到yield,yield后面的值就是创建的具体的数据
def num_gender():
yield 10
yield 20
yield 30
------------------
for x in range(10,31,10)
gen1=num_gender()
print(list(gen1)) #[10, 20, 30]
print(next(gen1)) #报错! StopIteration
# 练习:写一个函数可以创建一个生成器,产生这些数据:stu001, stu002, ... stu099
def get_nums():
for i in range(1,100):
yield 'stu'+f'{i:0>3}'
nums1=get_nums()
print(list(nums1)) #['stu001', 'stu002', 'stu003', 'stu004', 'stu005',...]
3 装饰器
3.1 定义
1)装饰器=实参高阶函数+返回值高阶函数+糖语法
2)装饰器是用来给已经定义好的函数添加功能的
import time
def func1():
#获取时间
start=time.time()
print('hello world')
end=time.time()
print(f'执行时间:{end-start}')
func1()
3.2 无参装饰器
def 装饰器名称(原函数对应的形参):
def 新函数名(*args,**kwargs):
原函数返回值=原函数(*args,**kwargs)
新增功能
return 原函数返回值
return 新函数名
def 装饰器名称(f):
def new_f(*args,**kwargs):
result=f(*args,**kwargs)
新增功能
return result
return new_f
#原数据乘于100
def add_logp(f):
def new_f(*args,**kwargs):
result=f(*args,**kwargs)
if type(result) in(int,float):
return result*100
return result
return new_f
@ add_logp
def func1(n):
print (n+1)
return (n+1)
r=func1(2)
print(r)