python基础(7)模块&包
模块&包
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py
。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python
标准库(sys
等)的方法。
import 语句
import module1[, module2[,... moduleN]
当解释器遇到 import
语句,如果模块在当前的搜索路径就会被导入。
搜索路径是一个解释器会先进行搜索的所有目录的列表。查看搜索路径有哪些:
import sys
for paths in sys.path:
print(paths)
我个人的运行结果截图:
搜索路径默认是有当前的项目的路径的,如果想要导入的是模块的.py
文件在项目路径下,直接import
就可以导入:
import
直接导入使用:
from ... import 语句
Python
的 from
语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:
from modname import name1[, name2[, ... nameN]]
顺便提一下directory
与package
的区别:
Directory
:在pycharm
中就是一个文件夹,放置资源文件等,该文件夹其中并不包含__ init.py__
文件Package
:对于Python package
文件夹而言,与Dictionary
不同之处在于其会自动创建__ init.py__
文件。简单的说,python package
就是一个目录,其中包括一组模块和一个__ init.py__
文件。目录下具有init.py
文件,这样可以通过from … import
的方式进行.py
文件的导入。
所以,在package
里面的.py
模块,可以通过from ... import ...
语句来进行导入
from … import * 语句
把一个模块的所有内容全都导入到当前的命名空间也是可行的
注意事项
1、一个模块只会被导入一次,不管你执行了多少次import
。这样可以防止导入模块被一遍又一遍地执行。
因此,当导入自己自定义的模块时,如果导入第一次之后,模块又被修改了,记得点击重新运行,这样才能重新导入模块,否则会出现问题,因为导入的模块不会重新导入。在pycharm
里面,方法如下:
2、模块除了方法定义,还可以包括可执行的代码。这些代码一般用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。
每个模块有各自独立的符号表,在模块内部为所有的函数当作全局符号表来使用。
所以,模块的作者可以放心大胆的在模块内部使用这些全局变量,而不用担心把其他用户的全局变量搞混。
举个例子:
mymath.py
内容:
def mysum(a,b):
c=a+b
print("hello c")
return c
print("hello world")
demo2.py
内容:
from package1 import mymath
print(mymath.mysum(34, 52))
运行两次mymath.py
,只有第一次进行导包时才会运行print("hello world")
:
__name__
属性
__name_
标识了一个模块的名称,一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__
属性来使该程序块仅在该模块自身运行时执行。
#!/usr/bin/python3
# Filename: using_name.py
if __name__ == '__main__':
print('程序自身在运行') #此段代码是私有的
else:
print('我来自另一模块')
运行输出如下:
自己运行:
在另一个模块导入:
dir()函数
内置的函数 dir()
可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
运行上面的demo.py
后,dir()
查看所有名称:
['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'demo2', 'mymath', 'sys']
包 package
包是一种管理 Python
模块命名空间的形式,采用"点模块名称",比如一个模块的名称是 A.B
, 那么他表示一个包 A中的子模块 B
。
不同包中的模块互不影响。一种可能的包结构如下,包里面可以包含子包:
目录只有包含一个叫做 __init__.py
的文件才会被认作是一个包,主要是为了避免一些滥俗的名字(比如叫做 string
)不小心的影响搜索路径中的有效模块。
1、用户可以每次只导入一个包里面的特定模块,比如:
import sound.effects.echo
这将会导入子模块:sound.effects.echo
。 他必须使用全名去访问:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
2、还有一种导入子模块的方法是:
from sound.effects import echo
这同样会导入子模块: echo
,并且他不需要那些冗长的前缀,所以他可以这样使用:
echo.echofilter(input, output, delay=0.7, atten=4)
3、还有一种变化就是直接导入一个函数或者变量:
from sound.effects.echo import echofilter