Day12_Python三大神器
笔记:
迭代器
- 什么是迭代器
"""
迭代器是容器数据类型(序列)、迭代器无法直接获取所有元素,也不能统计元素个数。
获取迭代器中的元素会导致元素从迭代器中消失。(元素取一个就少一个)
"""
- 创建迭代器
- 创建迭代器只有两种方式:
- 将其他序列转换成迭代器
- 创建生成器
- 获取迭代器中的元素
- 获取单个元素:next(迭代器)
- 遍历:使用for循环进行遍历
生成器
- 生成器
"""
生成器从获取数据和保存特点来看,就是迭代器。
生成器保存数据的本质不是保存数据本身,而是保存生产数据的算法。
"""
- 创建生成器
"""
调用带有yield关键字的函数就可以得到一个生成器
调用带有yield关键字的函数的时候不会执行函数体,也不会
获取函数的返回值,只是单纯的定义一个生成器。
"""
- 确定生成器的元素 - 生成可以创造的数据
"""
一个生成器能产生多少个数据就看这个生成器对应的函数会遇到几次yield。
每次遇到yield的时候yield后面的数据就是产生的数据
"""
- 生成器原理
"""
当通过生成器对象获取元素(不管以什么样的方式获取)的时候,系统会自动执行生成器对应的函数,执行
函数体不会将函数体执行完,每次在执行yield的时候就会停下来,而且将yield后面的数据作为结果返回。
下次再获取元素的是从上次结束的位置开始执行
"""
装饰器
- 什么是装饰器
""
装饰器 = 实参高阶函数 + 返回值高阶函数 + 糖语法 (装饰器的本质是函数)
作用:给已定义好的函数添加功能
"""
import time # 调用time模块
- 无参装饰器的实现方法
"""
装饰器的工作原理:将需要添加功能的函数传给装饰器,装饰器创建一个保留原函数功能并且添加新功能的一个新函数,
将添加完功能的新函数返回,最后用新函数替换原来的函数。
装饰器套路:
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-1)实现f(n)的功能
"""
作业:
- 为函数写一个装饰器,在函数执行之后输出 after
def print_after(fn):
def new_fn(*args, **kwargs):
pass
result = fn(*args, **kwargs)
return print('after')
return new_fn
- 为函数写一个装饰器,把函数的返回值 乘2再返回值
def double(fn):
def new_fn(*args, **kwargs):
pass
result = fn(*args, **kwargs)
if result in [int,float,str,list,tuple]
return result*2
return result
return new_fn
- 写一个装饰器@tag要求满足如下功能:
def tag(fn):
def new_fn(*args, **kwargs):
pass
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 creat_poker():
for x in ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']:
for y in ['♥', '♠', '♣', '♦']:
yield f'{y}{x}'
yield f'POKER'
yield f'poker'
- 使用递归函数画出以下图形:
n = 5
*****
****
***
**
*
n = 4
****
***
**
*
def star(n):
if n == 1:
print('*')
return
else:
print(n * '*')
return star(n - 1)