本章知识结构

L- 函数基础 - 图2

函数

定义:

  1. # =======================================
  2. 定义一个函数需要使用关键字def进行定义
  3. 具体格式是:
  4. def function_name(parameter):
  5. pass
  6. return parameter2
  7. # =======================================
  8. 说明:
  9. def 函数声明关键字
  10. function_name 函数名
  11. parameter 参数(外部导入函数内部)
  12. pass 函数体
  13. return 返回值关键字
  14. parameter2 返回值
  15. # =======================================
  1. #示例:
  2. #============================
  3. def my_fun(x,y):
  4. i=x+y
  5. return i
  6. print(my_fun(4,5))
  7. #============================
  8. #ouput:
  9. 9

默认参数

在定义的时候,给参数赋值,可以作为默认参数 注意:** ** 默认参数只能放在常规参数后面 QQ截图20210116020321.png

  1. #示例1:
  2. #============================
  3. def my_fun(x=1,y=2):
  4. i=x+y
  5. return i
  6. print(my_fun())
  7. print(my_fun(2,3))
  8. print(my_fun(2,))
  9. # print(my_fun(,1)) 前面不能留空
  10. #============================
  11. #output
  12. 3
  13. 4
  14. 5
  15. #============================
  1. #示例2:
  2. #============================
  3. def my_fun(x=None,y=2):
  4. i=x+y
  5. return i
  6. print(my_fun(2,))
  7. #============================
  8. #output
  9. 4
  10. #============================
  1. #示例3:
  2. #============================
  3. def my_fun(x=None, z=None, y=2, k=2):
  4. i=x+y+z+k
  5. return i
  6. print(my_fun(2,2))
  7. #============================
  8. #output
  9. 8
  10. #============================

默认参数的坑

(经典案例)

默认值只**保证指向的对象不变不能保证对象内的内容不变 一旦默认值指向的对象被间接修改了,也就意味着改变了默认值 通俗点讲: 默认值是一个储存好的常数值,而且不会随着函数的过期而被删除 如果无意间修改了常数的值,也就等于默认值被修改了

  1. #============================
  2. def Lend(L=[]):
  3. Lend('END')
  4. return L
  5. print(Lend())
  6. print(Lend())
  7. print(Lend())
  8. #============================
  9. #output
  10. ['END']
  11. ['END', 'END']
  12. ['END', 'END', 'END']
  13. #============================
  14. #例子 https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888

解决方案: 在函数内部创建一个临时变量 将默认值传递给临时变量再调用

列表之类的容器这样做就行了, 其他的int,float等简单变量没必要这样做,因为不太可能出现这种状况

  1. #============================
  2. def Lend(L=[]):
  3. list2 =L[:]
  4. list2.append('END')
  5. return list2
  6. print(Lend())
  7. print(Lend())
  8. print(Lend())
  9. #============================
  10. #output
  11. ['END']
  12. ['END']
  13. ['END']
  14. #============================

解决方案2:推荐 将初始化过程移植到函数体中

  1. def Lend(L=None):
  2. if L is None:
  3. L = []
  4. L.append('END')
  5. return L


参数

作用域

参数被声明出来后,能使用的范围 例如 全局变量:只要声明之后,后面的语句都能使用 局部变量:如在函数内声明的变量,在函数外就会被销毁只能在函数内部使用

  1. i = "全局变量i"
  2. def fun():
  3. b = "fun()局部变量"
  4. print("函数体内调用:",i)
  5. print("函数体内调用:",b)
  6. fun()
  7. print("全局范围内调用:",i)
  8. try:
  9. print("全局范围内调用:",b)
  10. except NameError:
  11. print("全局范围内无法调用:fun()局部变量")
  12. #============================
  13. #output
  14. 函数体内调用: 全局变量i
  15. 函数体内调用: fun()局部变量
  16. 全局范围内调用: 全局变量i
  17. 全局范围内无法调用:fun()局部变量
  18. #============================

不定参数

不定参数传递的是一整个列表,传递的是一个列表参数

L- 函数基础 - 图4```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

  1. ```python
  2. def fun1(*T):
  3. print(T)
  4. return 0
  5. def fun2(**D):
  6. print(D)
  7. return 0
  8. fun1("A", "B", "C")
  9. fun2(A="Hibari", B="uid", C="7565634")
  10. #============================
  11. #output
  12. ('A', 'B', 'C')
  13. {'A': 'Hibari', 'B': 'uid', 'C': '7565634'}

args, *kwargs)

kwargs: (kew-args)keyword arguments,的缩写 通过键值映射的方式储存的参数或字符串 args: arguments,的缩写 对象、参数或者字符串

在一些函数方法中,储存能见到args和kwargs这两个参数 这表示,这个函数可以接受任意数量的元素参数和键值对应的参数 一定要注意,元素参数和键值对应的参数两者一定要遵循先后顺序

  1. def func(*args, **kwargs):
  2. print("*args:", args)
  3. print("**kwargs", kwargs, "\n")
  4. func("Hibari")
  5. func(1, 2, 3)
  6. func(A="UID")
  7. func(1, 2, 3, A="Hibari", B="UID", C="7565634")
  1. #============================
  2. #output
  3. *args: ('Hibari',)
  4. **kwargs {}
  5. *args: (1, 2, 3)
  6. **kwargs {}
  7. *args: ()
  8. **kwargs {'A': 'UID'}
  9. *args: (1, 2, 3)
  10. **kwargs {'A': 'Hibari', 'B': 'UID', 'C': '7565634'}

拆包

拆包是把列表拆开,传递的是列表中所有的元素

L- 函数基础 - 图5```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

  1. ---
  2. <a name="vgYRD"></a>
  3. ### 对象
  4. > 函数也是一个对象,当创建一个函数后会有一些常用的函数属性
  5. <a name="qomgL"></a>
  6. #### __name__
  7. > 数据类型:字符串
  8. > 说明:用于储存函数的名称
  9. ```python
  10. def fun()
  11. pass
  12. print(fun.__name__)
  13. #========================
  14. # output
  15. fun
  1. def decorator(f):
  2. def inside_function():
  3. print("Dectorator")
  4. return f()
  5. return inside_function
  6. @decorator
  7. def fun():
  8. print("function")
  9. return 0
  10. print(fun.__name__)
  11. #========================
  12. # output
  13. inside_function