python 模块

1 模块

1.1 导入模块 [1].172

任何python程序都可作为模块导入,程序保存在文件hello.py中,那么这个文件的名称(不包括扩展名.py)将成为模块的名称。
一个简单的模块
编写一个python程序,文件名为hello.py,内容为:

#hello.py
print("Hello Python!")

将文件hello.py放在目录E:/中。

>>> import sys
>>> sys.path.append('E:/')
>>> import hello
Hello Python!

这告诉解释器,除了通常要查找的位置外,还应到目录E:\中去查找这个模块。
注意:append()的参数中只有文件所在的目录名,不包含文件名自身。

1.2 模块只会导入一次 [1].173

现象:
上面的程序,若再导入一次hello模块,什么事情都不会发生,即不会再执行代码。

>>> import sys
>>> sys.path.append('E:/hello')
>>> sys.path.append('E:/')
>>> import hello
Hello Python!
>>> import hello
>>> 

原因:
因为模块不是用来执行操作(如打印文本)的,而是用于定义变量、函数、类等。

为何只导入一次:
两个模块互相调用,互相导入,若每次导入都执行一次,那么将形成无穷的导入循环。由于第二次什么都不做,循环将被打破。
若一定要重新加载模块,可使用模块importlib 中的函数reload,它接受一个参数(要重新加载的模块),并返回重新加载的模块。(如果程序运行时修改了模块,并希望这种修改反映到程序汇总,这将很有用。)

>>> import sys
>>> sys.path.append('E:/')
>>> import hello
Hello Python!
>>> hello
<module 'hello' from 'E:\\hello.py'>

>>> import importlib
>>> importlib.reload(hello)
Hello Python!
<module 'hello' from 'E:\\hello.py'>
>>> hello = importlib.reload(hello)
Hello Python!
>>> hello
<module 'hello' from 'E:\\hello.py'>

从上面的程序可以看出,导入模块后,会生成一个以模块名为名字的变量。
通过将函数reload()的结果赋值给hello,用重新加载的版本替换了以前的版本。

注意:用模块中的类创建对象x后,如果重新加载了模块,并不会重新创建对象,即x依旧是旧版类的对象。要让x指向新的类创建的对象,需要重新创建它。

1.3 在模块中定义函数、添加测试代码

创建文件hello.py:
在模块中添加测试代码test(),以检查hello2()函数能否正常运行。
在主程序中,name的值是’main‘,而在模块中,name的值是该模块的名称。

#hello.py
def hello2():
    print("Hello Python!")
def test():
    hello2()

if __name__ == '__main__':
    test()

调用模块:

>>> import sys
>>> sys.path.append('E:/')
>>> import hello
>>> hello
<module 'hello' from 'E:\\hello.py'>
>>> hello.hello2()
Hello Python!

调用函数hello2()时,需要使用全限定名hello.hello2(),这样有些不方便。可以在导入模块时,使用如下方式:

 >>> from hello import *
>>> hello2()
Hello Python!

1.4 包

建立较多模块后,可能有些乱,所以需要一种高效的方式进行组织。为了组织模块,就可以将其编组为包。
包是另一种模块,可以包含其他模块。
要想被python视为模块,目录中必须包含一个文件init.py。
定义一个包python,内部含有两个模块hello.py,hi.py,一个文件__init__.py:
#hello.py

#hello.py
def hello2():
    print("Hello Python!")
def test():
    hello2()

if __name__ == '__main__':
    test()

#hi.py

#hi.py
def hi():
    print("hi,world")
def test():
    hi()

if __name__ == '__main__':
    test()

#__init__.py

def name():
    print("This is package python")

PI=3.14

#调用包中的模块进行测试

>>> import sys
>>> sys.path.append('C:/Users/MrZhang/Desktop')

>>> import python
>>> python.name()
This is package python
>>> print(python.PI)
3.14

>>> import python.hello
>>> hello.hello2()#未加全限定名,以此为鉴
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    hello.hello2()
NameError: name 'hello' is not defined
>>> python.hello.hello2()
Hello Python!

>>> from python import hi
>>> hi()
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    hi()
TypeError: 'module' object is not callable
>>> hi.hi()#不用再python.hi.hi()这么长了
hi,world

2 常用模块介绍

2.1 os

  1. os.path.join(path1[, path2[, …]])
    将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。
>>> os.path.join('c:\\', 'csv', 'test.csv') 
'c:\\csv\\test.csv' 
>>> os.path.join('windows\temp', 'c:\\', 'csv', 'test.csv') 
'c:\\csv\\test.csv' 
>>> os.path.join('/home/aa','/home/aa/bb','/home/aa/bb/c') 
'/home/aa/bb/c'
>>> help(os.path.join)
Help on function join in module ntpath:

join(path, *paths)
    # Join two (or more) paths.

>>> os.path.join('ml-1m', 'ratings.dat')
'ml-1m\\ratings.dat'
>>> path = os.path.join('ml-1m', 'ratings.dat')
>>> path
'ml-1m\\ratings.dat'
>>> path.__class__
<class 'str'>

可以看出join()函数的返回结果是一个str类型。

那为什么是双反斜杠呢?因为在Windows中,标准分隔符为\,python语法用这种方式表示单个反斜杠。

>>> strTest = 'hello\python'
>>> strTest
'hello\\python'

参考文献

[1] Python 基础教程(第三版)Magnus Lie Hetland 著 袁国忠 译
[2] python os.path模块常用方法详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张之海

若有帮助,客官打赏一分吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值