Python programming 9


基础永远值得花费90%的精力去学习加强。认识实践的重要性。

Ax Python Modules | 模块

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

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

可以说,一个.py文件名就算模块。

例创建一个support.py的文件

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

import

通过import语句,你可以将任何python文件当作模块。

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

当解释器遇到import语句时,如果该模块出现在搜索路径中,它就导入该模块。搜索路径是解释器在导入模块之前搜索的目录列表。以导入“support.py”模块为例,需要在脚本顶部执行如下命令

#!/usr/bin/python

# Import module support
import support

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

执行

Hello : Zara

一个模块只加载一次。以防重复执行模块。

from…import

from...import允许你将模块中的特定属性导入到当前的命名空间中

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

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

from fib import fibonacci

就是只用某一个东西,不全部导入进来。

from…import *

将所有的命名空间导入到当前命名空间中。

from modname import *

虽然简单方便,但谨慎使用。

定位模块

当导入模块时,python解析器按一下顺序搜索

  • 当前目录 sys.path
  • PYTHONPATH变量中的每个路径
  • 都失败则检查默认路径。

PYTHONPATH

这是一个环境变量,设置变量的语法和shell相同,这是windows中

set PYTHONPATH = c:\python20\lib;

UNIX和Linux中

set PYTHONPATH = /usr/local/lib/python

命名空间和范围

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

Python语句可以访问本地命名空间和全局命名空间中的变量。如果局部变量和全局变量具有相同的名称,则局部变量隐藏全局变量。

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

Python对变量是局部的还是全局的做出有根据的猜测。它假定在函数中赋值的任何变量都是局部变量。

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

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

例如,我们在全局命名空间中定义了一个变量Money。在函数Money中,我们给Money赋值,因此Python假定Money为局部变量。但是,我们在设置本地变量Money之前访问了它的值,所以结果是UnboundLocalError。取消注释global语句可以解决这个问题。

#!/usr/bin/python

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/python

# 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(),它将返回从该函数全局访问的所有名称。

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

reload() 函数

当模块被导入到脚本中时,模块顶层的代码只执行一次。

因此,如果您想重新执行模块中的顶级代码,可以使用reload()函数。reload()函数再次导入以前导入的模块。reload()函数的语法如下

reload(module_name)

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

reload(hello)

包是一种分层的文件目录结构,它定义了单个Python应用程序环境,该环境由模块、子包和子子包等组成。

假设在Phone目录中有一个文件Pots.py。该文件的源代码如下

#!/usr/bin/python

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

类似地,我们还有另外两个文件,它们具有与上面相同名称的不同函数

  • Phone/Isdn.py 文件有 Isdn()

  • Phone/G3.py 文件有 G3()

现在,在Phone directory−中再创建一个文件__init__.py

  • Phone/__init__.py

要使所有函数在导入Phone时都可用,需要在__init__.py中显式地放入import语句,如下所示

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

将这些行添加到__init__.py之后,当您导入Phone包时,就有了所有这些类。

#!/usr/bin/python

# 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类,然后你可以用这些类创建你的包。

如果你要在该文件的同级目录下的另一个目录中引用Phone包,必须在Phone同级目录也加上__init__.py


文章作者: Enomothem
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Enomothem !
  目录