本章知识结构
函数
定义:
# =======================================定义一个函数需要使用关键字def进行定义具体格式是:def function_name(parameter):passreturn parameter2# =======================================说明:def 函数声明关键字function_name 函数名parameter 参数(外部导入函数内部)pass 函数体return 返回值关键字parameter2 返回值# =======================================
#示例:#============================def my_fun(x,y):i=x+yreturn iprint(my_fun(4,5))#============================#ouput:9
默认参数
在定义的时候,给参数赋值,可以作为默认参数 注意:** ** 默认参数只能放在常规参数后面
#示例1:#============================def my_fun(x=1,y=2):i=x+yreturn iprint(my_fun())print(my_fun(2,3))print(my_fun(2,))# print(my_fun(,1)) 前面不能留空#============================#output345#============================
#示例2:#============================def my_fun(x=None,y=2):i=x+yreturn iprint(my_fun(2,))#============================#output4#============================
#示例3:#============================def my_fun(x=None, z=None, y=2, k=2):i=x+y+z+kreturn iprint(my_fun(2,2))#============================#output8#============================
默认参数的坑
(经典案例)
默认值只**能保证指向的对象不变,不能保证对象内的内容不变 一旦默认值指向的对象被间接修改了,也就意味着改变了默认值 通俗点讲: 默认值是一个储存好的常数值,而且不会随着函数的过期而被删除 如果无意间修改了常数的值,也就等于默认值被修改了
#============================def Lend(L=[]):Lend('END')return Lprint(Lend())print(Lend())print(Lend())#============================#output['END']['END', 'END']['END', 'END', 'END']#============================#例子 https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888
解决方案: 在函数内部创建一个临时变量 将默认值传递给临时变量再调用
列表之类的容器这样做就行了, 其他的int,float等简单变量没必要这样做,因为不太可能出现这种状况
#============================def Lend(L=[]):list2 =L[:]list2.append('END')return list2print(Lend())print(Lend())print(Lend())#============================#output['END']['END']['END']#============================
解决方案2:推荐 将初始化过程移植到函数体中
def Lend(L=None):if L is None:L = []L.append('END')return L
参数
作用域
参数被声明出来后,能使用的范围 例如 全局变量:只要声明之后,后面的语句都能使用 局部变量:如在函数内声明的变量,在函数外就会被销毁只能在函数内部使用
i = "全局变量i"def fun():b = "fun()局部变量"print("函数体内调用:",i)print("函数体内调用:",b)fun()print("全局范围内调用:",i)try:print("全局范围内调用:",b)except NameError:print("全局范围内无法调用:fun()局部变量")#============================#output函数体内调用: 全局变量i函数体内调用: fun()局部变量全局范围内调用: 全局变量i全局范围内无法调用:fun()局部变量#============================
不定参数
不定参数传递的是一整个列表,传递的是一个列表参数
```python
这两个函数的输出结果是一样的
============================
def fun (*L): for i in L: print(i) fun(1,2,3)
============================
def fun (L): for i in L: print(i) fun([1,2,3])
============================
output
1 2 3
```pythondef fun1(*T):print(T)return 0def fun2(**D):print(D)return 0fun1("A", "B", "C")fun2(A="Hibari", B="uid", C="7565634")#============================#output('A', 'B', 'C'){'A': 'Hibari', 'B': 'uid', 'C': '7565634'}
(args, *kwargs)
kwargs: (kew-args)keyword arguments,的缩写 通过键值映射的方式储存的参数或字符串 args: arguments,的缩写 对象、参数或者字符串
在一些函数方法中,储存能见到args和kwargs这两个参数 这表示,这个函数可以接受任意数量的元素参数和键值对应的参数 一定要注意,元素参数和键值对应的参数两者一定要遵循先后顺序
def func(*args, **kwargs):print("*args:", args)print("**kwargs", kwargs, "\n")func("Hibari")func(1, 2, 3)func(A="UID")func(1, 2, 3, A="Hibari", B="UID", C="7565634")
#============================#output*args: ('Hibari',)**kwargs {}*args: (1, 2, 3)**kwargs {}*args: ()**kwargs {'A': 'UID'}*args: (1, 2, 3)**kwargs {'A': 'Hibari', 'B': 'UID', 'C': '7565634'}
拆包
拆包是把列表拆开,传递的是列表中所有的元素
```python
L = [1, 2, 3]
def fun (a1, a2, a3):
        print(a1,a2,a3)
fun(L[0], L[1], L[2]) fun(*L)
这两种调用方式是一样的
============================
output
1 2 3 1 2 3
---<a name="vgYRD"></a>### 对象> 函数也是一个对象,当创建一个函数后会有一些常用的函数属性<a name="qomgL"></a>#### __name__> 数据类型:字符串> 说明:用于储存函数的名称```pythondef fun()passprint(fun.__name__)#========================# outputfun
def decorator(f):def inside_function():print("Dectorator")return f()return inside_function@decoratordef fun():print("function")return 0print(fun.__name__)#========================# outputinside_function


