总结
-
迭代器(iter)
- 迭代器是容器型数据类型,获取迭代器的元素,会导致这个元素从迭代器中小时,元素取一个就少一个,有用的点:元素取一个就少一个
- 迭代器产生:1)将其他序列转换成迭代器; 2)创建生成器
- 获取迭代器中的元素:
- 获取单个: next(迭代器 ) ---- 在空的迭代器中获取会报错
- 遍历
-
生成器
- 生成器保存数据的本质不是保存数据本身,而是保存产生数据的算法
- 创建生成器
- 调用带有yield关键字的函数,就可以得到一个生成器
- 调用带yield关键字函数的时候不会执行函数体,也不会获取函数返回值,只是单纯的创建一个生成器
- 一个生成器能产生多少数据,取决于执行函数的过程中会遇到几次yield,每次遇到yield的时候,yield后面的数就是产生的数据
- 当通过生成器对象获取元素时,系统会自动执行生成器对应的函数,执行函数的时候不会直接将整个函数执行完,而是每次在执行yield的时候就会停下来,并且将yield的数据作为结果返回,下次再获取元素就从上次结束的为止开始执行.
-
装饰器
- 装饰器=实参高阶函数+返回值高阶函数+糖语法
- 作用:给已经定义好的函数添加功能
def 装饰器名称(fn):
def new_fn(*args,**kwargs):
新功能
result = fn(*args,**kwargs) # 调用原函数
return result
return new_fn
-
递归函数
-
在定义函数的时候调用函数本身
-
循环能做的事情,递归都能做.但实际上能用循环做的事情,绝不用递归
-
使用递归解决问题时:内存的消耗会随着循环次数的增加而不断增加
-
使用递归的套路:
第一步:找临界值,在临界值的位置让函数结束,n至少取
第二步:找关系,找上一次循环结束的结果和当次循环结束的结果的关系
第三步:假设函数功能已经实现,通过关系用f(n-1)实现f(n)的功能
-
- 为函数写一个装饰器,在函数执行之后输出 after
def inpute_after(fn):
def new_fn(*args, **kwargs):
result = fn(*args, **kwargs)
print('after')
return result
return new_fn
@inpute_after
def func1():
return 10
- 为函数写一个装饰器,把函数的返回值 乘2再返回值
def return_2(fn):
def new_return_2(*args, **kargs):
result = fn(*args, **kargs)
return result * 2
return new_return_2
@return_2
def func3():
return 20
- 写一个装饰器@tag要求满足如下功能:
@tag
def render(text):
# 执行其他操作
return text
@tag
def render2():
return 'abc'
print(render('Hello')) # 打印出: <p>Hello</p>
print(render2()) # 打印出: <p>abc</p>
def tag(fn):
def new_tag(*args, **kargs):
result = fn(*args, **kargs)
return '<p>'+result+'</p>'
return new_tag
@tag
def render2():
return 'abc'
print(render2())
- 写一个创建一副扑克牌的生成器。
def squeezer():
flower = ['红桃', '梅花', '黑桃', '方块']
num = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
kings = ['大王', '小王']
for y in flower:
for x in num:
yield y+x
yield '大王'
yield '小王'
-
使用递归函数画出以下图形:
n = 5 ***** **** *** ** * n = 4 **** *** ** * def func3(x): if x > 1: print('*' * x) func3(x - 1) else: print('*') return