因为要为面试做准备, 现在要开始重视一些语法知识点了.
Python 的函数参数挺重要的, 总结一下:
(1)位置参数: 没啥好说的, 就是普通的参数.
(2)默认参数:
参数形式: def power(x, n = 3): (在函数定义时通过对一个形参赋值的形式, 来实现默认参数)
特别注意: 默认参数一定要为不可变对象
- def add_end(L=[]):
- L.append('END')
- return L
原因解释如下:
Python 函数在定义的时候, 默认参数 L 的值就被计算出来了, 即 [], 因为默认参数 L 也是一个变量, 它指向对象[], 每次调用该函数, 如果改变了 L 的内容, 则下次调用时, 默认参数的内容就变了, 不再是函数定义时的[] 了.(原因最好也了解一下)
要修改上面的例子可以用 None 这个不变对象来实现.
- def add_end(L=None):
- if L is None:
- L = []
- L.append('END')
- return L
为什么要设计 str,None 这样的不变对象呢? 因为不变对象一旦创建, 对象内部的数据就不能修改, 这样就减少了由于修改数据导致的错误. 此外, 由于对象不变, 多任务环境下同时读取对象不需要加锁, 同时读一点问题都没有. 我们在编写程序时, 如果可以设计一个不变对象, 那就尽量设计成不变对象.(不变对象的优点)
(此处参考廖雪峰的官方网站)
(3)可变参数:
参数形式:
- def calc(*numbers):
- sum = 0
- for n in numbers:
- sum = sum + n * n
- return sum
机理: 函数在调用时, 把接收到的参数组装成一个 tuple, 传递参数时可以传递任意参数.
在传递参数时, 如果我们已经有一个 list 或者 tuple. 这里给出有两种方法:
- calc(nums[0], nums[1], nums[2])
- calc(*nums)
在第二种方法中, Python 允许你在 list 或 tuple 前面加一个 * 号, 把 list 或 tuple 的元素变成可变参数传进去.(例子参考廖雪峰网站)
(4)关键字参数:
参数形式:
- def person(name, age, **kw):
- print('name:', name, 'age:', age, 'other:', kw)
- >>> person('Adam', 45, gender='M', job='Engineer')
- name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
机理: 关键字参数允许你传入 0 个或任意个含参数名的参数, 这些关键字参数在函数内部自动组装为一个 dict.
在传递参数时, 如果我们已经有一个 dict:
1 person('Jack', 24, **extra)
**extra 表示把 extra 这个 dict 的所有 key-value 用关键字参数传入到函数的 **kw 参数, kw 将获得一个 dict, 注意 kw 获得的 dict 是 extra 的一份拷贝, 对 kw 的改动不会影响到函数外的 extra.
(与可变参数类似)
(5)命名关键字参数:
参数形式:
1 def person(name, age, *, city, job):
注: 如果函数定义中已经有了一个可变参数, 后面跟着的命名关键字参数就不再需要一个特殊分隔符 * 了:
1 def person(name, age, *args, city, job):
使用时: 命名关键字参数必须传入参数名, 这和位置参数不同. 如果没有传入参数名, 调用将报错:
- >>> person('Jack', 24, 'Beijing', 'Engineer')
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- TypeError: person() takes 2 positional arguments but 4 were given
参数的缺省值: 命名关键字参数可以有缺省值, 从而简化调用, 其中命名关键字参数 city 具有默认值, 调用时, 可不传入 city 参数:
- def person(name, age, *, city='Beijing', job):
- print(name, age, city, job)
- >>> person('Jack', 24, job='Engineer')
- Jack 24 Beijing Engineer
参数定义的顺序必须是: 必选参数, 默认参数, 可变参数, 命名关键字参数和关键字参数.
来源: http://www.bubuko.com/infodetail-3501360.html