Python之路——函数
一、函数知识点补充
1 #参数 2 #没有参数 3 #定义函数和调用函数时括号里都不写内容 4 #有一个参数 5 #传什么就是什么 6 #有多个参数 7 #位置参数 8 9 10 #站在实参的角度上: 11 #按照位置传参 12 #按照关键字传参 13 #混着用可以:但是 必须先按照位置传参,再按照关键字传参数 14 # 不能给同一个变量传多个值 15 16 #站在形参的角度上 17 #位置参数:必须传,且有几个参数就传几个值 18 #默认参数: 可以不传,如果不传就是用默认的参数,如果传了就用传的 19 20 # 动态参数有两种:可以接受任意个参数 21 #*args : 接收的是按照位置传参的值,组织成一个元组 22 #**kwargs: 接受的是按照关键字传参的值,组织成一个字典 23 #args必须在kwargs之前 24 # def func(*args,default=1,**kwargs): 25 # print(args,kwargs) 26 # func(1,2,3,4,5,default=2,a='aaaa',b='bbbb') 27 28 # def mysum(*args): 29 # the_sum = 0 30 # for i in args: 31 # the_sum += i 32 # return the_sum 33 # the_sum = mysum(1,2,3,4) 34 # print(the_sum) 35 36 # def stu_info(**kwargs): 37 # print(kwargs) 38 # print(kwargs['name'],kwargs['sex']) 39 # 40 # stu_info(name = 'alex',sex = 'male') 41 42 # 参数陷阱,默认参数是一个可变数据类型 43 # def defult_param(a,l = []): 44 # l.append(a) 45 # print(l) 46 # 47 # defult_param('alex') 48 # defult_param('egon') 49 50 # def func(*args): # 站在形参的角度上,给变量加上*,就是组合所有传来的值。 51 # print(args) 52 # 53 # func(1,2,3,4,5) 54 # l = [1,2,3,4,5] 55 # func(l) 56 # func(*l) # 站在实参的角度上,给一个序列加上*,就是将这个序列按照顺序打散 57 # def func(**kwargs): 58 # print(kwargs) 59 # func(a=1,b=2) 60 # d = {'a':1,'b':2} 61 # func(**d) 62 63 64 #函数的注释 65 # def func(): 66 # ''' 67 # 这个函数实现了什么功能 68 # 参数1: 69 # 参数2: 70 # :return: 是字符串或者列表的长度 71 # ''' 72 # pass
1 # 函数进阶 2 3 # 命名空间和作用域 4 #命名空间 有三种 5 #内置命名空间 —— python解释器 6 # 就是python解释器一启动就可以使用的名字存储在内置命名空间中 7 # 内置的名字在启动解释器的时候被加载进内存里 8 #全局命名空间 —— 我们写的代码但不是函数中的代码 9 # 是在程序从上到下被执行的过程中依次加载进内存的 10 # 放置了我们设置的所有变量名和函数名 11 #局部命名空间 —— 函数 12 # 就是函数内部定义的名字 13 # 当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了 14 15 #在局部:可以使用全局、内置命名空间中的名字 16 #在全局:可以使用内置命名空间中的名字,但是不能用局部中使用 17 #在内置:不能使用局部和全局的名字的 18 19 #在正常情况下,直接使用内置的名字 20 #当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字 21 #当我自己有的时候 我就不找我的上级要了 22 #如果自己没有 就找上一级要 上一级没有再找上一级 如果内置的名字空间都没有 就报错 23 # 多个函数应该拥有多个独立的局部名字空间,不互相共享 24 25 26 # 作用域两种 27 # 全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域 ——globals() 28 # 局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals() 29 30 # a = 1 31 # def func(): 32 # global a 33 # a = 2 34 # 35 # func() 36 # print(a) 37 38 # 对于不可变数据类型 在局部可以查看全局作用域中的变量 39 # 但是不能直接修改 40 # 如果想要修改,需要在程序的一开始添加global声明 41 # 如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效 42 43 44 #globals 永远打印全局的名字 45 #locals 输出什么 根据locals所在的位置
1 # a = 1 2 # b = 2 3 # def func(): 4 # x = 'aaa' 5 # y = 'bbb' 6 # print(locals()) 7 # print(globals()) 8 # 9 # func() 10 # print(globals()) 11 # print(locals()) #本地的
函数的闭包
1 # 闭包 2 # from urllib.request import urlopen 3 # def get_url(): 4 # url = 'https://y.qq.com/portal/player.html' 5 # def get(): 6 # ret = urlopen(url).read() 7 # return ret 8 # return get 9 # get = get_url() 10 # h = get() 11 # with open('xiaohua100','wb') as f: 12 # f.write(h) 13 14 # def func(): 15 # def func1(a): 16 # a += 1 17 # print(a) 18 # print('2',func1.__closure__) 19 # return func1 20 # f = func() 21 # print(f.__closure__) 22 # print(func.__closure__)
装饰器
1 # def wrapper(func): 2 # def inner(*args,**kwargs): 3 # print('before') 4 # ret = func(*args,**kwargs) 5 # print('ends') 6 # return ret 7 # return inner 8 # 9 # @wrapper 10 # def qqxing(): 11 # print(123) 12 # return 456 13 # 14 # print(qqxing())
装饰器进阶
1 # from functools import wraps 2 # 3 # def deco(func): 4 # @wraps(func) # 加在最内层函数正上方 5 # def wrapper(*args,**kwargs): 6 # return func(*args,**kwargs) 7 # return wrapper 8 # 9 # @deco 10 # def index(): 11 # '''hahaha''' 12 # print('from index') 13 # 14 # print(index.__name__) 15 # print(index.__doc__) 16 17 # 装饰器的固定格式 18 # def timer(func): 19 # def inner(*args,**kwargs): 20 # '''执行函数之前要做的''' 21 # re = func(*args,**kwargs) 22 # '''执行函数之后要做的''' 23 # return re 24 # return inner 25 26 27 #装饰器的固定格式——wraps版 28 # from functools import wraps 29 # 30 # def deco(func): 31 # @wraps(func) #加在最内层函数正上方 32 # def wrapper(*args,**kwargs): 33 # return func(*args,**kwargs) 34 # return wrapper 35 36 37 #带参数的装饰器 38 # FLAG = True 39 # def outer(flag): 40 # def timer(func): 41 # def inner(*args,**kwargs): 42 # if flag: 43 # print('''执行函数前要做的''') 44 # re = func(*args,**kwargs) 45 # if flag: 46 # print('''执行函数后要做的''') 47 # return re 48 # return inner 49 # return timer 50 # 51 # @outer(FLAG) 52 # def func(): 53 # print(111) 54 # 55 # func()