Python函数的参数

函数的参数:

先来安利一下:定义函数的时候,我们把参数的名字和位置确定下来,函数的接口就定义完了。

对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数返回什么样的值就够了,

函数内部的复杂逻辑被封装起来,调用者无需了解。

Python的函数定义非常简单,但是却非常灵活。除了正常定义的必选参数外,还可以使用默认参数,

可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化

调用者的代码。

只要函数执行到return 函数就会停止执行

# 1. 每个函数如果在函数中不写return, 默认返回None

# 2. 我们也可以只写一个return, 也是返回None, 停止函数的执行

# 3. return 一个返回值. 你在调用方能接受到一个返回值

# 4. return 多个返回值. 多个值需要用,隔开 接收的位置. 接收的是元组.

# 函数return返回多个值以元祖(tuple)存储

1.位置参数

def fun(a):

return a+a

print(fun(3))#6

对于fun(a)函数,参数a就是一个位置参数。

当我们调用fun函数时,必须传入有且仅有的一个参数x

def fun(x,n)

x = x **n

return x

print(fun(2,4))#16

x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次付给参数x和n

2.默认参数

def fun(x,n=2):

x = x **n

return x

print(fun(2))#4

print(fun(2,4))#16

默认参数可以简化函数的调用。设置默认参数时,需注意:

1)必选参数在前,默认参数在后,否则python解释器会报错

2)如何设置默认参数:当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。

变化小的参数就可以作为默认参数。

使用默认参数有什么好处呢:最大的好处就是能够降低调用函数的难度。

注意:默认参数的一个坑

例子:

def add(l=[]):

l.append('a')

return l

#正常调用时,结果正常

print(add([1, 2, 3]))#[1, 2, 3, 'a']

print(add([5, 4, 3]))#[5, 4, 3, 'a']

#当使用默认参数调用时,一开始结果还正确,可是再此调用就不对了

print(add())#['a']

print(add())#['a', 'a']

原因解释:

Python函数在定义的时候,默认参数l的值就被计算出来了,即[],因为默认场参数l也是一个变量,

他指向对象[],每次调用函数,如果改变了l的内容,则下次调用时,默认参数的内容就变了,不再

是函数定义时的[]了。

注:定义默认参数要记牢一点:默认参数必须指向不变对象。

解决上述问题:

def add(L=None):

if L is None:

L=[]

L.append('a')

return L

3.可变参数

def fun(*n):

sum = 0

for i in n:

sum += i

return sum

print(fun(1,2,3))#6

lis = [1,2,3]

print(fun(*lis))#6

tu = (1,2,3)

print(fun(*tu))#6

注意:由于参数不确定,所以我们就传入一个可变参数*n,Python允许你在list或tuple前面加一个*号,

把list或tuple的元素变成可变参数传进去。

4.关键字参数

可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。

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

def person(name, age, **kw):

print('name:', name, 'age:', age, 'other:', kw)

person('Michael', 3)#name: Michael age: 3 other: {}

person('A', 4, g='M', j='E')#name: A age: 4 other: {'g': 'M', 'j': 'E'}

关键字参数有什么用?:它可以扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,

但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄

是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。

5.命名关键字参数:

对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。

def person(name, age, **kw):

print('name:', name, 'age:', age, 'other:', kw)

person('JackChen', 20, city='shanghai', addr='shanxi', zipcode=123)

如果要限制关键字参数的名字,就可以用命名关键字参数.

例如,只接收city和job作为关键字参数。这种方式定义的函数如下:

def person(name, age, *, city, job):

print(name, age, city, job)

#和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,

#*后面的参数被视为命名关键字参数。

person('Jack', 20, city='Beijing', job='Engineer')#Jack 20 Beijing Engineer

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符

*了:

def person(name, age, *args, city, job):

print(name, age, args, city, job)

#命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错.

person('Jack', 20, 'Beijing', 'Engineer')

#Traceback (most recent call last):

# File "", line 1, in

#TypeError: person() takes 2 positional arguments but 4 were given

由于调用时缺少参数名city和job,Python解释器把这4个参数均视为位置参数,

但person()函数仅接受2个位置参数。

命名关键字参数可以有缺省值,从而简化调用:

def person(name, age, *, city='Beijing', job):

print(name, age, city, job)

person('Jack', 20, job='Engineer')#Jack 20 Beijing Engineer

注意:使用命名关键字参数时,要特别注意,如果没有可变参数,

就必须加一个*作为特殊分隔符。如果缺少*,

Python解释器将无法识别位置参数和命名关键字参数

参数组合:

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,

这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:

必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180805A0OM9S00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券