设为首页 收藏本站
查看: 804|回复: 0

[经验分享] Python学习笔记 (第10课)

[复制链接]

尚未签到

发表于 2015-12-1 14:12:00 | 显示全部楼层 |阅读模式
  本节开始学习模块的相关知识,主要包括模块的编译,模块的搜索路径、包等知识

  1.模块

  
  如果我们直接在解释器中编写python,当我们关掉解释器后,再进去。我们之前编写的代码都丢失了。因此,我们需要将我们编写的代码保存在文件中,这样我们就可以以脚本的形式多次运行它。 每一个包含Python语句并且扩展名为.py的文件就是一个模块,模块的名字就是文件名的名字(不包含扩展名)。例如,我们创建一个文件:addab.py ,文件中的代码如下:



def  testAdd(a,b):
print a+b #打印a+b的值
  我们打开解释器,导入addab模块,就可以调用该模块中的testAdd方法了




>>> import addab
>>> addab.testAdd(1,2)
3
  我们可以通过__name__来查看模块的名字,__name__是一个字符型的全局变量



>>> import addab
>>> addab.__name__
'addab'
  如果你经常使用一个模块中的某个函数,你可以将它赋值给一个局部变量



>>> import addab
>>> add=addab.testAdd
>>> add(1,2)
3
  

  2.模块的导入
  我们在运行一个模块的时候,可能会用到其他模块,这时候,我们就需要在该模块中导入其他模块,我们可以使用 import module 或者from module import ..的方式来导入模块。 例如,我们再创建另一个名为:maintest.py的文件,该文件需要用到addab模块,文件中的代码如下:



#_*_coding=utf-8 _*_
import addab
def  testAddab(x,y):
addab.testAdd(x,y) # 调用addab模块中的函数
if __name__=="__main__":
testAddab(10,20)
  运行maintest.py ,结果如下:



>>>
30
  我们还可以使用from module import ..的形式导入模块,因此我们可以修改maintest.py为如下形式:



#_*_coding=utf-8 _*_
from addab import testAdd
def  testAddab(x,y):
testAdd(x,y) # 调用addab模块中的函数
if __name__=="__main__":
testAddab(10,20)
  除此之外,我们还可以使用 from module import * 的形式,该形式的意思是导入module下的所有内容,包括函数、变量或类



#_*_coding=utf-8 _*_
from addab import *
def  testAddab(x,y):
testAdd(x,y) # 调用addab模块中的函数
if __name__=="__main__":
testAddab(10,20)
  注意:maintest.py 的代码 :if __name__=="__main__" 的意思是判断maintest模块是直接运行的,还是被import 运行的,只有直接运行该模块,if块中的代码才会被执行。
  如果是直接运行的,那么__name__ =="__main__"
  如果是被导入运行的,那么__name__=="maintest"
  例如,我们更改maintest.py 为如下内容:



#_*_coding=utf-8 _*_
from addab import *
def  testAddab(x,y):
testAdd(x,y) # 调用addab模块中的函数
print __name__  #打印name的值
if __name__=="__main__":
testAddab(10,20)
else:
print ' imported'
  我们直接运行该模块,运行结果如下:



D:pythonstudy\test>python maintest.py
__main__
30
  我们通过导入该模块,运行结果如下:



>>> import maintest
maintest
imported
  
  

  3.模块路径搜索

  
  当模块被导入的时候,解释器会首先在内建模块中搜索该模块,如果没有找到,会从sys.path包含的路径中查找该模块。 我们通过几个例子来说明模块路径的搜索过程
  例子1:当模块被导入的时候,解释器会首先在内建模块中搜索该模块,如果没有找到,再从sys.path包含的路径中查找模块
  我们的python安装在d盘的目录下,首先来查看一下sys.path:



