函数
如果我们要计算一个圆的面积,就需要知道它的半径,然后根据公式S=3.14*r*r算出它的面积,如果我们要算100个圆的面积,则每次我们都需要写公式去计算,是不是很麻烦,但是有了函数的话,我们就不再每次写S=3.14 *r*r , 而是把计算圆面积的功能写到一个函数里比如说s=areacircle(r),然后每次求面积的时候,只要把半径传递给函数就可以实现计算圆面积,这样我 们写代码就简单多了。这就是函数的功能。在编程中,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,能提高应用的模块性,和代码的重 复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
那么,Python中如何定义函数呢?
定义一个函数要使用def 语句,依次写出函数名、括号、括号中的参数和冒号: ,然后,在缩进块中编写函数体,函数的返回值用return 语句返回。
定义一个简单的无参数的函数
1 2 3 4 5 | >>> def test1():
... print ( 'Hello,World!' )
...
>>> test1()
Hello,World!
|
定义一个有参数的,求和函数
1
2
3
4
5
6
7
|
def sum (a,b): #定义函数
ret = a + b #函数体
return ret #函数返回
print ( sum ( 1 , 2 )) #调用函数并打印出结果
#如果没有return语句,函数执行完毕后也会返回结果,只是结果为None,函数执行到return就会结束,不再执行函数体内其他代码
|
函数的参数
函数有三种不同的参数:
普通参数:
1 2 3 4 5 6 7 8 9 | # ######### 定义函数 #########
# name 叫做函数func的形式参数,简称:形参
def func(name):
print (name)
# ######### 执行函数 #########
# 'xiaoyao' 叫做函数func的实际参数,简称:实参
func( 'xiaoyao' )
|
默认参数:
1 2 3 4 5 6 7 8 9 | >>> def func(name, age = 18 ):
... print ( "%s:%s" % (name,age))
...
>>> func( 'xiaoyao' ) # 默认参数在不指定的时候,就是默认值
xiaoyao: 18
>>> func( 'xiaoyao' , 20 ) # 一旦指定,就不再使用默认值
xiaoyao: 20
注:默认参数需要放在参数列表最后,可以有多个默认参数
|
指定参数:
1 2 3 4 5 | >>> def func(name, age):
... print ( "%s:%s" % (name,age))
...
>>> func(age = 20 ,name = 'xiaoyao' ) # 可以通过形参名称,不按顺序的传入参数
xiaoyao: 20
|
动态参数:
1.*args
1 2 3 4 5 6 7 8 9 10 | >>> def chao( * args): # *args 具有超能力,可以把传入的所有参数都放到一个元组里
... print (args, type (args))
...
>>> chao( 1 , 2 , 3 , 4 )
( 1 , 2 , 3 , 4 ) < class 'tuple' >
>>> chao([ 'a' , 'e' , 45 ])
([ 'a' , 'e' , 45 ],) < class 'tuple' >
>>> chao( * [ 'a' , 'e' , 45 ]) #如果传入参数时在前面加“*”,它会将每个元素分别传入,当作元组的一个元素。不加“*”的时候会把整体当作元组的一个元素
( 'a' , 'e' , 45 ) < class 'tuple' >
|
2.**kwargs
1 2 3 4 5 6 7 8 9 10 11 | >>> def chao2( * * kwargs):
... print (kwargs, type (kwargs))
...
>>> chao2(name = 'xiaoyao' ) # 将参数当作字典传入,所以必须用指定参数的方式
{ 'name' : 'xiaoyao' } < class 'dict' >
>>> dic = { 'name' : 'xiaoyao' , 'age' : 20 }
>>> chao2(key1 = dic)
{ 'key1' : { 'name' : 'xiaoyao' , 'age' : 20 }} < class 'dict' ><br>
>>> chao2( * * dic) #如果传入参数时在前面加“**”,它会将每个元素分别传入,当作字典的一个键值对。不加“**”的时候会把整体当作字典的一个键值对
{ 'name' : 'xiaoyao' , 'age' : 20 } < class 'dict' >
|
3.*args,**kwargs(万能参数)
1 2 3 4 5 6 7 8 9 10 11 12 13 | >>> def f1( * args, * * kwargs): # *args,**kwargs 顺序不能变
... print (args)
... print (kwargs)
...
>>> f1( 11 , 22 , 555 ,name = 'xiaoyao' ,age = 20 )
( 11 , 22 , 555 )
{ 'name' : 'xiaoyao' , 'age' : 20 }
>>> f1( 11 , 22 , 555 , 5 )
( 11 , 22 , 555 , 5 )
{}
>>> f1(name = 'xiaoyao' ,age = 20 )
()
{ 'name' : 'xiaoyao' , 'age' : 20 }
|
|