基础篇_010_函数_粗略梗概
函数:为了实现某一特定功能的代码块,在python中的定义是:逻辑结构化和过程化的编程。
形式 ===》
def 函数名(参数1, 参数2...):
'''注释:此函数具有什么功能'''
代码块
return 值
如果返回值的数量 = 0 ===》自动返回None
如果返回值的数量 = 1 ===》返回object(value = return_value)
如果返回值的数量 > 1 ===》返回一个tuple
----函数名命名
1. 与标识符一致。
2. python中没有重载函数?(表现的结果为不能有同名的函数,参数不同也不行)。额,以后再说吧,现在也不知道...
3. 震惊:python中竟然可以在函数中定义函数!(在Java和C...中都不行) ===》但是要注意,函数的定义和调用是两码事!定义只会负责让python编译这个函数,调用负责执行函数内部操作。
----可变长参数
1. position arguments: 位置参数 ===》传入参数的时候必须一一对应,缺一不行、多一也不行
def te(x, y, z):
print(x, end=" ")
print(y, end=" ")
print(z)
te(2, 3, 4) # 输出:2 3 4
2. keyword arguments: 关键字参数 ===》传入参数的时候不必一一对应,直接使用arguments1 = value,同样缺一不行、多一也不行。
def te(x, y, z):
print(x, end=" ")
print(y, end=" ")
print(z)
te(y=1, x=2, z=3) # 输出:2 1 3
3. 混合使用 ===》
--(1). 位置参数必须在关键字参数前面(左边)
--(2). 混搭的时候也需注意位置参数一一对应,避免关键字参数将位置参数覆盖,而导致后面的参数没有值 ===》
def te(x, y, z):
print(x, end=" ")
print(y, end=" ")
print(z)
# te(1, 3, y=3) # 输出:报错:y有多个值
te(1, 3, z=2) # 输出:1 3 2
--(3). 所以也不能出现重复赋值,eg:te(1, 3, 4, y=2) # 报错:y有多个值
4. 默认参数 ===》"默认参数"必须放置在"非默认参数"之前。并且传入的value会将默认的default_value覆盖掉。
5. 参数组 ===》在"基础篇_004_基本数据类型_几种重要函数的整理"中有提到过format()的参数:如果传入的参数为字典,则必须在前面加上"**",从而传入整个映射关系(mapping);如果传入的参数为列表或者元组,则必须在前面加上"*",从而将其中的元素遍历然后取出。
--*args ===》传入多个任意类型的值,只能处理位置参数:将传入的多个位置参数转换为元组。"*"的本质:将传入参数的每一个元素遍历。
1 def te(x, *args):
2 print(x, end=" ")
3 print(args)
4 print(args[0])
5 te(1, 2, 3, 4, 5)
6 # print(args) ===》1 (2, 3, 4, 5)
7 # 后面的参数自动地被转换成了tuple
8 # print(args[0]) ===》2
9 # 但是往往用户在传入多个参数的时候不会一个一个的传,而是传入一个列表或者元组
10 te(1, [2, 3, 4]) # 但是输出的结果不尽人意,python把列表当做一整个参数传入了!
11 # print(args) ===》1 ([2, 3, 4],)
12 # print(args[0]) ===》[2, 3, 4]
13 # 还在天无绝人之路,python为我们提供了 "*" 操作符 ===》将变量的元素挨个儿遍历
14 te(1, *[2, 3, 4, 5]) # nice
15 # print(args) ===》1 (2, 3, 4, 5)
16 # print(args[0]) ===》2
17 # 挨个儿遍历的证据之一:
18 te(1, *{'name': 'simba', 'number': 123}) # 字典中的第一个元素是key
19 # print(args) ===》1 ('name', 'number')
20 # print(args[0]) ===》name
--**kwargs ===》关键字参数组,处理多个关键字参数,形成一套映射(mapping)规则(就是将这些关键字参数组聚在一起,形成一个字典)。
1 def te(x, **kwargs):
2 print(x)
3 print(kwargs)
4 te(1, y=1, z=2)
5 # print(x) ===》1
6 # print(kwargs) ===》{'y': 1, 'z': 2}
7 # 既然"关键字参数组"是一个字典,那我们可不可以直接传入一个字典呢?
8 te(1, {"name": "simba"}) # 报错:python将传入的字典理解为"位置参数",
9 # 从而违反了"位置参数一一对应,多一不行、缺一也不行"的大前提
10 # 如果想要让传入的字典变成一套映射(mapping)传入,则必须加上"**"
11 te(1, **{"name": "simba", "age": 19})
12 # print(x) ===》1
13 # print(kwargs) ===》{'name': 'simba', 'age': 19}
--混合使用时的注意事项 ===》
(1). "位置参数组"必须在"关键字参数组"的左边,在"普通参数"的右边。
(2). "关键字参数组"的key值不能与"普通参数"的名字冲突 ===》
def func(x, *args, **kwargs):
pass
func(1, 2, 3, **{"x": 1}) # 报错: func() got multiple values for argument 'x'
func(1, 2, 3, **{"y": 1})