task12
经过前面的学习,我们知道对于Python代码可以写到一个文件中。但是随着程序不断变大,为了方便维护,需要将其分成多个文件,这样可以提高代码的可维护性。另外,使用模块还可以提高代码的可重用性,即编写好一个模块之后,只要是实现该功能的程序,都可以导入这个模块中。
一.创建模块
①自定义模块
创建模块可以将模块中相关的代码(变量定义和函数定义等)编写在一个单独的文件中,并且将该文件命名为“模块名+.py”的形式。
ps:在创建模块时,设置的模块名不能是Python自带的标准模块名。如果设置了相同的模块名称,那么在导入该模块后,Python自带的标准模块就不能再导入了。
eg:
#demo.py
def fun_bj(a,b,c):
'''功能:比较输入的三个人成绩的高低
a:第一名同学的成绩
b:第二名同学的成绩
c:第三名同学的成绩
'''
if a>b
if b>c
print("第一名同学成绩最好,第二名同学成绩次之,第三名同学成绩最末")
elif a>c
print("第一名同学成绩最好,第三名同学成绩次之,第二名同学成绩最末")
else
print("第三名同学成绩最好,第一名同学成绩次之,第二名同学成绩最末")
else
if a>c
print("第二名同学成绩最好,第一名同学成绩次之,第三名同学成绩最末")
elif b>c
print("第二名同学成绩最好,第三名同学成绩次之,第一名同学成绩最末")
else
print("第三名同学成绩最好,第二名同学成绩次之,第一名同学成绩最末")
注意:模块文件的扩展名必须是.py
②使用Python标准库中模块
eg:
import sys
>>> for i in sys.argv:
print(i)
>>> print('\n\nPython 路径为:',sys.path,'\n')
二.导入模块
①使用import语句导入模块
在创建模块之后,就可以在其他程序中使用该模块了。要使用模块需要先模块的形式加载模块中的代码,可以使用import语句实现。
语句格式:import modulename [as alias]
参数说明:
modulename是要导入模块的名称
[as alias]为给模块取的别名,通过该别名也可以使用模块
eg:
import bj
bj.fun_bj(98,93,95)
②使用from…import语句导入模块
在使用import语句导入模块时,每执行一条import语句都会创建一个新的命名空间,并且在该命名空间中执行与.py文件相关的所有语句。在执行时,需要在具体的变量、函数和类名前加上“模块名.”前缀。如果不想在每次导入模块时都会创建一个新的命名空间,而是将具体的定义导入到当前的命名空间中,这时可以使用from…import语句。使用该语句导入模块后,不需要再添加前缀,直接通过具体的变量、函数和类名等访问即可。
语法格式:from modelname import member
参数说明:
modelname:模块名称,区分大小写,需要和定义模块时设置的模块名称大小写保持一致
member:用于指定要导入的变量、函数或者类等。可以同时导入多个定义,各个定义之间使用逗号“,”进行分隔。如果想导入全部定义,也可以使用通配符“*”代替。
在导入模块时,如果使用通配符“*”导入全部定义后,可以通过显示dir()函数的值来查看。
比如在执行print(dir())语句后将显示类似下面的内容:
eg:
from bj import fun_bj
from bj import fun_bj,fun_bj_upgrade
from bj import *
三.深入模块
模块除了方法定义,还可以包括可执行的代码。这些代码一般用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。
每个模块有各自独立的符号表,在模块内部为所有的函数当作全局符号表来使用。
所以,模块的作者可以放心大胆的在模块内部使用这些全局变量,而不用担心把其他用户的全局变量搞混。
从另一个方面,当你确实知道你在做什么的话,你也可以通过 modname.itemname 这样的表示法来访问模块内的函数。
模块是可以导入其他模块的。在一个模块(或者脚本,或者其他地方)的最前面使用 import 来导入一个模块,当然这只是一个惯例,而不是强制的。被导入的模块的名称将被放入当前操作的模块的符号表中。
还有一种导入的方法,可以使用 import 直接把模块内(函数,变量的)名称导入到当前操作模块。
# 斐波那契(fibonacci)数列模块
def fib(n): # 定义到 n 的斐波那契数列
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()
def fib2(n): # 返回到 n 的斐波那契数列
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
>>>fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
这种导入的方法不会把被导入的模块的名称放在当前的字符表中(所以在这个例子里面,fibo 这个名称是没有定义的)。
这还有一种方法,可以一次性的把模块中的所有(函数,变量)名称都导入到当前模块的字符表:
>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
这将把所有的名字都导入进来,但是那些由单一下划线(_)开头的名字不在此例。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。
四.包(Package)
包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下。这样,既可以起到规范代码的作用,又可以避免模块名重名引起的冲突。
1.创建包
创建包实际上就是创建一个文件夹,并且在该文件夹中创建一个名称为“init.py”的Python文件。在_init_.py文件中,可以不编写任何代码,也可以编写一些Python代码。在_init_.py文件中所编写的代码,在导入包时会自动执行。
2.使用包
创建包之后,就可以在包中创建相应的模块,然后再使用import语句从包中加载模块。
包中加载模块有三种方式:
①“import+完整包名+模块名”
该方式是指:假如有一个名称为settings的包,在该包下有一个名称为size的模块,那么要导入size模块,可以使用下面的代码:
import settings.size
import setting.size
width=30
height=20
import setting.size
if _name_=='main':
print('宽度:',setting.size.width)
print('高度:',setting.size.height)
#宽度:30
高度:20
②“from+完整包名+import+模块名”
该方法是指:假如有一个名称为setting的包,在该包下一个名称为size的模块,那么要导入size模块,可以使用下面的代码:
from setting import size
from settings import size
if _name_=='_main_':
print('宽度:',size.width)
print('高度:',size.height)
#宽度:30
高度:20
③“from+完整包名+import+模块名+定义名”
该方法是指:假如有一个名称为setting的包,在该包下一个名称为size的模块,那么要导入size模块中的width和height,可以使用下面的代码:
from setting.size import width,height
from setting.size import width,height
if _name_=='_main_':
print('宽度:',size.width)
print('高度:',size.height)
#宽度:30
高度:20
以上就是我整理的task12的全部内容,感谢你的浏览。
参考文献:
https://www.runoob.com/python3/python3-tutorial.html