博客
关于我
python3基础梳理11python中模块和包
阅读量:377 次
发布时间:2019-03-05

本文共 4542 字,大约阅读时间需要 15 分钟。

本篇梳理python3中模块和包的使用细节。

目录

欢迎微信随缘关注@


1.模块

python模块是一个包含Python定义和语句的文件(就是一个.py结尾的脚本文件);

文件名为模块名,文件后缀为 .py;

在一个模块内部,模块名可以通过 __name__方法获得。

  • 定义模块

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

#fibo.py

# Fibonacci numbers moduledef 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 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 moduledef 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 resultif __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/pythonimport syssys.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.包

,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)


3.参考资料

  •  

欢迎微信随缘关注@

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://pdmwz.baihongyu.com/

你可能感兴趣的文章
查询某表格上次进行vacuum的时间
查看>>
invalid byte sequence for encoding
查看>>
Highgo Database故障收集脚本
查看>>
failed to initialize the database
查看>>
invalid byte sequence for encoding
查看>>
银河麒麟系统配置apt网络源
查看>>
第七周 4.12-4.18
查看>>
程序设计入门14 结构体
查看>>
程序设计基础75 tips 广度搜索细节问题
查看>>
笨办法学python之数据类型
查看>>
笨办法学Python之将对象名的字符串类型,转化成相应对象
查看>>
ArduPilot源码极速下载手册(一文告别github慢速问题)
查看>>
聊一聊那些应该了解的大佬(飞控,人工智能方向)
查看>>
ArduPilot+mavros+gazebo+QGC联合仿真初体验
查看>>
px4调试bug--添加mavlink_log_info信息
查看>>
redis替换字符串命令
查看>>
redis向数组中添加值并查看数组长度
查看>>
python3基础梳理11python中模块和包
查看>>
JS编写一个函数,计算三个不同数字的大小,按从小到大顺序打印(穷举法)
查看>>
jQuery实现轮播图效果
查看>>