函数

当我们想要重复实现某一功能,又为了避免大量的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函数参数可以混合使用。
  • 参数定义顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数