0、动态传参内容补充:
0、1 单纯运行如下函数不会报错。
def func1(*args,**kwargs): pass func1()
0、2 *的魔性用法
* 在函数定义的时候,代表聚合。
*在函数的执行的时候,代表打散。
def func1(*args,**kwargs): print(args) #(1, 2, 3) func1(*[1,2,3])
*在函数的执行的时候,代表打散。
def func1(*args,**kwargs): print(*args) # print(*(1,2,3)) func1(*[1,2,3])
def func1(*args,**kwargs): print(kwargs) # {'name':'alex'} func1(*[1,2,3], **{'name':'alex'})
print()函数无法接收动态参数,所以当print(**kwargs)时就会报错。
def func1( **kwargs): print(**kwargs) func1(**{'name':'alex'})
def func1(): 1 print(666) 6 def func2(): 2 func1() 5 print(333) 7 def inner(): 8 print(222) 10 inner() 9 print(111) 3 func2() 4 print(555) 11
0、3 取值顺序:
局部名称空间(函数执行时) -----> 全局名称空间(程序运行时) -----> 内置名称空间
0、4 加载顺序:
内置名称空间 -----> 全局名称空间(程序运行时) -----> 局部名称空间(函数执行时)
0、5 执行顺序:
当代码运行时,从上至下依次执行。
name = '老男孩' def func1(): global name name = 'alex' func1() print(name)
0、6global:
1、声明一个全局变量;
2、更改一个全局变量。
0、7nonlocal:
1、不能改变一个全局变量;
2、在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
def add_b(): b = 42 def do_global(): b = 10 print(b) # b = 10 def dd_nonlocal(): nonlocal b b = b + 20 print(b) # b = 30 dd_nonlocal() print(b) # b = 30 do_global() print(b) # b = 42 add_b()
1、函数名的应用
第一类对象。
1、直接打印函数名得到的是函数的内存地址。
def func1(): print(666) print(func1)
2、函数名可以赋值运算。
def func1(): print(666) f1 = func1 f1()
3、函数名可以作为函数的参数。
def func1(): print(666) def func2(x): x() print(555) func2(func1)
4、函数名可以作为容器类数据类型的元素。
def func1(): print(666) def func2(): print(222) def func3(): print(111) def func4(): print(777) l1 = [func1, func2, func3, func4] for i in l1: i()
def func1(): print(666) def func2(): print(222) def func3(): print(111) def func4(): print(777) dic1 = { 1: func1, 2: func2, 3: func3, 4: func4, } dic1[1]()
5、函数名可以当做函数的返回值。
def func1(): print(666) def func2(x): print(222) return x ret = func2(func1) ret()
2、闭包
1、内层函数对外层函数的非全局引用就叫闭包。
2、判断是不是闭包,函数名:__closure__
返回的None则就不是闭包;返回的是cell......这就是闭包。
def func1(): name = '老男孩' def inner(): print(name) inner() print(inner.__closure__) func1()
global声明了一个全局变量,此时name为全局变量,所以就不时闭包。
def func1(): global name # 声明全局变量name name = '老男孩' def inner(): print(name) inner() print(inner.__closure__) func1()
def func1(x): def inner(): print(x) inner() print(inner.__closure__) name = '老男孩' func1(name)
def func(): def func1(): name = "老男孩" def func2(): nonlocal name # 对父级变量改变 name = "alex" def func3(): global name # 声明一个全局变量 name = "太白" name = "日天" func1() print(name) func2() print(name) func3() print(name) func() print(name)
3、闭包的作用:
当执行一个函数时,如果解释器判断此函数内部闭包存在,这样Python就存在一个机制,闭包所在的临时名称空间不会随着函数的执行完毕而消失。
from urllib.request import urlopen def index(): url = "https://user.qzone.qq.com/569894146/infocenter" def get(): return urlopen(url).read() return get kongjian = index() content = kongjian() print(content)
闭包爬虫应用结果
3、装饰器
3、1 第一版本,测试函数low
import time def login(): time.sleep(0.3) print('洗洗更健康...') def timmer(): start_time = time.time() login() end_time = time.time() print('此函数的执行时间%s' % (end_time - start_time)) timmer()
3、2 改变了我原来执行函数的方式,不好。
def login(): time.sleep(0.3) print('洗洗更健康...') def register(): time.sleep(0.4) print('洗洗更健康22222...') def timmer(f): start_time = time.time() f() end_time = time.time() print('此函数的执行时间%s' % (end_time - start_time)) timmer(login) timmer(register)
3、3 初级装饰器
初级装饰器
3、4 简单版装饰器 语法糖
简单版装饰器 语法糖
3、5 被装饰的函数带参数的装饰器
被装饰的函数带参数的装饰器
3、6函数带返回值的装饰器(万能装饰器)
函数带返回值的装饰器 (万能装饰器)
3、7 装饰器模板
装饰器模板
3、8 装饰器的作用:
在不改变原函数的基础场,为原函数增加一些功能,log、登录注册等。