目录
一、闭包函数
二、装饰器
装饰器: 装饰的工具(函数),这个函数有装饰的作用.可以理解为装饰器就是一个函数的加工厂
装饰器本质: 装饰器 就是一个函数A,装饰的对象 也就是一个函数B。
装饰器的实现必须遵循两大原则:
- 不改变函数B的调用方式
- 不改变函数B的源代码
2.1 双层装饰器
模板:
# 双层装饰器模板
def outer(func): # 函数对象形参
def inner(*args, **kwargs): # 函数形参
# 加功能
print(f"这里是函数参数args:{args}, kwargs:{kwargs}")
res = func(*args, **kwargs) # 解压缩 func是被装饰的函数 函数实参
return res
return inner
2.2 三层装饰器
模板:
# 三层装饰器模板: 给双层装饰器加参数的
def outer(engine): # 给装饰器传参
def inner(func): # func是真正的功能函数
def wrapper(*args, **kwargs): # wrapper是未来要运行的函数
# 加功能
print(f"这里是装饰器参数engine:{engine}")
print(f"这里是函数参数args:{args}, kwargs:{kwargs}")
res = func(*args, **kwargs) # func是被装饰的函数
return res
return wrapper
2.3 语法糖
模板:
@outer # 语法糖(表示使用outer函数进行装饰) 相当于 func = outer(func)
def func(*args, **kwargs):
print('双层装饰器模板')
三、迭代器
- 可迭代对象:具有iter方法的对象(Python中一切皆对象)
- 迭代器对对象:具有iter和next方法
- 迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象(f)
四、三元表达式
模板:
def func(flag):
print("对") if flag else print("错") # 三元表达式格式
func(True)
五、列表推导式
模板:
lt = [i for i in range(10)] # 列表推导式
print(lt)
六、字典生成式
模板:
# 字典生成式
new_dic = {k:v for k,v in {"a":1,"b":2}.items()} # 字典生成式
print(new_dic)
res = {i:i**i for i in range(10)} # 字典生成式
print(res)
6.1 zip()方法与字典生成式连用
字典生成式一般与zip()方法连用。zip方法必须传递两个长度一样的可迭代对象。
zip方法必须传递两个长度一样的可迭代对象。
# zip()方法
z = zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4]) # 压缩方法,Python解释器的内置方法,得到 zip类型变量
for i in z:
print(i)
new_dic = {k: v ** 2 for k, v in z} # 字典生成式
new_dic = {k: v ** 2 for k, v in zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4]) } # 字典生成式,另一种形式
七、生成器和生成器表达式
生成器: 是自定义的迭代器,生成器就是迭代器(自己造出来的)
生成器必须使用yield关键字
7.1 yield关键字
yield的三个特性:
- yield可以把 函数 变成生成器(自定制的迭代器对象,具有
__iter__
和__next__
方法) - yield可以停止函数,再下一次next再次运行yield下面的代码
- 有n个yield生成器就有n个元素,就可以next n次, 第n+1次next会报错
# 例子
def func():
yield [1,1,23] # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
print(789) # yield会停止函数,当运行下一次next才会继续运行下面的代码
yield 101112 # 一个yield对应一个next
print(131415)
f = func() # 调用func()函数 会得到生成器对象
for i in f:
print(i)
7.2 生成器表达式
生成器表达式就是:把列表推导式的[]换成()
# 生成器表达式就是:把列表表达式的[]换成()
lt = (i for i in range(100)) # 生成器表达式
print(lt) # 生成器对象
print(lt.__next__()) # 迭代一次迭代器()
# 使用for循环迭代生成器对象
for i in lt: # 因为next方法迭代了一次.就会从1开始
print(i)
八、匿名函数
lamdbda 参数 : 逻辑代码
- 匿名函数使用一次就失效了,一般不单独使用,与max最大值/min最小值/sorted排序/map映射/filter过滤 连用
九、递归函数
递归本质上就是函数调用函数本身,必须得有结束条件,并且在递归的过程中,问题的规模必须都不断缩小
十、内置方法
其实:记住,只要记住一个enumerate()
别的方法,知道什么意思。用到了再去查也可以
十一、面向过程编程
类似于工厂的流水线,机械式的一步一步完成一个项目,把完成步骤具体细分,这样步骤与步骤之间互不干涉
缺点:扩展性差,只要有一个步骤断了,项目就崩溃了
优点:清晰优雅