函数的参数
- 位置参数
一个新的名词:按照位置顺序进行赋值的参数。
def position (x,y,z):
print('体积:',x*y*z)
return
运行结果:
position(1,2,3)
- 默认参数
很熟悉吧,哈哈哈。
一般来说,变化大的参数放在前面,变化小的参数放在后面,变化小的参数就可以作为默认参数。
默认参数可以不按顺序传进去
def position (x,y=2,z=3):
print('体积:',x*y*z)
return
运行结果:
position(1)
position(1,2)
position(1,z=2) #越过y给z传参
默认参数的坑 ,且看如下代码:
def add_end(L=[]):
L.append('END')
return L
print(add_end())
print(add_end())
print(add_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
运行结果:
['END']
['END']
['END']
先举一个几个整数求和的例子
def sum1_0 (L): #这个是利用list进行求和的
a=0
for number in L:
a=a+number
return a
def sum2_0 (*L): #这个是利用可变参数求和的
a=0
for number in L:
a=a+number
return a
q=[1,2,3,4,5,6]
print(sum1_0([1,2,3,4,5,6]))
print(sum1_0(q))
print(sum2_0(1,2,3,4,5,6)) #参数的个数可以变化,在函数里被组装成tuple
print(sum2_0(*q)) #*q表示q这个list的所有元素作为可变参数传进去
运行结果:
21
21
21
21
- 关键字参数(更amazing了是不是)
def student(name,grade,**GPA): #GPA是关键字参数,可以理解成可选项
print('姓名:',name,'成绩:',grade, '绩点及排名等:',GPA)
student('Bob',95)
student('Bob',95,绩点=3.5)
student('Bob',95,绩点=3.5,排名=1) #关键字参数的个数不确定,最终会被组装成字典
Bob={'绩点':3.5,'排名':1}
student('Bob',95,绩点=Bob['绩点'],排名=Bob['排名'])
student('Bob',95,**Bob) #也可以传入一个字典,但要变成一个关键字参数,即加上**
运行结果:
姓名: Bob 成绩: 95 绩点及排名等: {}
姓名: Bob 成绩: 95 绩点及排名等: {'绩点': 3.5}
姓名: Bob 成绩: 95 绩点及排名等: {'绩点': 3.5, '排名': 1}
姓名: Bob 成绩: 95 绩点及排名等: {'绩点': 3.5, '排名': 1}
姓名: Bob 成绩: 95 绩点及排名等: {'绩点': 3.5, '排名': 1}
作用:限制关键字参数的名字,就可以用命名关键字参数
def person1_0(name, age, *, city, job):
print(name, age, args, city, job)
def person2_0(name, age, *args, city, job):
print(name, age, args, city, job)
person1_0('bob',15,city='纽约',job='工程师')
person2_0('bob',15,1,2,3,city='纽约',job='工程师')
运行结果:
bob 15 纽约 工程师
bob 15 (1, 2, 3) 纽约 工程师
命名关键字参数需要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数。.
如果有可变参数,如上述的 *args则不需写*了
上述几种参数还可以组合使用
但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。