>>> import sys
>>> sys.path
['', 'D:\\python2.7\\Lib\\idlelib', 'D:\\python2.7\\lib\\site-packages\\robotframework_selenium2library-1.6.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\docutils-0.12-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\selenium-2.44.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\decorator-3.4.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\pymysql-0.6.2-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\pip_tools-0.3.5-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\robotframework_sshlibrary-2.1.1-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\paramiko-1.15.1-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\ecdsa-0.11-py2.7.egg', 'C:\\windows\\system32\\python27.zip', 'D:\\python2.7\\DLLs', 'D:\\python2.7\\lib', 'D:\\python2.7\\lib\\plat-win', 'D:\\python2.7\\lib\\lib-tk', 'D:\\python2.7', 'D:\\python2.7\\lib\\site-packages', 'D:\\python2.7\\lib\\site-packages\\wx-2.8-msw-unicode']
  下面我在目录(该目录不在sys.path中)C:\Users\PC\Desktop\pythonstudy\test2下,创建一个自定义模块module.py,内容如下:



#_*_coding=utf-8 _*_
def testModuleSeachPath():
print "this is test2"
testModuleSeachPath()
  我们直接在python shell中import 该模块,会提示找不到该模块,原因就是该模块不是内建模块,也不在sys.path中,所以找不到:



>>> import Module
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
import Module
ImportError: No module named Module
  我们手动将Module.py所在的目录加入sys.path 中,再导入该模块,看看解释器是否能找到该模块呢?



>>> sys.path.append("C:\\Users\\PC\Desktop\\pythonstudy\\test2")
>>> sys.path
['', 'D:\\python2.7\\Lib\\idlelib', 'D:\\python2.7\\lib\\site-packages\\robotframework_selenium2library-1.6.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\docutils-0.12-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\selenium-2.44.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\decorator-3.4.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\pymysql-0.6.2-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\pip_tools-0.3.5-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\robotframework_sshlibrary-2.1.1-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\paramiko-1.15.1-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\ecdsa-0.11-py2.7.egg', 'C:\\windows\\system32\\python27.zip', 'D:\\python2.7\\DLLs', 'D:\\python2.7\\lib', 'D:\\python2.7\\lib\\plat-win', 'D:\\python2.7\\lib\\lib-tk', 'D:\\python2.7', 'D:\\python2.7\\lib\\site-packages', 'D:\\python2.7\\lib\\site-packages\\wx-2.8-msw-unicode', 'C:\\Users\\PC\\Desktop\\pythonstudy\\test2']
>>> import Module
this is test2
  这时候,导入模块成功了,说明模块在搜索的过程中查找了sys.path
  
  例子2:假如我们在两个目录中都定义了Module.py ,并且两个目录都在sys.path中,这时候,导入模块,sys.path靠前目录中的模块会优先被执行。
  我们在目录C:\Users\PC\Desktop\pythonstudy\test下再定义一个Module.py,内容如下:



#_*_coding=utf-8 _*_
def testModuleSeachPath():
print "this is test1"
testModuleSeachPath()
  我们再将C:\Users\PC\Desktop\pythonstudy\test目录加入到sys.path中,这个时候再import Module,会不会报错呢?:



>>> sys.path.append("C:\\Users\\PC\\Desktop\\pythonstudy\\test")
>>> sys.path
['', 'D:\\python2.7\\Lib\\idlelib', 'D:\\python2.7\\lib\\site-packages\\robotframework_selenium2library-1.6.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\docutils-0.12-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\selenium-2.44.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\decorator-3.4.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\pymysql-0.6.2-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\pip_tools-0.3.5-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\robotframework_sshlibrary-2.1.1-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\paramiko-1.15.1-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\ecdsa-0.11-py2.7.egg', 'C:\\windows\\system32\\python27.zip', 'D:\\python2.7\\DLLs', 'D:\\python2.7\\lib', 'D:\\python2.7\\lib\\plat-win', 'D:\\python2.7\\lib\\lib-tk', 'D:\\python2.7', 'D:\\python2.7\\lib\\site-packages', 'D:\\python2.7\\lib\\site-packages\\wx-2.8-msw-unicode', 'C:\\Users\\PC\\Desktop\\pythonstudy\test2', 'C:\\Users\\PC\\Desktop\\pythonstudy\\test2', 'C:\\Users\\PC\\Desktop\\pythonstudy\\test']
>>> import Module
>>>
  这时候,我们发现没有报错,但是模块也没有被直接执行。 但是我们再输入Module.testModuleSeachPath()的话,可以看到:



