# 1. 什么是迭代器(iter) """ 1)迭代器是容器型数据类型 2)怎么创建迭代器:a.将其他序列转换成迭代器 b.创建生成器 3)特点:打印的时候不能查看元素;无法获取元素个数; 获取元素的时候必须将元素从迭代器中取出,取出后元素会从迭代器中消失,并且无法再添加。 """ # 创建迭代器 i1 = iter('abc') print(i1) ## print(len(i1)) # 报错! i2 = iter([10, 20, 'abc', 30]) print(i2) # # 2. 迭代器获取元素 """ 迭代器不管以什么样的方式获取到了它的元素,那么被获取到的元素就会从迭代器中消失。 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 i2 = iter([10, 20, 'abc', 30]) next(i2) for x in i2: print(f'x:{x}') i3 = iter('abc123') result = list(i3) print(result) # ['a', 'b', 'c', '1', '2', '3'] # print(next(i3)) # 报错! StopIteration
# 1. 什么是生成器 """ 1)生成器是容器型数据类型,但是生成器中存储的并不是数据,而是产生数据的算法 2)生成器就是迭代器 """ # 2. 怎么创建生成器 """ 调用一个带有yield关键字的函数就可以得到一个生成器对象。 (如果被调用的函数中有yield,那么调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器) """ def func1(): print('++++') print('----') if False: yield return 100 result = func1() print(f'result:{result}') # 3. 怎么控制生成器元素的个数和值 """ 执行创建生成器函数的函数体的时候,会遇到几次yield,那么对应的生成器就可以创建几个数据; 每次遇到yield,yield后面的值就是创建的具体的数据 """ def number_gender(): # yield 100 # yield 200 # yield 300 for x in range(100, 301, 100): yield x gen1 = number_gender() print(list(gen1)) # [100, 200, 300] # print(next(gen1)) # 报错! StopIteration # 练习:写一个函数可以创建一个生成器,产生这些数据:stu001, stu002, ... stu999 def study_num(): for x in range(1, 1000): yield f'stu{x:0>3}' gen2 = study_num() print(next(gen2)) print(next(gen2)) for _ in range(5): print(next(gen2)) print(next(gen2)) def func2(): print('-----------1-------------') yield 100 print('-----------2-------------') yield 200 print('-----------3-------------') yield 300 gen3 = func2() print(next(gen3)) print(next(gen3))
def func1(): # 获取当前时间 start = time.time() print('hello world!') end = time.time() print(f'执行时间:{end - start}') func1() def func2(a=1, b=2): start = time.time() print(a + b) end = time.time() print(f'执行时间:{end - start}') func2(10, 20) # 方案二:直接使用实参高阶函数 print('-------------------------------------------------------') def func1(): print('hello world!') def func2(a=1, b=2): print(a + b) def func3(): sum1 = 0 for x in range(101): sum1 += x print(sum1) def count_time(f): start = time.time() f() end = time.time() print(f'执行时间:{end - start}') count_time(func1) count_time(func2) count_time(func3) # 方案三:使用装饰器 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 print('-------------------------------------------------------') @total_time def func1(): print('hello world!') @total_time def func2(a=1, b=2): return a + b # @total_time def func3(): sum1 = 0 for x in range(101): sum1 += x print(sum1) func1() result = func2(10, 20) print(f'result:{result}') func3()
# 1. 无参装饰器语法 """ 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}')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)