函数
当我们想要重复实现某一功能,又为了避免大量的copy相同代码段,就可以使用函数,将代码段进行封装,而后只需调用这个函数,就可以重复满足需求。Python已经提供了很多内置函数,例如:print()、max()等;但同时,我们也可以创建自己的函数。
如何定义函数
- def 关键字、函数名、包括形式参数的圆括号
- 缩进块中为函数体
- 函数体的第一行语句可以是可选性的 docstring 文档字符串
- return结束函数并返回值,不带表达式的 return 返回 None。
定义一个函数
def myPrint(n):
print(n)
定义一个函数,包含斐波那契数列的方法
def fibonacci(n):
r = []
a,b = 0,1
while b < n:
r.append(b)
a,b = b ,a+b
return r
函数的参数
定义的函数可以包括一下四种参数类型。
- 必需参数
- 默认参数
- 可变参数
- 关键字参数
1、必需参数
如果在定义函数的时候,定义了一个函数参数,在调用函数的时候,就必需传入一个参数,且传入的数量必须和定义时相同。传入的参数会按照位置顺序,依次索引。
def power(num,n):
x = num**n
return x
调用函数传入对应参数
print(power(10,2))
#输出结果
100
调用函数时不传入参数或缺少参数,会返回一个错误。
print(power())
print(power(10))
TypeError: power() missing 2 required positional arguments: 'num' and 'n'
2、默认参数
为一个或多个参数指定默认值。在调用函数时,如果没有为默认参数传入值,函数会使用默认参数的默认值。
def power(num,n=2):
x = num**n
return x
print(power(10))
#输出结果
100
可以是多个默认值
def power(num=10 ,n=2):
x = num**n
return x
print(power())
#输出结果
100
注意事项:
- 设置默认参数时,默认参数要在必需参数后。
- 当默认值是可变对象时,后续调用过程中会累积(前面)传给它的参数,例如:list列表、dict字典等。
def add (a,l =[] ):
l.append(a)
return l
print(add('zero'))
print(add(1))
print(add('c'))
#输出结果
['zero']
['zero', 1]
['zero', 1, 'c']
如果我们不希望默认值变化,只需将默认值设定为不可变对象
def add (a,l = None ):
if l is None:
l=[]
l.append(a)
return l
print(add('zero'))
print(add(1))
print(add('c'))
#输出结果
['zero']
[1]
['c']
3、可变参数
也可以叫不定长参数,指传入的参数个数是可变的,可以是 0 到任意个,这些参数会包装在一个元组中。
def sums(*num):
x = 0
for n in num:
x = x + n
return x
print(sums(1,1,2,3,5,8)))
#输出结果
20
如果已知一个list列表或元祖,想要传入函数中只需要变量名前加 * 即可
def l(*num):
sum = 0
for n in num:
sum = sum + n
return sum
list = (1,1,2,3,5,8)
print(l(*list))
#输出结果
20
4、关键字参数
而关键字参数允许你传入0个到任意个含参数名的参数,这些关键字参数会包装成为一个dict。
def function(**keyword):
return keyword
print(function())
#输出结果
{}
def function(**keyword):
return keyword
print(function(zero=0,one=1,two=2,three=3))
#输出结果
{'zero': 0, 'one': 1, 'two': 2, 'three': 3}
跟可变参数一样,关键字参数也可以把 dict 字典转化后传入,只需要在变量前加 ** 即可。
def signUp(userName,passWord,**other):
print(userName,passWord,other)
return userName, passWord, other
infm = {'email':'xxx@xxx.com','phone':'182xxxxxx71'}
signUp('username','123456',**infm)
我们可以通过 if 判断关键字参数中是否存在某个 key 值。
def signUp(userName,passWord,**other):
if 'email' in other:
print('Contact me')
if 'age' in other:
pass
return userName, passWord,other
infm = {'email' : 'xxx@xxx.com','phone': '182xxxxxx71'}
print(signUp('username','123456',**infm))
#输出结果
Contact me
('username', '123456', {'email': 'xxx@xxx.com', 'phone': '182xxxxxx71'})
*后面的参数,将被视为命名关键字参数,这里*仅作为分隔符。
def signUp(userName,passWord,*,email,phone):
print(userName,passWord,email,phone)
return userName, passWord, email, phone
signUp('username','123456',email = 'xxx@xxx.com',phone = '182xxxxxx71')
#输出结果
username 123456 xxx@xxx.com 182xxxxxx71
可变参数后面的参数也被认为是命名关键字参数。
def signUp(userName,passWord,*other,email,phone):
print(userName,passWord,other,email,phone)
return userName, passWord, other, email, phone
@注意:如果不使用*分隔符,Python将无法区分必需参数和命名关键字参数。
命名关键字参数也可以给定默认值,调用时将无需传入参数名。
def signUp(userName,passWord,*,email='xxx@xxx.com',phone):
print(userName,passWord,email,phone)
return userName, passWord, email, phone
signUp('username','123456',phone = '182xxxxxx71')
#输出结果
username 123456 xxx@xxx.com 182xxxxxx71
@注意:若命名关键字参数未指定默认值,调用时必须传入参数名,否则将报错。
小结
- Python函数参数可以混合使用。
- 参数定义顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数