Python学习笔记(三)

了解了一些比较基础的东西后,继续学习 python 的函数

函数的定义与调用

Python 中使用def关键字来定义函数,如:

1
2
3
4
def my_fun(name):
print('Hello, %s!' % name)
my_fun('xiaoming')
#Hello, xiaoming!

如果想定义一个空函数,可以使用pass语句,如:

1
2
def nothong():
pass

python 解释器在运行的时候会自动检查传入的参数,如果参数类型不对,就会抛出错误。

默认参数

有的时候我们每次调用有的参数可以省略,那就可以使用默认参数,如:

1
2
3
4
5
def sayHi(name='everyone'):
print('Hi, %s!' % name)

sayHi()
sayHi('xiaoming')

默认参数的坑

1
2
3
4
5
6
7
8
9
10
11
12
13
def add_some(L=[]):
L.append('something')
return L

# 正常使用,没有问题
add_some(['x', 'y', 'z'])
['x', 'y', 'z', 'something']

# 使用默认参数后
add_some()
['something']
add_some()
['something', 'something']

明显默认参数不是我们想要的结果,Python 函数在定义的时候,默认参数 L 的值就被计算出来了,即[],因为默认参数 L 也是一个变量,它指向对象[],每次调用该函数,如果改变了 L 的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

所以,定义默认参数要牢记一点:默认参数必须指向不变对象!我们可以这样来实现上面的需求:

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

可变参数

很多时候我们在调用函数时不能确定参数的个数,那么这个时候就需要使用可变参数了,如,我们计算一组数字的平方和:

1
2
3
4
5
6
7
8
9
10
11
12
# 按照之前的方式来写
def count(nums):
sum = 0
for n in nums:
sum = sum + n * n
return sum
# 使用可变参数后
def count(*nums):
sum = 0
for n in nums:
sum = sum + n * n
return sum

定义可变参数和定义一个 list 或 tuple 参数相比,仅仅在参数前面加了一个号。在函数内部,参数 numbers 接收到的是一个 tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括 0 个参数。如果已经有一个 list 或者 tuple,Python 允许你在 list 或 tuple 前面加一个号,把 list 或 tuple 的元素变成可变参数传进去。

关键字参数

关键字参数允许你传入 0 个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个 dict。如:

1
2
3
4
5
def person(name, age, **kw):
print('name: ', name, 'age: ', age, 'other: ', kw)

person('小明', 12) # name: 小明 age: 12 other: {}
person('小红', 12, gender='女') # name: 小红 age: 12 other: {'gendre': '女'}

命名关键字参数

和关键字参数*_kw 不同,命名关键字参数需要一个特殊分隔符_,*后面的参数被视为命名关键字参数如:

1
2
3
4
def person(name, *, age, gender):
print(name, age, gender)

person('小明', age=12, gender='男')

参数组合

在 Python 中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这 5 种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

[越努力,越幸运!]