python函数
一,python函数的定义和作用
1,函数的定义
- 由若干语句组成的语句块,函数名称,参数列表构成,它是组织代码的最小单元
- 完成特定的功能
- 函数定义示例:
def add(x,y): # def 关键字,define定义,定义时;add是函数名(最好做到见名知义),它是标识符,指向一个函数对象;(参数列表)参数列表中可以有n个参数,这些参数叫形式参数,简称形参
result = x + y # 函数体,语句
return result # return 返回值
- 函数调用
add(10,20) # 调用时;10,20这是实实在在的参数,称为实参
2,函数的作用
- 结构化编程中对代码最基本的封装,一般按照功能组织一段代码
- 封装的目的是为了复用,减少冗余代码
- 代码更加简介美观,更易于阅读和理解
3,函数的分类
- 内建函数,如max(),reversed()等
- 库函数,如math.ceil()等
- 自定义函数,使用def关键字定义,如def add(x,y)
4,如何给函数传实参
- 按位置传参
def add(x,y):
result = x + y
print(x,y)
return result
add(1,3),add(3,6)
1 3 # x=1,y=3 实参和形参的位置是对应的
3 6 # x = 3,y=6 实参和形参的位置是对应的
(4, 9)
- 按名称传参,也叫按关键字传参
add(x=11,y=22) # 指定x和y的值,此时实参的位置就不关紧要了
11 22
33
add(y=22,x=11)
11 22
33
- 按位置传参和按关键字传参混用
add(30,y=100)
30 100
130
add(x=30,100)
File "<ipython-input-33-d7f3cbbd3cb0>", line 1
add(x=30,100)
^
SyntaxError: positional argument follows keyword argument
由上面例子可知:按位置传参和按关键字传参可以混用,但是按位置传参必须在前,按关键字传参在后
-
4,缺省值
- 缺省值在形参中定义
- 如果函数在调用时没有传实参就可以动用设定的缺省值
- 带缺省值的形参要放在后面
def add(x=11,y=88): # y=88 就是给y这个形参设定了一个缺省值
result = x + y
print(x,y)
return result
add(10)
10 88 # 没有传实参给y,所以y就使用了设定的缺省值88
98
add(10,40)
10 40 # 给形参y传了实参40,所以y就没有使用设定的缺省值
50
add()
11 88 # x和y都没有传实参,所以都使用了缺省值
99
def add(x=10,y): # 带缺省值得形参放到了没带缺省值形参的前面,会报错。
print(x,y)
return x+y
File "<ipython-input-2-cded809fa398>", line 1
def add(x=10,y):
^
SyntaxError: non-default argument follows default argument
5,形参的定义类型
官方定义了五种形参的类型
- 普通形参:可以有缺省值,两种(按位置和按关键字)传实参方式都可以用。利如下面的例子:
def add(x,y=10):
print(x,y)
return x+y
- 可变位置形参 *args 可以接收0个或者多个按照位置传染的实参,不能接收按关键字传参,没有缺省值
def add(*args):
print(type(args),args)
add(10,20,[5])
<class 'tuple'> (10, 20, [5])
- 可变关键字形参 **kwargs 可以接收0个或者多个按关键字传入的实参,不能接收关键字传参,没有缺省值
def add(**kwargs):
print(type(kwargs),kwargs)
add(x=100,y=200)
<class 'dict'> {'x': 100, 'y': 200}
add(1,x=11)
TypeError Traceback (most recent call last)
<ipython-input-18-d312264dc3b4> in <module>
----> 1 add(1,x=11)
TypeError: add() takes 0 positional arguments but 1 was given
- keyword-only形参,*args或者*之后
def foo(*args,x,y): # x和y只能通过关键字传入实参,位置传参会被args全部接收
print(x,y,args)
foo(1,2,x=3,y=4)
3 4 (1, 2)
def foo(x,*args,y):
print(x,args,y)
foo(1,2,3,x=100,y=200) # x即可以用位置传参,也能用关键字传参,这里x重复传参了。
TypeError Traceback (most recent call last)
<ipython-input-12-d9cfc539d6ce> in <module>
----> 1 foo(1,2,3,x=100,y=200)
TypeError: foo() got multiple values for argument 'x'
def fn(*,x,y): # x,y必须接收关键字传入的实参
print(x,y)
fn(x=10,y=20)
10 20
- positional-only 形参,3.8之后支持,/之前,仅仅接收位置传入的参数
def fn(x,y,/):
print(x,y)