1.定义函数
函数的定义采用如下形式:
def 函数名(参数列表): 函数体
需要注意的点:
(1)没有return语句时,函数执行完毕也会返回结果,结果为None。
(2)return None可以简写成return
(3)再Python中定义函数时,需要保持函数体中同一层级的代码缩进一致。
如果还没想好如何写这个函数,可以用pass语句,先让代码执行起来:
def donothing(): pass donothing()
2.函数的参数
调用函数时可以使用以下参数类型:
(1)必须参数
(2)关键字参数
(3)默认参数
(4)可变参数
(5)组合参数
2.1必须参数
必须参数必须以正确的顺序传入函数,调用时数量必须和声明时一样。
def paramone(n): print('我是一个传入参数:',n) paramone('hello world!')
#输出
我是一个传入参数: hello world!
2.2关键字参数
函数调用使用关键字参数确定传入的参数值。
使用关键字参数允许调用函数时的顺序与声明时不一致,解释器能够用函数名匹配参数值
def personinfo(age,name): print('age:',age) print('name:',name) personinfo(23,'chen') personinfo(name='chen',age=24)
#输出
age: 23
name: chen
age: 24
name: chen
2.3默认参数
调用函数时,如果没有传递参数,就会使用默认参数和其参数值
使用默认参数,就是在定义函数时,给参数一个默认值,如果调用函数时没有重新给这个参数赋值,就会使用默认值
def personinfo(age=23,name='chen'): print("age:",age) print('name:',name) personinfo() personinfo(age=30)
注意一点,有默认参数值得参数必须放在非默认参数的后面,否则编译不通过
def personinfo(age=23,name):#默认参数放在非默认参数前面 print("age:",age) print('name:',name) personinfo(age=30)
#输出(报错)
File "D:/practice/python program/practice2.py", line 6
def personinfo(age=23,name):
^
SyntaxError: non-default argument follows default argument
def personinfo(name,age=23):#默认参数在非默认参数的后面 print("age:",age) print('name:',name) personinfo(name='chen',age=30)
#输出
def personinfo(name,age=23):
print("age:",age)
print('name:',name)
personinfo(name='chen',age=30)
特别要注意一下几点:
(1)无论有多少个默认参数,默认参数都不能在必须参数之前
(2)无论有多少默认参数,若不传入默认参数值,则使用默认值
(3)若要更改某一个默认参数值,又不想传入其他默认参数,且该默认参数的位置不是第一个,则可以通过参数名更改想要更改的默认参数值
(4)若有一个默认参数通过传入参数名更改参数值,则其他想要更改的默认参数都需要传入参数名更改参数值,否则报错。
(5)更改默认参数值时,传入默认参数的顺序不需要根据定义的函数中的默认参数的顺序传入,不过最好同时传入参数名,否则容易出现执行结果与预期不同
2.4可变参数
如果需要一个函数能够处理的参数比声明时更多,这些参数叫做可变参数,可变参数声明时不会命名。
def personinfo(name,*other): print(name) print(other) personinfo('chen',21,'zhejiang','yuyao')
#输出
chen
(21, 'zhejiang', 'yuyao')
可见加了星号(*)的变量名会存放所有未命名的变量参数,如果变量参数在函数调用时没有指定参数,就是一个空元组,我们也可以不向可变函数传递未命名的变量。
在函数内部,参数钱的星号将所有值放在同一个元组中,通过这种方式将这些值收集起来,然后使用。
需要注意的是,有可变参数存在时,调用函数时,不可变参数就不能使用关键字参数传递参数值,一定要使用必须参数。
def personinfo(name,*other): print(name) print(other) personinfo(name='chen',21,'zhejiang','yuyao')#使用关键字参数的后果
#输出
File "D:/practice/python program/practice2.py", line 9
personinfo(name='chen',21,'zhejiang','yuyao')
^
SyntaxError: positional argument follows keyword argument
可以使用两个星号来处理关键字参数,
other={'age':24,'hobby':'badminton'} def personinfo(name,**kw): print(name) print(kw) personinfo('chen',**other)
#输出
chen
{'age': 24, 'hobby': 'badminton'}
此处**other表示把other这个字典的所有key-value用关键字传入到函数的**kw参数,kw将获得一个字典,注意kw获得的字典是other复制的,对kw的改动不会影响到函数外的other
2.5组合参数
在python中定义函数可以用必须参数,关键字参数,默认参数,和可变参数,这4种参数可以组合使用,注意定义参数的顺序必须是必须参数,默认参数,可变参数和关键字参数
举个栗子:
def exp(p1,p2,df=0,*vart,**kw): print('p1=',p1,'p2=',p2,'df=',df,'vart=',vart,'kw=',kw) exp(1,2) exp(1,2,c=3) exp(1,2,3,'a','b') exp(1,2,3,'abc',x=9)#c=3或x=9以key-value的形式传入到函数的**kw参数
#输出
p1= 1 p2= 2 df= 0 vart= () kw= {}
p1= 1 p2= 2 df= 0 vart= () kw= {'c': 3}
p1= 1 p2= 2 df= 3 vart= ('a', 'b') kw= {}
p1= 1 p2= 2 df= 3 vart= ('abc',) kw= {'x': 9}
由输出结果看到,使用了组合参数,在调用函数时,python解释器会自动按照参数位置和参数名把对应的参数传进去。
还可以使用tuple和dict调用上述函数,使用方式如下:
def exp(p1,p2,df=0,*vart,**kw): print('p1=',p1,'p2=',p2,'df=',df,'vart=',vart,'kw=',kw) arg=(1,2,3,4) dic={'x:':8,'y:':9} exp(*arg,**dic)
#输出
p1= 1 p2= 2 df= 3 vart= (4,) kw= {'x:': 8, 'y:': 9}
由此可见,任何函数都可以通过类似func(*arg,**dic)的形式调用,无论参数是如何定义的。