牛骨文教育服务平台(让学习变的简单)

默认参数

Python中的函数定义以及参数的使用: 
定义函数要使用def+函数名

def enroll(name,gender,age = 6,city = "Beijing"):
    print(name)
    print(gender)
    print(age)
    print(city)
enroll("Billy","Six")

这里使用了默认参数,降低了函数调用的难度,而一旦需要更复杂的调用时,又可以传递更多的参数来实现。无论是简单调用还是复杂调用,函数只需要定义一个。

默认参数的坑:先定义一个函数,传入一个list,添加一个END再返回:

def add_end(L=[]):
    L.append("END")
    return L
add_end([1,2,3])

正常调用的时候没有错误,但是如果使用默认参数多次调用的话:

print(add_end())
print(add_end())
print(add_end())
print(add_end())

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

所以,定义默认参数要牢记一点:默认参数必须指向不变对象! 
要修改上面的例子,可以使用None这个不变对象来实现:

def add_end(L=None):
    if L is None:
        L = []
    L.append("END")
    return L

可变参数

在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。

我们以数学题为例子,给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……。

要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a,b,c……作为一个list或tuple传进来,这样,函数可以定义如下:

def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

但是调用的时候,需要先组装出一个list或tuple:

calc([1, 2, 3]) 
14 
calc((1, 3, 5, 7)) 
84

如果利用可变参数,调用函数的方式可以简化成这样: 
calc(1, 2, 3) 
14 
calc(1, 3, 5, 7) 
84 
所以,我们把函数的参数改为可变参数:

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:

calc(1, 2) 

calc() 

如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:

nums = [1, 2, 3] 
calc(nums[0], nums[1], nums[2]) 
14 
这种写法当然是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:

nums = [1, 2, 3] 
calc(nums) 
14 
nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。

转载自 :廖雪峰的官方网站:函数的参数