上节课课堂回顾
函数对象
函数名就是变量名
a = 1
def func():
print('from func')
print(func) # 函数名等同于变量名
b = a # 1
f = func
f() # func()
可变长参数
# 做形参
# def func(x, *args, a=1): # *args接收多余的位置实参,并且用元组的形式存储
# print(x, a)
# print('args:', args)
#
#
# func(1, 2, 3) # 1,1
#
#
# def func(x, a=1, **kwargs): # **kwargs接收多余的关键字实参,并且以字典的形式存储了
# print(x, a)
# print('kwargs:', kwargs)
#
#
# func(1, y=1) # 1,1
# 实参
# def func(x,y,z):
# print(x,y,z)
#
# func(*(1,2,3)) # *(1,2,3)就是把元组打散成位置实参传给对应的位置形参
def func(x, y, z):
print(x, y, z)
func(**{'x': 1, 'y': 2, 'z': 3}) # **{'x': 1, 'y': 2, 'z': 3}把字典打散成关键字实参x=1,y=2,z=3,传给对应的位置形参
名称空间与作用域
内置--》全局--》局部
作用域:
内置和全局 --》 全局作用域
局部 --> 局部作用域
- 全局作用域的(x=1)和局部作用域的(x=3)没有关系
x = 1
def func():
x = 3
func()
print(x) # 1
- 局部作用域1(x=1) 和 局部作用域2 中的(x=3)没有关系
def f1():
x = 1
def f2():
x = 3
f2()
print(x)
f1() # 1
闭包函数
把函数A和变量x 包在一个函数B内部, 然后通过函数B的返回值 把函数A和变量x 共同返回出来
x = 1
def f1():
print(x)
x = 2
f1()
# 如果不使用闭包,可能出现这种情况,全局变量的变化会影响函数值
# def f2():
# x = 100
#
# def f1():
# print(x)
#
# return f1
#
# x = 2
#
# f = f2() # f = f1 # 不受外界变量的影响了
# # print(f'f.__closure__[0].cell_contents: {f.__closure__[0].cell_contents}') # 闭包函数f的闭包元素
# f() # f1()
def f2(x):
def f1():
print(x)
return f1
x = 2
f_100 = f2(100) # f = f1 # 不受外界变量的影响了
f_100() # f1()
f_100() # f1()
f_100() # f1()
f_200 = f2(200)
f_200()
f_200()
f_200()
f_200()
装饰器
# 装饰器:装饰的一个函数,写装饰器就是写函数,装饰一个函数
# 1. 被装饰的函数不能改变其调用方式
# 2. 被装饰的函数不能改变其源代码
import time
# start = time.time()
# index()
# end = time.time()
# print(end - start)
# 装饰器
# def index():
# start = time.time()
# index()
# end = time.time()
# print(end - start)
# 完整的两层装饰器, 三层装饰器就是给两层加参数
def sanceng(engine):
def outter(func):
def wrapper(*args, **kwargs): # 形参
if engine == 'file':
start = time.time()
res = func(*args, **kwargs) # 原始的index # 实参
end = time.time()
print(end - start)
return res
elif engine == 'db':
res = func(*args, **kwargs)
return res
return wrapper
return outter
@sanceng('file')
def index(x):
print(x)
print('from index')
return 123
# outter = sanceng('db') # outter = outter
# index = outter(index) # index = wrapper
index(1) # wrapper()
# 装饰器:装饰的一个函数,写装饰器就是写函数,装饰一个函数
# 1. 被装饰的函数不能改变其调用方式
# 2. 被装饰的函数不能改变其源代码
import time
# start = time.time()
# index()
# end = time.time()
# print(end - start)
# 装饰器
# def index():
# start = time.time()
# index()
# end = time.time()
# print(end - start)
# 完整的两层装饰器, 三层装饰器就是给两层加参数
def sanceng(engine):
def outter(func):
def wrapper(*args, **kwargs): # 形参
if engine == 'file':
start = time.time()
res = func(*args, **kwargs) # 原始的index # 实参
end = time.time()
print(end - start)
return res
elif engine == 'db':
res = func(*args, **kwargs)
return res
return wrapper
return outter
@sanceng('file')
def index(x):
print(x)
print('from index')
return 123
# outter = sanceng('db') # outter = outter
# index = outter(index) # index = wrapper
index(1) # wrapper()
def outter(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
@outter
def index(x):
print('from index')
def sanceng(engine):
def outter(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return res
return wrapper
return outter
@sanceng('file')
def index(x):
print('from index')
迭代器
# 含有__iter__方法的对象叫做可迭代对象,可迭代对象不一定是迭代器对象
# 含有__iter__和__next__方法的对象叫做迭代器对象,迭代器对象一定是可迭代对象
for i in lt:
print(i)
1. 把lt变成迭代器对象
2. 用__next__方法迭代取值
3. 遇到StopItera异常捕捉异常中断while循环
# 不依赖索引迭代取值

浙公网安备 33010602011771号