(20)Python模块
目录
模块允许逻辑地组织Python代码。 将相关代码分组到一个模块中,使代码更容易理解和使用。 模块是一个具有任意命名属性的Python对象,可以绑定和引用。
简单来说,模块是一个由Python代码组成的文件。模块可以定义函数,类和变量。 模块还可以包括可运行的代码。
示例
下面是一个名称为aname
的模块的Python代码通常位于一个名称为aname.py
的文件中。以下是一个简单模块的例子:support.py
–
def print_func( par ):
print "Hello : ", par
return
1.import语句
可以通过在其他Python源文件中执行import
语句来将任何Python源文件用作模块。导入具有以下语法 –
import module1[, module2[,... moduleN]
当解释器遇到导入语句时,如果模块存在于搜索路径中,则导入该模块。搜索路径是导入模块之前解释器搜索的目录的列表。例如,要导入模块hello.py
,需要将以下命令放在脚本的顶部 –
#!/usr/bin/python3
# Import module support
import support
# Now you can call defined function that module as follows
support.print_func("Maxsu")
当执行上述代码时,会产生以下结果 –
Hello : Maxsu
不管模块被导入多少次,模块只能加载一次。这样可以防止模块执行重复发生,如果有多个导入。
2.from…import语句
Python from
语句允许将模块中的特定属性导入到当前的命名空间中。 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
导入到当前命名空间中; 它只是将fibonacci
从模块fib
引入导入模块的全局符号表。
3.from…import *语句
也可以使用以下import
语句将模块中的所有名称导入到当前命名空间中 –
from modname import *
这提供了将所有项目从模块导入到当前命名空间中的简单方法; 但是,这个说法应该谨慎使用。
4.执行模块作为脚本
在模块中,模块的名称(作为字符串)可用作全局变量__name__
的值。模块中的代码将被执行,就像您导入它一样,但是__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]
5.定位模块
当导入模块时,Python解释器将按以下顺序搜索模块 –
- 当前目录。
- 如果没有找到该模块,Python会在shell变量
PYTHONPATH
中搜索每个目录。 - 如果其他所有失败,Python将检查默认路径。 在UNIX上,此默认路径通常是
/usr/local/lib/python3/
或者/usr/sbin/
模块搜索路径作为sys.path
变量存储在系统模块sys
中。sys.path
变量包含当前目录PYTHONPATH
和依赖于安装的默认值。
6.PYTHONPATH变量
PYTHONPATH
是一个环境变量,由目录列表组成。 PYTHONPATH
的语法与shell变量`PATH“`的语法相同。
这是一个典型的Windows系统上的PYTHONPATH
–
set PYTHONPATH = c:\python34\lib;
这里是UNIX系统的典型PYTHONPATH
–
set PYTHONPATH = /usr/local/lib/python
7.命名空间和范围
变量是映射到对象的名称(标识符)。 命名空间是变量名(键)及其对应对象(值)的字典。
- Python语句可以访问本地命名空间和全局命名空间中的变量。如果本地和全局变量具有相同的名称,则局部变量会影响全局变量。
- 每个函数都有自己的本地命名空间。 类方法遵循与普通函数相同的范围规则。
- Python对于变量是本地还是全局都进行了有根据的判断。它假定在函数中分配值的任何变量都是本地的。
- 因此,为了将值分配给函数内的全局变量,必须首先使用
global
语句。 - 语句
global VarName
告诉PythonVarName
是一个全局变量。Python停止搜索本地命名空间的变量。
例如,在全局命名空间中定义一个变量Money
。 在函数Money
中为Money
赋值,因此Python将Money
作为局部变量。
但是,如果在设置之前就访问了本地变量Money
的值,它会产生一个错误:UnboundLocalError
。 这里可以通过取消注释global
语句来解决问题。如下示例代码 –
#!/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)
8.dir( )函数
dir()
内置函数返回一个包含由模块定义的名称的字符串的排序列表。这个列表包含模块中定义的所有模块,变量和函数的名称。 以下是一个简单的例子 –
#!/usr/bin/python3
# Import built-in module math
import time
content = dir(time)
print (content)
当执行上述代码时,会产生以下结果 –
['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'perf_counter', 'process_time', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname']
这里,特殊的字符串变量__name__
是模块的名称,__file__
是加载模块的文件名。
9.globals()和locals()函数
globals()
和locals()
函数可用于返回全局和本地命名空间中的名称,具体取决于它们被调用的位置。
- 如果
locals()
从一个函数中调用,它将返回从该函数本地访问的所有名称。 - 如果从函数中调用
globals()
,它将返回从该函数全局访问的所有名称。
这两个函数的返回类型是字典。 因此,可以使用keys()
函数提取名称。
10.reload()函数
当将模块导入到脚本中时,模块的顶级部分的代码只能执行一次。
因此,如果要重新执行模块中的顶级代码,可以使用reload()
函数。reload()
函数再次导入以前导入的模块。 reload()
函数的语法是这样的 –
reload(module_name)
这里,module_name
是要重新加载的模块的名称,而不是包含模块名称的字符串。 例如,要重新加载hello
模块,请执行以下操作 –
reload(hello)
11.Python中的包
Python中的包是一个分层文件目录结构,它定义了一个由模块和子包和子子包组成的Python应用程序环境,等等。
在package
目录中创建两个目录:pkg
和pkg2
, 然后分别在这两个目录中创建两个文件:a.py
和b.py
。该文件具有以下一行源代码 –
文件: pkg/a.py –
#!/usr/bin/python3
#coding=utf-8
# save file: pkg/a.py
def fun():
print ("I'm pkg.a.fun() ")
文件: pkg/b.py –
#!/usr/bin/python3
#coding=utf-8
# save file: pkg/b.py
def fun():
print ("I'm pkg.b.fun() ")
文件: pkg2/a.py –
#!/usr/bin/python3
#coding=utf-8
# save file: pkg2/a.py
def fun():
print ("I'm pkg2.a.fun() ")
文件: pkg2/b.py –
#!/usr/bin/python3
#coding=utf-8
# save file: pkg2/b.py
def fun():
print ("I'm pkg2.b.fun() ")
在package
目录中创建一个主程序文件:main.py
,用于演示如何调用包中的各个文件 –
#!/usr/bin/python3
#coding=utf-8
# save file: phone/pots.py
import pkg.a as a
import pkg.b as b
import pkg2.a as a2
import pkg2.b as b2
a.fun()
b.fun()
a2.fun()
b2.fun()
import pkg2.a
import pkg2.b
print('----------- another way -----------------')
pkg2.a.fun()
pkg2.b.fun()
整个代码的目录如下所示 –
package
|- pkg
|- __init__.py
|- a.py
|- b.py
|- pkg2
|- __init__.py
|- a.py
|- b.py
当执行上述代码时,会产生以下结果 –
I'm pkg.a.fun()
I'm pkg.b.fun()
I'm pkg2.a.fun()
I'm pkg2.b.fun()
----------- another way -----------------
I'm pkg2.a.fun()
I'm pkg2.b.fun()
在上面的例子中,将每个文件中的一个函数作为示例,但是可以在文件中编写多个函数。还可以在这些文件中定义不同的Python类,然后可以使用这些类来创建包。
关注右侧公众号,随时随地查看教程
Python教程目录
转载自:https://www.yiibai.com/python/python_modules.html