>>> Module.testModuleSeachPath()
this is test2
  这说明目录test2中的'C:\\Users\\PC\\Desktop\\pythonstudy\\test2'的模块被执行了。
  
  例子3:创建一个和内建模块名称一样的模块,并将该目录加入sys.path,再import该模块
  我们在C:\Users\PC\Desktop\pythonstudy\test2目录下创建一个名为sys.py的模块,内容如下:



def testSysModule():
print "test sys Module"
testSysModule()
  我们再尝试导入sys模块,并调用我们自己定义的方法:testSysModule()



>>> import sys

  >>> sys.path
['', 'D:\\python2.7\\Lib\\idlelib', 'D:\\python2.7\\lib\\site-packages\\robotframework_selenium2library-1.6.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\docutils-0.12-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\selenium-2.44.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\decorator-3.4.0-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\pymysql-0.6.2-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\pip_tools-0.3.5-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\robotframework_sshlibrary-2.1.1-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\paramiko-1.15.1-py2.7.egg', 'D:\\python2.7\\lib\\site-packages\\ecdsa-0.11-py2.7.egg', 'C:\\windows\\system32\\python27.zip', 'D:\\python2.7\\DLLs', 'D:\\python2.7\\lib', 'D:\\python2.7\\lib\\plat-win', 'D:\\python2.7\\lib\\lib-tk', 'D:\\python2.7', 'D:\\python2.7\\lib\\site-packages', 'D:\\python2.7\\lib\\site-packages\\wx-2.8-msw-unicode', 'C:\\Users\\PC\\Desktop\\pythonstudy\\test2', 'C:\\Users\\PC\\Desktop\\pythonstudy\\test']

>>> sys.testSysModule()
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
sys.testSysModule()
AttributeError: 'module' object has no attribute 'testSysModule'
  我们发现我们自己定义的模块并没有被搜索到,而是运行了python自带的模块sys。 因此我们在命名自己创建的模块时,不要与Python自带的模块相冲突
  

   4.编译python文件

  我们可以将python编译成.pyc、.pyo形式
  python 具有自带的编译器py_compile ,我们可以用以下方式编译.py文件:
  python -m py_compile Module.py 编译后,会在Module.py所在目录下出现Module.pyc
  python -O py_compile Module.py 编译后,会在Module.py所在目录下出现Module.pyo
  python -OO py_compile Module.py 编译后,会在Module.py所在目录下出现Module.pyo
  注:参数 -O和-OO的区别在于:它们都对代码进行了一定的优化。 但是-O 去掉了代码中的assert语句,-OO 去掉了代码中的__doc__字符串
  
   .pyc、.pyo文件有如下特点:


  •   直接运行.pyc、.pyo并不会提高项目的运行速度,只会提高文件的载入速度
  •   隐藏了源代码,它们很难被反编译
  •   它们是跨平台的字节码文件,可以不需要.py的文件,就可以直接运行
  

  5.包(packages)

  python中也有包的概念。在大型开发项目中,可能有多个开发人员在共同编写代码,在这种情况下,可能会出现模块命名或者变量名重复的情况。 这样我们就需要命名空间来组织每个开发者编写的模块,或者将功能相近的模块放在同一个文件夹下,我们可以将不同的文件夹看成是一个包。 不同的是当我们将文件夹看成包后,该文件夹下必须要有一个__init__.py 文件(该文件可以什么都不写),例如:



test/
__init__.py
pakage1/
__init__.py
module1.py
module2.py
pakage2/
__init__.py
module1.py
module2.py
  我们想使用pakage1下的module1.py 可以这样使用:import test.pakage1.module1
  
  注意:使用from package import item  ,item可以是一个子包或一个模块,或方法、类、变量
          使用import item.subitem.subsubitem  ,subsubitem可以是一个模块或一个子包,但是不能是一个方法、类或变量
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145941-1-1.html 上篇帖子: python中使用多继承 下篇帖子: Python图片处理PIL/pillow/生成验证码/出现KeyError: 和The _imagingft C module is not installed
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表