关于python:翻译实用的Python编程0304Modules

43次阅读

共计 4184 个字符,预计需要花费 11 分钟才能阅读完成。

目录 | 上一节 (3.3 谬误查看) | [下一节 (3.5 主模块)]()

3.4 模块

本节介绍模块的概念以及如何应用跨多个文件的函数。

模块和导入

任何一个 Python 源文件都是一个模块。

# foo.py
def grok(a):
    ...
def spam(b):
    ...

import 语句加载并执行一个模块。

# program.py
import foo

a = foo.grok(2)
b = foo.spam('Hello')
...

命名空间

模块是命名值的汇合,有时也称为 命名空间。名称是源文件中定义的所有全局变量和函数。导入之后,模块名称用作前缀。因而,称为命名空间。

import foo

a = foo.grok(2)
b = foo.spam('Hello')
...

模块名间接绑定到文件名(foo -> foo.py)。

全局定义

填充模块命名空间的内容是定义在 全局(global)作用域中任何内容。思考定义了雷同变量 x 的两个模块。

# foo.py
x = 42
def grok(a):
    ...
# bar.py
x = 37
def spam(a):
    ...

在本例中,x 指向不同的变量。一个是 foo.x,另一个是 bar.x。不同的模块能够应用雷同的名称并且这些名称不会互相抵触。

模块是隔离的。

把模块当做环境

对于所有定义在模块外面的代码而言,模块形成一个关闭的环境。

# foo.py
x = 42

def grok(a):
    print(x)

全局 变量始终绑定到关闭模块(雷同文件),每个源文件都是它本人的小宇宙。

模块执行

导入模块时,模块中的所有语句顺次 执行(execute),直到达到文件开端。模块命名空间的内容是所有的 全局名称,这些名称在执行过程完结时依然被定义。如果有脚本语句在全局作用域中执行工作(如打印,创立文件等),您将看到它们在导入模块时运行。

import as 语句

能够在导入模块时更改其名称:

import math as m
def rectangular(r, theta):
    x = r * m.cos(theta)
    y = r * m.sin(theta)
    return x, y

它的作用与一般导入雷同,仅仅是重命名模块而已。

from import语句

from import语句从模块中选出符号并使它们在部分可拜访。

from math import sin, cos

def rectangular(r, theta):
    x = r * cos(theta)
    y = r * sin(theta)
    return x, y

这容许应用模块的某些局部,而不用输出模块前缀。对于常常应用的名称,这十分有用。

导入阐明

无关导入的各种变动不扭转模块的工作形式。

import math
# vs
import math as m
# vs
from math import cos, sin
...

具体来说,import 始终执行整个文件并且模块依然是隔离的环境。

import module as 语句只部分地更改名称。在后盾,from math import cos, sin 语句仍加载全副的数学模块。当导入实现后,它仅仅将模块中的 cossin 名称复制到部分命名空间中。

模块加载

每个模块仅加载和执行一次。留神:反复导入仅返回先前所加载模块的援用

sys.modules 是所有已加载模块的字典。

>>> import sys
>>> sys.modules.keys()
['copy_reg', '__main__', 'site', '__builtin__', 'encodings', 'encodings.encodings', 'posixpath', ...]
>>>

留神 :当批改模块的源代码后,如果反复import 语句会产生一个常见的困惑。因为模块缓存 sys.modules,反复导入总是返回之前加载的模块——即便更改曾经产生。将批改后的代码加载到 Python 中最平安的形式是退出而后重启解释器。

定位模块

搜寻模块时,Python 从门路列表(sys.path)中查问。

>>> import sys
>>> sys.path
[
  '','/usr/local/lib/python36/python36.zip','/usr/local/lib/python36',
  ...
]

当前工作目录通常是第一个。

模块搜寻门路

如前所述,sys.path 蕴含搜寻门路。能够依据须要手动调整。

import sys
sys.path.append('/project/foo/pyfiles')

也能够通过环境变量增加搜寻门路。

% env PYTHONPATH=/project/foo/pyfiles python3
Python 3.6.0 (default, Feb 3 2017, 05:53:21)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)]
>>> import sys
>>> sys.path
['','/project/foo/pyfiles', ...]

