Appearance
首先来看函数的定义,注意函数也支持return语句。
python
def 函数名(参数列表):
函数体
案例
python
def add(a, b):
return a + b
if __name__ == '__main__':
print(add(1, 2))
函数中的参数
位置参数
传入的两个整数按照位置顺序依次赋给函数的参数 a 和 b,参数 a 和参数 b 被称为位置参数。就像我们上面那个案例使用的那样,当然也可以是空参函数。
python
def add(a, b):
return a + b
if __name__ == '__main__':
print(add(1, 2)) # a=1,b=2
默认参数
在定义函数时,可以为参数提供一个缺省值,如果传递参数时,可以忽略部分参数,如果该参数被调用时没有传递,则会由一个默认值,写法和js相同。
python
def add_student(name, age, city='nanjing'):
print(name)
print(age)
print(city)
add_student('jerry', 12)
可变参数
在函数定义中,在参数前加上符号 * 表示函数可以接受可变数量的参数,如下所示
python
def 函数(*args):
函数体
案例如下,注意args
的类型是一个元组
python
def add(*args):
sum = 0
for arg in args:
sum = sum + arg
print('len = %d, sum = %d' % (len(args), sum))
add(1)
add(1, 2)
add(1, 2, 3)
关键字参数
Python 允许调用函数时,以 “参数名 = 参数值” 的形式传递参数
python
def add(a, b):
return a + b
add(a=1, b=2)
"参数名 = 参数值" 形式的参数,例如 a = 1 和 b = 2,被称为关键字参数。在函数定义中,在参数前加上符号 **
参数表示函数可以接收关键字参数,如下所示:
python
def add(*args, **kwargs):
add(1,2,3, name='CV大魔王',age=33) # 1,2,3对应*args
# name='CV大魔王',age=33 对应**kwargs,**kwargs本质上就是字典
案例
python
def test(*args, **kwargs):
for ar in args:
print(ar)
print(kwargs.keys())
test(1, 1, 3, name='CV大魔王', age=33)
运行结果如下
python
1
1
3
dict_keys(['name', 'age'])
参数定义类型的方法
参数后加:数据类型
即可指定参数的数据类型,这个和TypeScript类似,后面加上=
同样可以指定默认数据。
python
def test(name: str, age: int = 33):
print(name)
print(age)
需要注意的是,如果传入的类型和定义的类型不匹配,编译一样可以通过,换句话来说,这就是给程序员看的,python3.7开始支持此写法。
匿名函数lambda
python
f = lambda: 1
print(f())
f1 = lambda x, y: x + y
print(f1(2, 3))
f2 = lambda: print(1)
f2()
是不是感觉没有什么用?来看看实际使用场景,list列表中的sort排序函数,有一个参数key能够根据某个参数进行排序,使用方式如下:
python
users = [
{'name': 'name1', 'age': 20},
{'name': 'name2', 'age': 18},
{'name': 'name3', 'age': 21},
]
users.sort(key=lambda x: x['age']) # 根据age进行排序
print(users)