函数
A.定义
1.定义一个函数
#语法 def 函数名(参数1,参数2,参数3,...): '''注释''' 函数体 return 返回的值 #函数名要能反映其意义
2.函数返回值
(1)函数体内部的语句执行是,一旦执行到return时,函数就执行完毕,并将结果返回。
(2)如果没有return语句,函数执行完毕也会有返回结果,只是结果为none
def test01(): msg = 'test01' print(msg) print(test01())
(3)return返回一个值
def test02(): msg = 'test02' return msg print(test02())
(4)return返回一堆值,最后返回的是一个元组
def test03(): msg = 'test03' return 1,2,3,4,'a',['alex'],{'name':'alex'},None print(test03())
B.函数的参数
1.位置参数,按照从左到右的顺序定义的参数
def calc(x, y): t = x**y return t res = calc(2,3) print(res)
这个函数体验两个参数,都是位置参数,调用函数是,传入的两个值按照位置顺序依次赋给参数x,y
2.默认参数
def handle(x, type='mysql', name="haha"):
print(x)
print(type)
print(name)
handle('hello')
注意:(1)必须在位置参数后面
(2)不用默认参数时,要赋新值,会覆盖掉原来的参数
a.按顺序依次给
handle('hello', 'maya', 'tiana')
b.不想按顺序,就要把参数名写上
handle('hello', name='tiana', type='maya')
(3)默认参数最大的坑,最好不要把默认参数设置成一个列表,最好是不变对象如str,none
3.可变参数 参数名前面加一个“*”
传入的参数个数不确定,随便多少个都行,下面的例子参数是1,2,3 也可以是别的,个数没有限制
def calc(*numbers): #计算a*2 + b*2 + c*2 + …… sum = 0 for n in numbers: sum = sum + n * n return sum print(calc(1, 2, 3))
函数内部,参数numbers接收到的是一个元组
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum nums = (1, 2, 3, 4, 5,) t = calc(*nums) print(t)
*nums表示把nums这个元组中的所有元素作为可变参数传进去,这种写法相当有用,而且常见
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
4.关键字参数
函数person(),前两个参数是必选参数(位置参数),最后一个是关键词参数kw,起扩展函数的功能
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) person("Mike",30, city='Beijing')
(1)情况一
def foo(x, y, **kwargs): print(x, y) print(kwargs) foo(1, y=2, a=1, b=2, c=3)
(2)情况二
def foo(x, y, **kwargs): print(x, y) print(kwargs) dic = {'a': 1, 'b': 2, 'c': 3} foo(1, y=2, **dic)
**dic表示把dic这个字典的所有key-value值用关键字参数传入到函数的**kwarge参数
5.命名关键字参数 限制关键字参数的名字
(1)命名关键字参数需要一个特殊分隔符“*”,“*”后面的参数被视为命名关键字参数
def person(name, age, *, city, job): print(name, age, city, job) person('Jack', 24, city='Beijing', job='Engineer')#命名关键字参数必须传入参数名,这和位置参数不同。
(2)如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*
了:
def person(name, age, *args, city, job): print(name, age, args, city, job)
(3)命名关键字参数也可以有默认值
def person(name, age, *, city='Beijing', job): print(name, age, city, job)
person('Jack', 24, job='Engineer')
调用时可不传入city参数
6.参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def f1(a, b, c=0, *args, **kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) def f2(a, b, c=0, *, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)