本章知识结构
函数
定义:
# =======================================
定义一个函数需要使用关键字def进行定义
具体格式是:
def function_name(parameter):
pass
return parameter2
# =======================================
说明:
def 函数声明关键字
function_name 函数名
parameter 参数(外部导入函数内部)
pass 函数体
return 返回值关键字
parameter2 返回值
# =======================================
#示例:
#============================
def my_fun(x,y):
i=x+y
return i
print(my_fun(4,5))
#============================
#ouput:
9
默认参数
在定义的时候,给参数赋值,可以作为默认参数 注意:** ** 默认参数只能放在常规参数后面
#示例1:
#============================
def my_fun(x=1,y=2):
i=x+y
return i
print(my_fun())
print(my_fun(2,3))
print(my_fun(2,))
# print(my_fun(,1)) 前面不能留空
#============================
#output
3
4
5
#============================
#示例2:
#============================
def my_fun(x=None,y=2):
i=x+y
return i
print(my_fun(2,))
#============================
#output
4
#============================
#示例3:
#============================
def my_fun(x=None, z=None, y=2, k=2):
i=x+y+z+k
return i
print(my_fun(2,2))
#============================
#output
8
#============================
默认参数的坑
(经典案例)
默认值只**能保证指向的对象不变,不能保证对象内的内容不变 一旦默认值指向的对象被间接修改了,也就意味着改变了默认值 通俗点讲: 默认值是一个储存好的常数值,而且不会随着函数的过期而被删除 如果无意间修改了常数的值,也就等于默认值被修改了
#============================
def Lend(L=[]):
Lend('END')
return L
print(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 list2
print(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
```python
def fun1(*T):
print(T)
return 0
def fun2(**D):
print(D)
return 0
fun1("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__
> 数据类型:字符串
> 说明:用于储存函数的名称
```python
def fun()
pass
print(fun.__name__)
#========================
# output
fun
def decorator(f):
def inside_function():
print("Dectorator")
return f()
return inside_function
@decorator
def fun():
print("function")
return 0
print(fun.__name__)
#========================
# output
inside_function