基础篇_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})

 

 

posted @ 2020-02-12 11:09  BNTU  阅读(75)  评论(0编辑  收藏  举报