文档章节

python 中的模块与包

爱吃柠檬的橘子
 爱吃柠檬的橘子
发布于 2017/09/03 08:15
字数 1712
阅读 11
收藏 0
点赞 0
评论 0

原文

模块

模块就是包含 Python 定义和语句的文件. 文件的名字就是这个模块名再加上 .py. 在一个模块中, 模块的名字 (一个字符串) 可以通过全局变量 __name__ 得到. 

创建一个名为 fibo.py 的文件, 并输入以下内容:

# Fibonacci 数列模块

def fib(n):    # 打印小于 n 的 Fibonacci 数列
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()

def fib2(n): # 返回小于 n 的 Fibonacci 数列
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

访问模块中的函式(这样并不会把 fibo 中定义的函式名 导入(import) 到当前的符号表里; 它只导入了模块名 fibo. 你可以使用模块名来访问函式)

>>> import fibo

>>> 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'

 

模块不仅包含函式定义, 还可以包含可执行的语句. 这些语句一般用以初始化模块. 他们仅在模块 第一 次被导入时才被执行. [1]

模块中可以导入其它的模块. 习惯上把 import 语句放在一个模块 (或者脚本, ) 的最开始, 当然这只是惯例不是强制的. 被导入模块的名称被放入当前模块的全局符号表里.

import 语句这有一种不同用法, 它可以直接把一个模块内(函式,变量)名称导入当前模块符号表里. 例如:

>>> 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 程序员不使用这个窍门, 因为它导入了一些未知的名字到解释器里, 因此可能会意外重载一些你已经定义的东西.

 

把模块当成脚本来使用

模块有一些内置属性,用于完成特定的任务,如__name__、__doc__。每个模块都有一个名称。

例如:

__name__用于判断当前模块是否是程序的入库,如果当前程序正在被使用,__name__的值为“__main__”。通常给每个模块都添加一个条件语句,用于单独测试该模块的功能。

当你以如下方式运行一个 Python 模块时

python fibo.py <arguments>

模块中的代码就会被执行, 就像被导入时一样, 但 __name__ 被设为 "__main__" . 这就意味着通过在模块最后加入以下代码:

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

 

导入包

包就是一个完成特定任务的工具箱,为了实现程序的重用。把实现一个常用功能的代码组合到一个包中,调用包提供的服务从而实现重用。Python提供了许多有用的工具包,如字符串处理、图形用户接口、Web应用、图形图像处理等。这些自带的工具包和模块安装在Python的安装目录下的Lib子目录中。

包必须至少含有一个__int__.py文件按,该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。

 

导入模块

可以通过sys.path语句搜索模块的查找路径。当Python导入一个模块时,Python首先查找当前路径,然后查找lib目录、site-packages目录(Python\Lib\site-packages)和环境变量PATHONPATH设置的目录。如果导入的模块没有找到,手动在以上路径搜索一下是否含有这个模块。

 

导入包的常用方式

导入子模块

from sound.effects import echo

可以这样使用

echo.echofilter(input, output, delay=0.7, atten=4)

或者直接导入想要的函式或变量:

from sound.effects.echo import echofilter

* 注意: Python中的import语句比Java的import语句更加灵活。Python的import语句可以置于程序中任意的位置,甚至可以放在条件语句中。

 

从包中导入 *

当开发者写下 from sound.effects import * 会发生什么?

理想地, 我们期望程序会以以某种方法进入文件系统, 寻找在指定的包文件中,找到所有子模块, 并把它们全部导入. 这可能花费很长的时间, 而且对子模块进行显式导入时,还可能引发非期待的 副作用!

对于包作者, 唯一解决方案是提供包的显式索引. import 语句有以下约定:

  • 如果一个包的 __init__.py 代码定义了一个名为 __all__ 的列表,
  • 当遇到 from package import * 时, 它被用来作为导入的模块名字的列表.

例如, 文件 sound/effects/__init__.py 可能包含如下代码

__all__ = ["echo", "surround", "reverse"]

这意味这 from sound.effects import * 将导入 sound 中这几个名字的子模块.

