函数和模块的使用
函数
函数的作用
避免重复,代码有很多种坏味道,重复是最坏的一种!如果一个功能在函数中重复了很多次,我们可以将这个功能封装到一个函数当中,在需要用到这个功能的时候,我们只需要将其调用即可。
函数的使用
我们需要用关键词def来定义函数,在函数名后面的圆括号中可以放置传递给函数的参数,在函数执行完成后,我们可以通过return关键字来返回值。
函数的参数
函数是绝大多数编程语言都支持的一个代码的构建块。在Python中,函数的参数值可以有默认值,也支持使用可变参数,所以Python并不需要像其他语言一样支持函数的重载,因为我们在定义函数时可以让它有多种不同的使用方式。
def name (n = 5):
"""函数名字为name,默认值为5"""
for x in range (n):
print('我爱学Python')
name ()
#输出五次我爱学Python
name (3)
#输出三次我爱学Python
我们也可能会对0个或多个参数进行加法运算,而具体有多少个参数是由调用者来决定的,因此在不确定参数个数时,我们可以使用可变参数,在参数名前加*表示这是一个可变参数.
# 在参数名前面的*表示args是一个可变参数
def add(*args):
total = 0
for val in args:
total += val
return total
# 在调用add函数时可以传入0个或多个参数
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))
用模块管理函数
在多人协作进行团队开发时,我们有可能会把一个相同的名字命名给不同功能的函数导致程序无法实行.我们该怎么解决这种问题呢?
答案很简单,Python中每一个文件就代表了一个模块,我们在不同的模块当中,可以有相同命名的函数.只需要用关键字import来导入指定模块就可以区分到底使用的是哪个模块当中的函数.
如果有一个模块被命名为m1,另一个模块被命名为m2.两个都含有一个同名功能却不同的函数han
- 我们可以这样使用
from m1 import han
han () - 也有另外一种用法
import m1 as han
import m2 as han
m1.han()
m2.han() - 但如果写成下面的格式,最后调用的哪个模块的函数会覆盖掉之前调用的模块的函数.
from m1 import han
from m2 import han
han()
值得注意的是
如果我们导入的模块除了定义函数之外,还有可以执行的代码.那么Python解释器在导入这个模块的时候,就会执行这些代码,当我们一般并不希望这么做,所以如果我们在模块中编写了执行代码,最好将这些执行代码放入如下所示的条件中,这样的话,除非直接运行该模块,if条件下的这些代码是不会执行的,因为只有直接执行的模块的名字才是"main"。而__name__是Python中一个隐含的变量它代表了模块的名字。
关于函数定义域的讨论
Python查找一个变量时会按照四个作用域来进行查找,这四个作用于分别是:“局部作用域”,“嵌套作用域”,“全局作用域"和"内置作用域”
- 局部作用域:定义在函数1内部的局部变量x,在函数1的外部并不能访问.若该函数内,又重新定义了另一个函数2.那么函数2也可以访问该变量.
- 嵌套作用域:对于函数2来说,x就属于嵌套作用域.但是,函数2中又重新定义的变量y,不可以被函数1访问.
- 全局作用域:没有定义在任何一个函数中.任何函数都可以访问.
- 内置作用域:Python内置的标识符,即int,print等.
我们也可以在函数中用global来定义函数,从而声明其为全局变量.同理,如果我们希望函数内部的函数能够修改嵌套作用域中的变量,可以使用nonlocal关键字来指示变量来自于嵌套作用域