一.迭代器
-
什么是迭代器(iter)
1)迭代器是内容型数据类型。
2)怎么创建迭代器:a.将其他序列转换成迭代器。 b.创建生成器。
3)特点:打印的时候不能查看元素;无法获取元素个数;获取元素的时候必须将元素从迭代器中 取出,而且取出后元素会从迭代器中消失,并且无法再添加。
#创建迭代器 i1 = iter('abc') print(i1) # <str_iterator object at 0x10653ebe0> print(len(i1)) # 报错! i2 = iter([10, 20, 'abc', 30]) print(i2) # <list_iterator object at 0x10705ed60>
-
获取元素
迭代器不管以什么样的方式获取到了它的元素,那么被获取到的元素就会从迭代器中消失。
1)获取单个元素
next(迭代器) - 获取迭代器最前面那个元素。
2)遍历
for 变量 in 迭代器: pass
i1 = iter('abc') print(next(i1)) # 'a' print(next(i1)) # 'b' print(next(i1)) # 'c' # print(next(i1)) # 报错!StopIteration
二.生成器
-
什么是生成器
1)生成器是容器型数据类型,但是生成器中存储的并不是数据,而是产生数据的算法。
2)生成器从获取数据的角度来看还是迭代器。
-
如何创建生成器
调用一个带有yield关键字的函数就可以得到一个生成器对象。
注意:如果被调用的函数中有yield,那么调用函数的时候不会执行函数体,也不会获取返回值,而是得到一 个生成器。
def func1(): yield print('+++') print('---') return 100
-
如何控制生成器元素的个数和值
执行创建生成器函数的函数体的时候,会遇到几次yield,那么对应的生成器就可以创建几个数据,每次遇到yield,yield后面的值就是创建的具体的数据。
def number_gender(): yield 100 yield 200 yield 300 gen1 = number_gender() print(list(gen1)) #[100, 200, 300]
三.装饰器
-
装饰器 = 实参高阶函数 + 返回值高阶函数 +糖语法
-
用来给已经定义好的函数添加功能。
-
添加功能 - 统计函数执行时间
import time #方案一:直接将新增的功能对应代码添加到函数中。 #存在的问题:如果多个函数都要添加相同的时候,需要将新增功能的代码写多遍。 def func1(): start = time.time() print('hello world!') end = time.time() print(f'执行时间:{end - start}') #方案二:直接使用实参高阶函数 def count_time(f): start = time.time() f() end = time.time() print(f'执行时间:{end - start}') #方案三:使用装饰器 def total_time(f): def new_f(*args, **kwargs): start = time.time() result = f(*args, **kwargs) end = time.time() print(f'执行时间:{end - start}') return result return new_f
四.装饰器语法
-
无参装饰器语法
def 装饰器名称(原函数对应的形参): def 新函数名(*args, **kwargs): 原函数返回值 = 原函数(*args, **kwargs) 新增功能 return 原函数返回值 return 新函数名
def 装饰器名称(f): def new_f(*args, **kwargs): result = f(*args, **kwargs) 新增功能 return result return new_f
# 练习:写一个装饰器在函数调用结束后打印'千锋教育' def add_logo(f): # f = func2 def new_f(*args, **kwargs): result = f(*args, **kwargs) print('千锋教育') return result print(new_f) return new_f @add_logo def func1(): print('hello world~') func1() @add_logo def func2(n, m=2): print(n * 2 + m) func2(10, 20) # 练习:写一个装饰器将函数返回值乘以100 # 20 -> 2000 def ride100(f): def new_f(*args, **kwargs): result = f(*args, **kwargs) if type(result) in (int, float): return result * 100 return result return new_f @ride100 def func1(): return 12.3 result = func1() print(f'result:{result}')