如果 __all__ 没有被定义, from sound.effects import * 语句  把包 sound.effects 中所有的子模块都导入到当前命名空间里。它只能确保包 sound.effects 被导入了 (可能同时运行在 __init__.py` 里的一些初始化代码), 并随后导入包中定义的任何名字. 这包含任何在 __init__.py 定义的 任何名字 (和显式载入的子模块). 它还包含通过前面的 import 语句显式载入的包的子模块. 考虑这段代码:

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

在这个例子中, 模块 echo 和 surround 被导入到当前命名空间, 因为当 执行 from...import 语句时它们就被定义在包 sound.effects 里. (当定义 __all__ 定义时, 这也会工作.)

虽然有些模块被设计成当使用 import * 时仅导出遵循特定模式的名称, 但是在产品代码中仍然感觉算糟糕实践.

记住, 使用 from Package import specific_submodule 是没有问题的! 事实上, 这是推荐的用法, 只在以下情况例外: 正在导入的模块需要使用的子模块与其他包中的子模块具有相同的名字.

 

相对包导入

你还可以使用相对导入, 通过 import 语句的 from module import name 格式. 这些导入使用句点来表明涉及这次相对导入的当前包和父包. 从例子中的 surround , 您可以使用

from . import echo
from .. import formats
from ..filters import equalizer

注意, 相对导入基于当前模块的名字. 因为主模块的名字总是 "__main__", 有意用作一个 Python 程序的主模块的模块必须总使用 绝对导入 .

© 著作权归作者所有

爱吃柠檬的橘子
粉丝 6
博文 178
码字总数 84409
作品 0
芜湖
其他
python 脚本的启动模式(python -m以模块方式启动)

今天再看python的项目时,发现GitHub中给出的python脚本的执行格式是python -m pip install somepackage。于是开始了python模式启动之旅。 其中很多相关借鉴了该博客,同时感谢博主:http://...

wonengguwozai ⋅ 05/28 ⋅ 0

Python官方库SSH Decorator被曝后门:可窃取SSH凭证

在代码库中隐藏后门的最后一次尝试已经过去了一个星期,今天我们又有了一个新的案例。这一次,后门是在一个Python模块中找到的,而不是一个npm (JavaScript)包。 该模块的名称是SSH Decorat...

云技术之家 ⋅ 05/15 ⋅ 0

Python库现后门 可窃取用户SSH信息

     研究人员发现Python模块存在后门,注意是python模块,不是npm包。该模块名为SSH解密器(ssh-decorate),这是以色列开发者Uri Goren开发的处理SSH连接的库。   本周一,另一位开发...

嘶吼RoarTalk ⋅ 05/14 ⋅ 0

手把手 | 哇!用R也可以跑Python了

     大数据文摘作品   编译:大茜、钱天培   R还是Python?   真是个千古难题!   如果你主要从事数据分析、统计建模和可视化,R大概是你的不二之选。但如果你还想来搞点深度学...

大数据文摘 ⋅ 04/19 ⋅ 0

django 1.8 官方文档翻译: 1-3-1 高级教程:如何编写可重用的应用

高级教程:如何编写可重用的应用 本高级教程上接教程 6。我们将把我们的网页投票转换成一个独立的Python包,这样你可以在其它项目中重用或者分享给其它人。 如果你最近没有完成教程1–6,我们...

apachecn_飞龙 ⋅ 2015/08/29 ⋅ 0

centos6.9安装python3.6.0和模块

1、安装依赖包 yum -y install wget zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc gcc++ ......

sailikung ⋅ 06/18 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 06/18 ⋅ 0

《Python从小白到大牛》第3章 第一个Python程序

本章以HelloWorld作为切入点,介绍如何编写和运行Python程序代码。 运行Python程序主要有两种方式: 1.交互式方式运行 2.文件方式运行 本章介绍这两种运行方式实现HelloWorld程序。 使用P...

tony关东升 ⋅ 06/20 ⋅ 0

0. Python3源码—编译

0.1. 整体架构 在最高的层次上,Python的整体架构可以分为三个主要的部分: 左:Python提供的大量的模块、库以及用户自定义的模块; 右:Python的运行时环境,包括对象/类型系统(Object/Ty...

whj0709 ⋅ 06/06 ⋅ 0

使用 Python 全栈打造淘宝客微信机器人(上)

本篇 将会涉及: Python 环境下淘宝客 API 的使用; 使用 Python 第三方模块 itchat 实现微信的登录的自动回复操作; PyQt5 的布局管理与多线程应用 1 、前言 1.1、什么是淘宝客 相信很多人都...

柯西带你学编程 ⋅ 05/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 43分钟前 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 46分钟前 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 50分钟前 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 58分钟前 ⋅ 0

linux实用操作命令

参考 http://blog.csdn.net/qwe6112071/article/details/50806734 ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 同-a,但不列出"."和"...

简心 ⋅ 今天 ⋅ 0

preg_match处理中文符号 url编码方法

之前想过直接用符号来替换,但失败了,或者用其他方式,但有有些复杂,这个是一个新的思路,亲测可用 <?php$str='637朗逸·超速新风王(300)(白光)'; $str=iconv("UTF-8","GBK",$s...

大灰狼wow ⋅ 今天 ⋅ 0

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 今天 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 今天 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部