python基础(7)模块&包

模块&包

模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库(sys等)的方法。

image-20200921152215818

import 语句

import module1[, module2[,... moduleN]

当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入

搜索路径是一个解释器会先进行搜索的所有目录的列表。查看搜索路径有哪些:

import sys
for paths in sys.path:
    print(paths)

我个人的运行结果截图:

image-20200921162137648

搜索路径默认是有当前的项目的路径的,如果想要导入的是模块的.py文件在项目路径下,直接import就可以导入:

image-20200921163923191

import直接导入使用:

image-20200921165935903

from ... import 语句

Pythonfrom 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:

from modname import name1[, name2[, ... nameN]]

顺便提一下directorypackage的区别:

image-20200921170921316

  • Directory:在pycharm中就是一个文件夹,放置资源文件等,该文件夹其中并不包含__ init.py__文件
  • Package:对于Python package 文件夹而言,与Dictionary不同之处在于其会自动创建__ init.py__ 文件。简单的说,python package就是一个目录,其中包括一组模块和一个__ init.py__文件。目录下具有init.py文件,这样可以通过from … import的方式进行.py文件的导入。

所以,在package里面的.py模块,可以通过from ... import ... 语句来进行导入

image-20200921171207893

from … import * 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的

注意事项

1、一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。

因此,当导入自己自定义的模块时,如果导入第一次之后,模块又被修改了,记得点击重新运行,这样才能重新导入模块,否则会出现问题,因为导入的模块不会重新导入。在pycharm里面,方法如下:

image-20200921172041008

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"):

image-20200921172912667

__name__属性

__name_标识了一个模块的名称,一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。

#!/usr/bin/python3
# Filename: using_name.py

if __name__ == '__main__':
   print('程序自身在运行')    #此段代码是私有的
else:
   print('我来自另一模块')    

运行输出如下:

自己运行:

image-20200921181456745

在另一个模块导入:

image-20200921181439952

dir()函数

内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:

image-20200921182156982

运行上面的demo.py后,dir()查看所有名称:

['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'demo2', 'mymath', 'sys']

包 package

image-20200921182904684

包是一种管理 Python 模块命名空间的形式,采用"点模块名称",比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B

不同包中的模块互不影响。一种可能的包结构如下,包里面可以包含子包

image-20200921182829091

目录只有包含一个叫做 __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

posted @ 2020-08-30 23:50  Whatever_It_Takes  阅读(137)  评论(0编辑  收藏  举报