在大部分状况下,没必要手动调整模块搜寻门路。然而,如果尝试导入的 Python 代码位于非凡地位,或者无奈从当前工作目录轻松拜访,那么就须要手动调整搜寻门路了。

练习

因为本练习波及模块,所以确保在适当的环境中运行 Python 至关重要。模块常常给编程老手带来问题,这些问题与当前工作目录相干或者与 Python 门路设置相干。对于本课程,假设您是在 Work/ 目录下编写所有的代码。为了获得最佳后果,应该确保也是在 Work/ 目录下运行解释器。否则,须要确保 practical-python/Work 已增加到 sys.path

练习 3.11:模块导入

在第 3 节中,咱们创立了一个通用指标函数 parse_csv() 用于解析 CSV 数据文件的内容。

当初,咱们来看看如何在其它程序中应用该函数。首先,启动一个新的 shell 窗口,进入到搁置所有文件的目录中。咱们将要导入它们。

启动 Python 交互模式。

bash % python3
Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

当 Python 交互模式启动后,尝试导入某些之前编写的程序。应该能看到输入和以前一样。强调一下,导入模块会运行模块中的代码。

>>> import bounce
... watch output ...
>>> import mortgage
... watch output ...
>>> import report
... watch output ...
>>>

如果没有代码运行,可能是因为在谬误的目录下运行了 Python。当初,尝试导入 fileparse 模块并获取无关该模块的帮忙。

>>> import fileparse
>>> help(fileparse)
... look at the output ...
>>> dir(fileparse)
... look at the output ...
>>>

尝试应用 fileparse 模块来读取一些数据:

>>> portfolio = fileparse.parse_csv('Data/portfolio.csv',select=['name','shares','price'], types=[str,int,float])
>>> portfolio
... look at the output ...
>>> pricelist = fileparse.parse_csv('Data/prices.csv',types=[str,float], has_headers=False)
>>> pricelist
... look at the output ...
>>> prices = dict(pricelist)
>>> prices
... look at the output ...
>>> prices['IBM']
106.11
>>>

尝试导入一个函数,以便不必再蕴含模块名:

>>> from fileparse import parse_csv
>>> portfolio = parse_csv('Data/portfolio.csv', select=['name','shares','price'], types=[str,int,float])
>>> portfolio
... look at the output ...
>>>

练习 3.12:应用库模块

在第 2 节中,编写了 report.py 程序用来生成像上面这样的股票报告:

      Name     Shares      Price     Change
---------- ---------- ---------- ----------
        AA        100       9.22     -22.98
       IBM         50     106.28      15.18
       CAT        150      35.46     -47.98
      MSFT        200      20.89     -30.34
        GE         95      13.48     -26.89
      MSFT         50      20.89     -44.21
       IBM        100     106.28      35.84

应用该程序并对其进行批改,以便应用 fileparse 模块中的函数实现所有输出文件的解决。为此,将 fileparse 作为模块导入,并批改 read_portfolio()read_prices() 函数以便应用 parse_csv() 函数。

在本练习开始时,请应用交互示例作为指南。之后,应该可能取得与之前完全相同的输入。

练习 3.14:应用更多的库导入

在第 1 节中,编写了一个读取股票投资组合和计算费用的程序 pcost.py

>>> import pcost
>>> pcost.portfolio_cost('Data/portfolio.csv')
44671.15
>>>

请批改 pcost.py 文件,以便它可能应用 report.read_portfolio() 函数。

阐明

当实现练习后,您应该领有三个程序。蕴含通用目标函数 parse_csv()fileparse.py 程序。用于生成报告,且蕴含 read_portfolio()read_prices() 函数的 report.py 程序。最初,利用 report.py 程序中编写的read_portfolio() 函数去计算股票投资组合费用的 pcost.py 程序。

目录 | 上一节 (3.3 谬误查看) | [下一节 (3.5 主模块)]()

注:残缺翻译见 https://github.com/codists/practical-python-zh

正文完
 0