总结
-
迭代器
-
什么是迭代器( iter)
-
''' 迭代器是个容器类型数据(序列) 迭代器无法直接获取所有元素,也无法统计所有元素的个数 获取迭代器的元素会导致在各个元素从迭代器中消失.(元素取一个少一个) '''
-
# 2)创建迭代器 # 创建迭代器的两种方法:1)将其他序列转换成迭代器 2) 创建迭代
-
# 3) 迭代器的操作 - 获取迭代器中的元素 # 1) 获取单个元素,next(迭代器) # 2) 遍历 - for x in (itre): print(x)
-
-
生成器
-
''' 生成器从获取数据和保存特点来看,就是迭代器 生成器保存数据的本质不是保存数据的本身,而是保存产生数据的算法 '''
-
创建生成器
-
""" 调用带有yield关键字的函数就可以得到一个生成器。 调用带有yield关键字的函数的时候不会执行函数体,也不会获取函数返回值,只是单纯的创建一个生成器(函数中yield放在哪儿没有关系)。 """
-
-
确定生成器的元素 - 生成器可以创造的数据
-
""" 一个生成器能产生多个数据就看这个生成器对应的函数,执行完函数会遇到几次yield。 每次遇到yield的时候yield后面的数据就是产生的数据 """
-
-
生成器产生数据的原理
-
""" 当通过生成器对象获取元素(不管以什么样的方式获取)的时候,系统会自动执行生成器对应的函数,执行函数的时候不会直接将整个函数执行完, 而且每次在执行yield的时候就会停下来,并且将yield后面的数据作为结果返回。 下次再获取元素的是从上次结束的位置开始执行。 """
-
-
-
装饰器
-
什么是装饰器
-
""" 装饰器 = 实参高阶函数 + 返回值高阶函数 + 糖语法 (装饰器的本质是函数) 作用:给已经定义好的函数添加功能 """
-
-
无参装饰器的实现方法
-
""" 装饰器的工作原理:将需要添加功能的函数传给装饰器,装饰器创建一个保留原函数功能并且添加新功能的一个新的函数, 将添加完功能的新函数返回,最后用新的函数替换原来的函数。 装饰器的套路: def 函数名1(参数1: function): def 函数名2(*args, **kwargs): 添加新的功能 result = 参数1(*args, **kwargs) return result return 函数2 函数名1 - 装饰器功能对应的名字 参数1 - 类型是function, 指向需要添加功能的原函数,习惯命名成:fn 函数名2 - 指向添加完功能的新函数, 习惯命名成:new_fn def 装饰器名(fn): def new_fn(*args, **kwargs): 新功能 result = fn(*args, **kwargs) # 调用原函数 return result return new_fn """
-
-
-
递归函数
-
''' 在定义函数的时候调用函数本身,这种函数就是递归函数 理论上,循环能做的事情递归都可以做。(能循环实现就不要用递归) 注意:使用递归解决循环问题的时候,内存和cpu的消耗会随着循环次数的增加而不断增加 '''
-
使用递归的套路
-
""" 第一步:找临界值,在临界值的位置结束函数 第二步:找关系,找上一次循环结束的结果和当次循环结束的结果的关系(f(n))和f(n-1)的关系) 第三步:假设函数功能已经实现,通过关系用f(n-1)实现f(n)的功能 """
-
-
作业
-
为函数写一个装饰器,在函数执行之后输出 after
def message_1(fn): def new_fn(*args, **kwargs): result = fn(*args, **kwargs) print('after') return result return new_fn
-
为函数写一个装饰器,把函数的返回值 乘2再返回值
def add_num_2(fn): def new_fn(*args, **kwargs): result = fn(*args, **kwargs) return result * 2 return new_fn
-
写一个装饰器@tag要求满足如下功能:
def tag(fn):
def new_fn(*args, **kwargs):
result = fn(*args, **kwargs)
return f'<p>{result}</p>'
return new_fn
@tag
def render(text):
# 执行其他操作
return text
@tag
def render2():
return 'abc'
print(render('Hello')) # 打印出: <p>Hello</p>
print(render2()) # 打印出: <p>abc</p>
-
写一个创建一副扑克牌的生成器。
def poker(): for x in ['A','2','3','4','5','6','7','8','9','10','j','Q','K']: for y in ['方块','梅花','红桃','黑桃']: yield f'{x}{y}' yield f'big joker' yield f'litter joker' result = poker() set1 = set() set1.update(result) print(set1) print(len(set1))
-
使用递归函数画出以下图形:
n = 5 ***** **** *** ** * n = 4 **** *** ** * def star(n): if n > 1: print(n*'*') star(n-1) else: print('*')