Python 3 - 模块

模块允许您逻辑地组织Python代码.将相关代码分组到模块中使代码更易于理解和使用.模块是一个Python对象,具有可以绑定和引用的任意命名属性.

简单地说,模块是一个由Python代码组成的文件.模块可以定义函数,类和变量.模块还可以包含可运行代码.

示例

名为aname的模块的Python代码通常位于namedaname.py文件中.下面是一个简单模块的示例,support.py :

def print_func( par ):
   print "Hello : ", par
   return


导入语句

您可以使用任何Python源代码通过在其他Python源文件中执行import语句将文件作为模块. import 具有以下语法 :

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


当解释器遇到import语句时,如果模块出现在搜索路径中,它将导入模块.搜索路径是解释程序在导入模块之前搜索的目录列表.例如,要导入模块hello.py,您需要将以下命令放在脚本的顶部并减去;

#!/usr/bin/python3

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Zara")


执行上述代码时,会产生以下结果 :

Hello : Zara


模块只加载一次,无论导入的次数如何.如果发生多次导入,这可以防止模块执行重复发生.

from ... import语句

Python的来自语句允许您将模块中的特定属性导入当前命名空间. from ... import 具有以下语法 :

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


例如,要从模块fib导入函数fibonacci,请使用以下语句 :

#!/usr/bin/python3

# Fibonacci numbers module

def fib(n): # return Fibonacci series up to n
   result = []
   a, b = 0, 1
   while b < n:
      result.append(b)
      a, b = b, a + b
   return result
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]


这语句不会将整个模块fib导入当前命名空间;它只是将模块fib中的项目fibonacci引入导入模块的全局符号
表.

from ... import * Statement

还可以使用以下import语句将所有名称从模块导入当前命名空间;

from modname import *


这提供了一种将模块中的所有项目导入当前命名空间的简便方法.谨慎使用此语句.

执行模块作为脚本

在模块中,模块的名称(作为字符串)可用作全局变量__name__的值.模块中的代码将被执行,就像您导入它一样,但__ ____设置为"__main __".

在模块末尾添加此代码 :

#!/usr/bin/python3

# Fibonacci numbers module

def fib(n): # return Fibonacci series up to n
   result = []
   a, b = 0, 1
   while b < n:
      result.append(b)
      a, b = b, a + b
   return result
if __name__ == "__main__":
   f = fib(100)
   print(f)


运行上面的代码时,将显示以下输出.

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]


定位模块

导入模块时,Python解释器按以下顺序搜索模块 :

  • 当前目录.

  • 如果找不到模块,Python会搜索shell变量PYTHONPATH中的每个目录.

  • 如果所有其他方法都失败,Python会检查默认路径.在UNIX上,此默认路径通常为/usr/local/lib/python3/.

模块搜索路径存储在系统中module sys作为 sys.path 变量. sys.path变量包含当前目录,PYTHONPATH和依赖于安装的默认值.

PYTHONPATH变量

PYTHONPATH是一个环境变量,由目录列表组成. PYTHONPATH的语法与shell变量PATH的语法相同.

这是来自Windows系统的典型PYTHONPATH :

set PYTHONPATH = c:\python34\lib;


这是来自UNIX系统的典型PYTHONPATH :

set PYTHONPATH = /usr/local/lib/python


命名空间和范围

变量是名称(标识符)映射到对象. 名称空间是变量名称(键)及其对应的对象(值)的字典.

  • Python语句可以访问本地命名空间全局命名空间中的变量.如果本地变量和全局变量具有相同的名称,则局部变量将影响全局变量.

  • 每个函数都有自己的本地名称空间.类方法遵循与普通函数相同的作用域规则.

  • Python对变量是局部变量还是全局变量进行了有根据的猜测.它假定在函数中赋值的任何变量都是局部的.

  • 因此,为了给函数中的全局变量赋值,必须首先使用全局语句.

  • 语句 global VarName 告诉Python VarName是一个全局变量. Python停止在本地命名空间中搜索变量.

例如,我们在全局命名空间中定义变量 Money .在函数Money中,我们为Money分配一个值,因此Python假定Money作为局部变量.

但是,我们之前访问了局部变量 Money 的值设置它,因此结果是UnboundLocalError.取消注释全局声明可以解决问题.

#!/usr/bin/python3

Money = 2000
def AddMoney():
   # Uncomment the following line to fix the code:
   # global Money
   Money = Money + 1

print (Money)
AddMoney()
print (Money)


dir()函数

dir()内置函数返回一个包含模块定义的名称的字符串的排序列表.

该列表包含所有模块的名称,模块中定义的变量和函数.以下是一个简单的示例 :

#!/usr/bin/python3

# Import built-in module math
import math

content = dir(math)
print (content)


当执行上面的代码时,它产生以下结果 :

['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 
'sqrt', 'tan', 'tanh']


这里,特别的字符串变量__name__是模块的名称,和__file__是加载模块的文件名.

globals()和locals()函数

globals() locals()函数可用于返回全局和本地名称空间中的名称,具体取决于调用它们的位置.

  • 如果从函数中调用 locals(),它将返回可从该函数本地访问的所有名称.

  • 如果从函数中调用 globals(),它将返回可以从该函数全局访问的所有名称.

这两个函数的返回类型是字典.因此,可以使用键()函数提取名称.

reload()函数

当一个模块导入到脚本中,模块顶层部分的代码只执行一次.

因此,如果要重新执行模块中的顶级代码,可以使用 reload()功能. reload()函数再次导入先前导入的模块. reload()函数的语法是这个 :

reload(module_name)


这里,module_name是要重新加载的模块的名称,而不是包含模块名称的字符串.例如,要重新加载hello模块,请执行以下操作 :

reload(hello)


Python中的包

包是一个分层文件目录结构,它定义了一个由模块,子包和子子包组成的Python应用程序环境,依此类推.

考虑Phone目录中提供的文件 Pots.py .此文件包含以下源代码行 :

#!/usr/bin/python3

def Pots():
print ("I'm Pots Phone")


类似地,我们还有两个具有不同功能的文件同名以上.它们是 :

  • 手机/Isdn.py 文件具有功能Isdn()

  • 手机/G3.py 文件,功能G3()

现在,在电话目录中再创建一个文件__init__.py :

  • 电话/__初始__.py

要在导入电话时使所有功能可用,您需要在__init__.py中放置显式导入语句如下 :

from Pots import Pots
from Isdn import Isdn
from G3 import G3


将这些行添加到__init__.py后,导入Phone包时可以使用所有这些类.

#!/usr/bin/python3

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()


当执行上面的代码时,它产生以下结果 :

I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone


在上面的例子中,我们举了一个函数在每个文件中的例子,但是你可以在您的文件中保留多个功能.您还可以在这些文件中定义不同的Python类,然后您可以从这些类中创建包.