Python Modules

Module


Module允许以逻辑方式组织 Python 代码。将相关代码分组到模块中,使代码更易于理解和使用。模块是具有任意命名属性的 Python 对象,您可以绑定和引用这些属性。
简单地说,模块是由Python代码组成的文件。模块可以定义函数、类和变量。模块还可以包括可运行代码。

示例

一个名为aname的模块,其Python代码通常在aname.py的文件中。下面是一个简单的模块,support.py

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

Import 声明

可以将任何Python源文件作为模块,在其他Python文件中通过import声明使用这些模块。语法如下

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

当解释器遇到导入语句时(import module),如果模块存在于搜索路径中,它将导入模块。搜索路径是解释器在导入模块之前搜索的目录的列表。在后面有详细介绍,这里将support.py放置在工程路径下,可以被搜索到。

# 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声明,允许一个Module中特定的属性导入namespace.
语法:

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

from fib import fibonacci

这条声明并没有将整个fib module导入当前命名空间,而是只导入Fibonacci项。

from…Import * 声明

可以将Module中的所有名称导入命名空间

from modname import *

这时一种很简单的方法,将所有模块项导入当前namespace,但是要谨慎使用.

定位module

当导入一个Module时,Python解释器按以下顺序搜索

  • 当前路径
  • 如果没找到,Python会接着搜索shell变量PYTHONPATH的每个路径
  • 如果还是找不到,Python会检查默认路径,UNIX系统的默认路径时/usr/local/lib/python/
    模块搜索路径保存在系统module sys中,作为sys.path变量。sys.path变量包含当前路径,PYTHONPATH, 与安装相关的默认路径。

PYTHONPATH变量

PYTHONPATH是一个环境变量, 包含一系列路径。PYTHONPATH的语法与shell PATH变量一样
Windows中典型的PYTHONPATH

set PYTHONPATH = c:\python20\lib;

UNIX系统中PYTHONPATH

set PYTHONPATH = /usr/local/lib/python

Namespace和作用域

变量是映射到对象的名称(标识符)。命名空间是变量名称(键)及其相应对象(值)的字典。
Python 语句可以访问本地命名空间和全局命名空间中的变量。如果局部变量和全局变量具有相同的名称,则只会访问局部变量。
Python认为在function中给任何变量赋值的都是局部变量,因此如果要给全局变量赋值,必须显示使用global声明。
示例
Money定义为全局变量,在AddMoney函数中直接给Money赋值操作,认为Money是局部变量,但是Money并没有设置,就要获取Money的值,因此报UnboundLocalError

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

执行结果

UnboundLocalError: local variable 'Money' referenced before assignment

dir() 函数

dir()内置函数返回module中定义的名称排序列表。列表中包含所有module,变量,函数的名称。

import math

content = dir(math)
print(content)
print(math.__file__)
print(math.__name__)

执行结果

['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
/home/andy/anaconda3/lib/python3.7/lib-dynload/math.cpython-37m-x86_64-linux-gnu.so
math

这里变量__name__是模块的名称, __file__是包含模块的源文件名

全局和局部函数

globals()和locals()函数可以用来返回全局和局部命名空间内的名称,具体看其被调用的位置。
如果locals()在一个函数内调用,则返回这个函数局部内可以访问的所有名称。
如果globals()在一个函数内调用,则返回此函数全局可以访问的所有名称。
globals()和locals()返回类型是dictionary.因此名称可以被keys()函数提取。
pyCharm上执行

print(globals())
print(locals())
print(globals().keys())
print(locals().keys())

执行结果

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f487c4191d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/andy/PycharmProjects/Cookbook_Code/Tutorial_Base/main.py', '__cached__': None, 'math': <module 'math' from '/home/andy/anaconda3/envs/oop/lib/python3.7/lib-dynload/math.cpython-37m-x86_64-linux-gnu.so'>, 'support': <module 'support' from '/home/andy/PycharmProjects/Cookbook_Code/Tutorial_Base/support.py'>}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f487c4191d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/andy/PycharmProjects/Cookbook_Code/Tutorial_Base/main.py', '__cached__': None, 'math': <module 'math' from '/home/andy/anaconda3/envs/oop/lib/python3.7/lib-dynload/math.cpython-37m-x86_64-linux-gnu.so'>, 'support': <module 'support' from '/home/andy/PycharmProjects/Cookbook_Code/Tutorial_Base/support.py'>}
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'math', 'support'])
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'math', 'support'])

reload()函数

当模块加载到一个脚本中,模块顶层部分的代码只执行一次。
如果想重新执行一次模块top-level的代码,可以使用reload()函数。reload()函数将再一次导入之前导入的模块。Python 3.0之后,reload()再imp模块中,语法

from imp import reload

reload(module_name)

这里,module_name是要导入的module的名称,不是包含模块名的字符串。

from imp import reload

reload(time)

Python中的包

Package是一个分层文件目录结构,它定义由模块、子包和子-子包等组成的单个 Python 应用程序环境。
举例:
在pyCharm中创建一个Package Phone,其下面有3个文件Pots.py, Isdn.py, G3.py
在这里插入图片描述为了import Phone后,能引用定义的所有函数,需要在__init__.py中显示声明import

from Phone.Isdn import Isdn
from Phone.Pots import Pots
from Phone.G3 import G3

当在__init__.py中加入上述代码后,import Phone则可以访问所有定义的函数

import Phone

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

执行后

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

上述例子中,我们在每个文件中定义一个函数,当然你也可以在文件中定义多个函数。你也可以在文件中定义不同的类,然后创建这些类的一个函数包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值