文章目录
1、定义一个函数
def test(x):
y=2*x
return y
2、参数
调用函数时可使用的正式参数类型:
- 必需参数
- 关键字参数
- 默认参数
- 不定长参数
2.1、位置参数
参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样,不然会出现语法错误。
2.2、关键字参数
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
如果参数中还有其他参数,所有的位置参数必须在关键字参数左边
def test(name, age):
print("姓名:", name)
print("年龄:", age)
test(name="锄禾", age=18)
输出:
姓名: 锄禾
年龄: 18
2.3、默认参数
调用函数时,如果没有传递参数,则会使用默认参数。
def test(name, age=18):
print("姓名:", name)
print("年龄:", age)
test("锄禾")
输出:
姓名: 锄禾
年龄: 18
2.4、不定长参数
2.4.1、*args和 **kwargs
def foo(*args, **kwargs):
print('args = ', args)
print('kwargs = ', kwargs)
print('---------------------------------------')
if __name__ == '__main__': #__name__应该是内置变量,可以打印出来看一下
foo(1, 2, 3, 4)
foo(a=1, b=2, c=3)
foo(1, 2, 3, 4, a=1, b=2, c=3)
foo('a', 1, None, a=1, b='2', c=3)
输出结果:
args = (1, 2, 3, 4)
kwargs = {}
---------------------------------------
args = ()
kwargs = {'a': 1, 'b': 2, 'c': 3}
---------------------------------------
args = (1, 2, 3, 4)
kwargs = {'a': 1, 'b': 2, 'c': 3}
---------------------------------------
args = ('a', 1, None)
kwargs = {'a': 1, 'b': '2', 'c': 3}
---------------------------------------
args 表示任何多个无名参数,它是一个tuple(元组);
**kwargs 表示关键字参数,它是一个dict(字典)。
并且同时使用args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b=‘2’, c=3, a’, 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。
2.4.2、**kwargs创建字典
**kwargs有个经典的用法,就是创建字典
def kw_dict(**kwargs):
return kwargs
print(kw_dict(a=1, b=2, c=3))
输出
{'a': 1, 'b': 2, 'c': 3}
2.4.3、*args和默认参数
*args与位置参数和默认参数混用:*args要放到位置参数后面,默认参数要放最后。
# *args与位置参数和默认参数混用:*args要放到位置参数后面,默认参数要放最后。
def foo(x, *args, y=1):
print(x)
print(y)
print(args)
foo(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, y=10000) # 调用函数
输出:
1
10000
(2, 3, 4, 5, 6, 7, 8, 9, 10)
2.4.4、**kwargs和默认参数
def foo(x,a = 4,**kwargs):
print(x)
print(a)
print(kwargs)
print("***************")
foo(1,y=2,z=3) #使用默认参数
foo(1,5,y=2,z=3) #不使用默认参数,默认参数按位置参数传值
foo(1,a=5,y=2,z=3) #不使用默认参数,默认参数按顺序
foo(1,y=2,z=3,a=5) #不使用默认参数,默认参数放最后
输出:
1
4
{'y': 2, 'z': 3}
***************
1
5
{'y': 2, 'z': 3}
***************
1
5
{'y': 2, 'z': 3}
***************
1
5
{'y': 2, 'z': 3}
***************
2.4.5、默认参数在*args、**kwargs中间
def foo(x, *args, a=4, **kwargs): # 使用默认参数时,注意默认参数的位置要在args之后kwargs之前
print(x)
print(a)
print(args)
print(kwargs)
print("********************")
foo(1, 5, 6, 7, 8, y=2, z=3) # 使用默认参数
foo(1, 5, 6, 7, 8, a=9,y=2, z=3) #默认参数可以在args参数后,任意位置
foo(1, 5, 6, 7, 8, y=2, a=9,z=3) #默认参数可以在args参数后,任意位置
foo(1, 5, 6, 7, 8, y=2, z=3,a=9,) #默认参数可以在args参数后,任意位置
输出:
1
4
(5, 6, 7, 8)
{'y': 2, 'z': 3}
********************
1
9
(5, 6, 7, 8)
{'y': 2, 'z': 3}
********************
1
9
(5, 6, 7, 8)
{'y': 2, 'z': 3}
********************
1
9
(5, 6, 7, 8)
{'y': 2, 'z': 3}
********************
2.4.5、默认参数在*args、**kwargs前
这种情况,好像无法使用默认值
#注意:当需要修改默认参数时,要调整默认参数的位置,要放在args之前即可,但不可放在开头。
def foo(x,a=4,*args,**kwargs):
print(x)
print(a)
print(args)
print(kwargs)
foo(1,9,5,6,7,8,y=2,z=3)
输出:
1
9
(5, 6, 7, 8)
{'y': 2, 'z': 3}
3、返回值
- python中函数可以有多个返回值
def foo():
return 1,2,"abc"
print(foo())
输出:(1, 2, ‘abc’)
- return后无值默认返回None
def foo():
return
print(foo())
输出:None