函数是经过组织的,可重复使用的,用来实现单一功能的代码块。
- 函数大大提高了代码的可重用性。
- Python自定义了一些内置函数供我们使用,内置函数是已经定义好,我们可以直接进行调用的函数。同时我们也可以自定义函数来解决实际问题
函数声明
- 使用关键字
def
对函数进行声明,def
关键字后紧跟函数名称。 - 函数名称后的括号中可定义参数,或在调用函数时向其中传入参数。
- 可以在定义函数的下一行开始加入注释对该函数进行说明。
- 函数内容从函数名后的冒号开始,以一个
tab
或四个空格位进行缩进,说明缩进内容都属于该函数。 - 在函数中代码的最后可使用
return
来返回内容,若是未使用return
,则默认返回None。
def play_basketball(parameter):
'''
我是注释
'''
function content
...
...
return xxx
- 如果想定义一个没有功能的语句,可以使用
pass
。比如你还没想好函数中的功能应该如何定义,可以先使用pass
进行占位,使代码正常运行。(pass
同样也可以用在其他代码块中,比如if
语句等)
def play_basketball():
pass
函数调用
在函数定义好后,通过调用函数以实现其中的功能,我们可以直接通过其函数名进行调用。使用return
返回的内容应该有变量对其进行接收。
def show_me(str):
"打印任何传入的字符串"
return str
# 调用函数
show_me("I am Pluto")
# 定义变量接收函数的返回值
hmh = show_me("I am Pluto"")
print(hmh)
上述代码中直接调用函数是不会有任何输出的,而使用变量接收返回值后再调用print
函数就可以将其打印出来。
函数参数
函数参数有五种,分别是位置参数、默认参数、可变参数、关键字参数、命名关键字参数
- 位置参数(必选参数)
故名思义,位置参数就是按函数定义时参数的位置顺序传入的参数
def pluto(name, age, gender):
print("pluto's name is %s" %name)
print("pluto's age is %d" %age)
print("pluto's gender is %s" %gender)
pluto('hmh', 23, 'male')
>>>
pluto's name is hmh
pluto's age is 23
pluto's gender is male
而若是我们改变了传入参数的位置,在上面示例的代码中,若是保证了参数的类型,虽然也不会报错,但就达不到我们想要实现的功能了,而在较为复杂的函数中,则有大概率会报错。
但是我们也可以使用关键词的形式传入参数,这样可以不按照参数的定义顺序。
pluto(age=23, name='hmh', gender='male')
>>>
pluto's name is hmh
pluto's age is 23
pluto's gender is male
⚠️:别名必选参数,也是在调用函数的时候,务必传入参数,才可以正常运行。否则会报错:
pluto('23', 'male')
>>>
TypeError: pluto() missing 1 required positional argument: 'gender'
- 默认参数
默认参数就像是一个预设值,在定义函数的时候就将其定义好,也就是赋予其一个默认值。这样在调用时若缺省该参数,则函数会使用在定义时的默认参数。
def pluto(name, age, gender='male'):
print("pluto's name is %s" %name)
print("pluto's age is %d" %age)
print("pluto's gender is %s" %gender)
pluto('hmh', 23)
>>>
pluto's name is hmh
pluto's age is 23
pluto's gender is male
若是在调用时传入该参数,则函数会使用传入的参数。
pluto('hmh', 23, 'female') # 我是纯爷们儿。。。
>>>
pluto's name is hmh
pluto's age is 23
pluto's gender is female
- 可变参数
可变的含义就是传入的参数数量可变,允许传入任意个参数,而这些参数会在调用的时候自动构建为一个tuple。只需在定义的参数名称前加上一个*
即可。若是在参数名前加上两个**
。
def pluto(*personalInformation):
'''
还记得下划线吗?
'''
for _ in personalInformation:
print(_)
pluto('hmh', 23, 'female')
>>>
hmh
23
female
- 关键字参数
在定义函数的参数时,若是在该参数前面使用两个**
,就将传入的参数组成一个字典dict
的形式,在传入参数的时候,又必须以字典中的键值对的形式传入。
def pluto(**personalInformation):
print(personalInformation)
pluto(name='hmh', age=23, gender='female')
>>>
{'gender': 'female', 'name': 'hmh', 'age': 23}
- 命名关键字参数
这部分需要结合关键字参数的知识去理解,对于关键字参数,调用函数时是可以接收不受限制的关键字参数,而如果我们想要限制关键字参数的名字,就可以使用命名关键字参数,使用一个特殊的分隔符*
,在该分隔符后面的参数被看作是命名关键字参数。
def pluto(name, age, *, gender='male', adress):
print("pluto's name is %s" % name)
print("pluto's age is %d" % age)
print("pluto's gender is %s" % gender)
print("pluto's adress is %s" % adress)
pluto('hmh', 23, gender='male', adress='peking')
>>>
pluto's name is hmh
pluto's age is 23
pluto's gender is male
pluto's adress is peking
⚠️:
1、命名关键字必须要传入参数,否则会报错。
2、如果函数定义中已经有了有了一个可变函数,则其后面的参数被视为命名关键字参数。
def pluto(name, age, *v, gender='male', adress):
print("pluto's name is %s" % name)
print("pluto's age is %d" % age)
print("pluto's gender is %s" % gender)
print("pluto's adress is %s" % adress)
pluto('hmh', 23, gender='male', adress='peking')
匿名函数(lambda表达式)
lambda表达式简化了函数定义的书写形式,且因为没有定义函数的名称,故称之为匿名函数(个人理解)。
g = lambda x: x + 1
print(g(1))
>>>
2
上述代码是定义了一个x+1
的功能,并将参数1传入其中进行计算,最后得到结果2。而上述代码完全可以使用常规的函数定义方式进行定义。
1、lambda表达式可以定义一个匿名函数;
2、使用该表达式并不会带来运行效率的提高,只会使代码更加的简洁;
3、若是功能较多,建议使用def
的方式进行定义,可以获得更好的重用性;
4、个人还是觉得def
常规形式更加易读易懂,而lambda表达式更像是为了专门为了功能非常简单(比如一两行的代码就可以实现的功能)的函数而设计的。