Python基础之函数的参数
– 在学习Python过程中感谢廖雪峰的网站
Python函数定义
- 语法
def 函数名(参数1,参数2,参数3....):
函数体
.
.
.
return
Python函数几种参数
Python函数的创建非常简单,但是灵活度却非常大。因此写下此篇文章用于巩固学习。
位置参数
首先我们定义一个求一个数的平方
def getResult(x):
return x * x
此时参数x 即为位置参数,当我们调用函数getResult时,必须传入有且仅有一个参数x
例如:
>>>getResult(6)
36
>>>getResult(7)
49
那么问题来了,如果要计算x3、x4、x5…难道要每次都定义一个方法么?
当然可以想到定义一个拥有两个位置参数的函数
def newGetResult(x, n):
result = 1
while n > 0:
n = n-1
result = result * x
return result
运行结果:
>>>newGetResult(5, 3)
75
最后修改的newGetResult函数参数x、n 都是位置参数,在调用该函数的时候一定要保证参数的顺序正确
默认参数
如果newGetResult函数通常情况是计算x2 ,偶尔计算xn则可以在函数定义时使用到默认函数
例如:
def newGetResult(x, n = 2):
result = 1
while n > 0:
n = n-1
result = result * x
return result
此时n = 2就是默认参数,如果调用newGetResult函数时只输入一个参数则默认第二个参数是2
例如:
>>>newGetResult(6)
36
当然你也可以在调用的时候第二个参数传入其他的数值
例如:
>>>newGetResult(3, 3)
27
#此时第二个参数n=3
默认参数的作用是可以简化函数的调用,在定义含有‘位置参数’和‘默认参数’的函数时要注意‘默认参数’在参数的最后边。
举个例子来证明默认参数简化函数调用的例子,例如公司录入一批海鲜函数
def seafood(name, price):
print('name:', name)
print('price:', price)
如果此时要增加录入的信息例如产地这种相对固定的信息时,再增加一个产地参数country,但是每次在调用的时候都要输入固定的America时就相对来说比较麻烦,所以此时使用到默认参数country = ‘America’
def seafood(name, price, country = 'America'):
print('name:', name)
print('price:', price)
print('country:', country)
默认参数很有用,但是默认参数有一个坑要注意,定义一个函数传入一个list,在函数体中加一个‘END’
def add_end(L = []):
L.append('END')
return L
运行:
>>>add_end()
['END']
>>>add_end()
['END','END']
可见每调用一次add_end()函数就会在列表加一个’END’,造成这种情况的原因是因为在函数add_end()定义时默认参数L就被定义了,当第一次调用该方法时,L引用的对象[]添加了’END’,再次调用该方法的时候相当于在对象[]中再添加一个’END’。
如果想定义一个List的默认参数可以使用’None’不变参数来定义
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L
这样调用多少次都不会出现上边的问题了
>>>add_end()
['END']
>>>add_end()
['END']
可变参数
根据名字就可以猜到可变参数的含义是参数个数是可变的,可以传1个、2个…n个
例如要计算a2+b2+c2+…+n2
如果不使用可变参数的话可以使用一个List或者Tuple作为参数
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
如果使用可变参数函数定义
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
可变参数的标志就是在参数前加一个*,在函数的内部numbers的类型为tuple,函数体完全不需要改变
如果有一个List或者Tuple类型的数据,在调用含有可变参数的函数时,这样传参
>>>n = [1,2,3,4]
>>>t = (1,2,3,4)
>>>calc(*n)
30
>>>calc(*t)
30
关键字参数
可变参数可以传入0个或者多个参数,参数会在函数调用时自动的组装成tuple;关键字参数则是可以传入0个或多个含函数名的参数,这些参数会在函数调用时自动组装成dict;
def person(name, age, **others):
print(name, age, others)
运行
>>>person('Ranc', 26)
Ranc 26 {}
也可以传入任意个关键字参数
>>>person('Ranc', 26, city = 'Beijing')
Ranc 26 {city = 'Beijing'}
关键字参数主要被用来扩展函数的功能,如果调用者想传入更多的参数给函数也能支持
命名关键字参数
如果要限制关键字参数的传递参数名字,就可以用命名关键字参数,例如person函数关键字参数只传city, job参数
def person(name, age, *, city, job):
print(name, age, city, job)
和关键字参数**others不通,命名关键字参数需要一个特殊的标记符,标记符后边的参数都是命名关键字参数。
函数定义了命名关键字参数则在调用函数时必须要传入命名关键字参数
如果参数中有可变参数,则可以省略标记符
参数组合
在Python中定义函数可以使用多种参数的组合,组合的顺序是 必选参数、默认参数、可变参数、命名关键字参数、关键字参数