查看原文
其他

详解Python模块、包、库

pythonic生物人 pythonic生物人 2022-12-04

本文目录

1.模块

定义模块

导入模块

调用模块中函数

方法1 模块名.函数名
方法2 from 模块名 import 函数名1.函数名2,..
方法3 from 模块名 import *

给模块取个别名

给模块中函数取个别名

以脚本的方式执行模块

__name__怎么理解

查看模块中的属性:dir函数

导入模块时sys.path怎么理解


2.包(库)

建立一个包

包中__init__.py文件作用

从包中导入单个模块

方法1
方法2

从包中导入所有模块

正文开始啦

1.模块

python模块是一个包含Python定义和语句的文件(就是一个.py结尾的脚本文件);
文件名为模块名,文件后缀为 .py;
在一个模块内部,模块名可以通过 __name__方法获得。

定义模块

定义一个模块fibo,即创建一个fibo.py文件。#fibo.py

# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result

导入模块

python习惯上把所有 import 语句放在脚本的开头,全局调用。

>>> import fibo#导入模块fibo
>>> fibo.__name__#__name__方法获得模块fibo的模块名
'fibo'

调用模块中函数

方法1 模块名.函数名

>>> import fibo
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

方法2 from 模块名 import 函数名1.函数名2,..........

>>> from fibo import fib,fib2#多个函数名之间使用逗号隔开
>>> fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

方法3 from 模块名 import *

*表示该模块中所有的函数,会导致代码可读性差(不建议使用)。

>>> from fibo import *
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

给模块取个别名

import 模块名 as 别名

>>> import fibo as fb
>>> fb.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

给模块中函数取个别名

from 模块名 import 函数名 as 函数别名

>>> from fibo import fib2 as fb2
>>> fb2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

以脚本的方式执行模块

#fibo.py

# Fibonacci numbers module
def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result

if __name__ == "__main__":
        print("现在该模块被当做脚本执行啦!")
        print(("此时__name__ == %s"%(__name__)))#此时模块的__name__为__main__
        import sys
        result = fib2(int(sys.argv[1]))
        print(result)

> python fibo.py 100#if __name__ == "__main__":之后代码块执行了(常用于测试)
现在该模块被当做脚本执行啦!
此时__name__ == __main__
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

__name__怎么理解

__name__是个全局变量,存放模块的名字;
当该模块被其它模块调用时,__name__=模块名,对于fibo.py,__name__="fibo";
当该模块被当做执行脚本时,__name__为__main__( A module’s __name__ is set equal to '__main__' when read from standard input, a script, or from an interactive prompt)。
对于fibo.py,如果终端执行 python fibo.py 100 ,if __name__ == "__main__":后面代码会执行;如果在别的模块中执行import fibo,,if __name__ == "__main__":后面代码不会执行。
>>> import fibo#if __name__ == "__main__":之后代码块没执行
>>>

查看模块中的属性:dir函数

>>> import fibo
>>> dir(fibo)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib', 'fib2']

以__开头和结尾的属性为python的内置属性;
'fib', 'fib2'为自定义属性。

导入模块是sys.path怎么理解

sys.path收集python模块的所有搜索路径,可以自己添加搜索路径(sys.path.append('yourpath'))举个栗子:

#test.py
#!/usr/bin/python
import sys
sys.path.append('~/biosoft/')
print(sys.path)
> python test.py
['/home/pylearning', 
 '/home/software/anaconda3/lib/python37.zip',
 '/home/software/anaconda3/lib/python3.7', 
 '/home/.local/lib/python3.7/site-packages', 
'/home/software/anaconda3/lib/python3.7/site-packages',
'~/biosoft/'
]

任何一个python程序执行时,会搜索其导入模块的路径,先搜索内置模块路径;
然后搜索sys.path收集的路径,sys.path中路径依次为:

['/home/pylearning', #被执行程序test.py所在路径'/home/software/anaconda3/lib/python37.zip','/home/software/anaconda3/lib/python3.7', #环境变量PYTHONPATH中路径'/home/.local/lib/python3.7/site-packages', #标准库路径'/home/software/anaconda3/lib/python3.7/site-packages',#标准库路径'~/biosoft/'#自己添加路径]


2.包(库)

建立一个包

sound包包含formats,effects,filters三个子包。

sound/                          #Top-level package(顶层包sound)
      __init__.py              #该文件可以为空,只有该文件存在时sound才会被当做包而不是目录
      formats/                  #Subpackage(子包)
              __init__.py     #同上,该文件存在时,formats才会被当做包而不是目录
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              haha.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
             haha.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

包中__init__.py文件作用
只有目录中添加__init__.py文件时,目录才会被当做包而不是目录;
__init__.py 可以为空;
__init__.py中可以设置 __all__ 变量,这个变量主要影响包的导入
- 对于上文的sound包,sound/filters/__init__.py中输入__all__ == ["equalizer", "vocoder"]时,from sound.filters import *时不会导入karaoke模块。

从包中导入单个模块

导入sound包中子包effects中的echo模块

方法1

import sound.effects.echo引用它时必须使用它的全名,sound.effects.echo(xxx)。

方法2

from sound.effects import echo引用方法,echo(xxx)

从包中导入所有模块

from sound.effects import *引用方法,echo(xx)


参考资料

https://docs.python.org/zh-cn/3.8/library/__main__.html?highlight=__main__#module-__main__https://www.zhihu.com/question/49136398https://blog.konghy.cn/2017/04/24/python-entry-program/https://docs.python.org/zh-cn/3/tutorial/modules.html


同系列文章

python3基础09列表推导式|迭代器|生成器|匿名函数
python3基础10面向“对象”编程
python3基础11异常处理|文件读取|文件写入

-END-

👇点击阅读更多👇

Python可视化

Python入门及提高

统计学入门及提高

R可视化

关注「pythonic生物人」

加微信群:扫码备注学习

日拱一卒无有尽,功不唐捐终入海!「❤️动手点个赞、在看❤️」   

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存