• Python学习进程(12)模块


        模块让你能够有逻辑地组织你的Python代码段。

        (1)python模块:

        模块化的好处:

    1.把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
    2.模块也是Python对象,具有随机的名字属性用来绑定或引用。
    3.简单地说,模块就是一个保存了Python代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码。

         模块化的实例:

    root@SJM:/home/sunjimeng/桌面# cat first.py
    def ten():
      for index in range(10):
        print index
      return
    root@SJM:/home/sunjimeng/桌面# cat second.py
    import first 
    
    ten()              #这种写法引用不到first.py的ten()函数
    root@SJM:/home/sunjimeng/桌面# vi second.py
    root@SJM:/home/sunjimeng/桌面# cat second.py
    import first 
    
    first.ten()        #这种写法才能引用到
    root@SJM:/home/sunjimeng/桌面# python second.py
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

        无论使用了多少个import语句,包只被引入一次。

          

        (2)import与from ... import ... 语句:

         实例:(演示两种语句的区别)

    root@SJM:/home/sunjimeng/桌面# cat first.py
    def ten():
      for index in range(10):
        print index
      return
    root@SJM:/home/sunjimeng/桌面# cat second.py
    import first                       #这种方法引入的相当于把模块引入。(a)
    from first import ten              #这种方法相当于把函数引入(b)
    
    ten()    #(a)
    first.ten()    #(b)
    root@SJM:/home/sunjimeng/桌面# python second.py
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

        还有一个简单的方法来引入一个模块中的所有项目:

    from modename import *

        (3)定位模块:

        Python会在以下路径中搜索它想要寻找的模块:

    1.程序所在的文件夹;(当前目录)
    2.标准库的安装路径;
    3.操作系统环境变量PYTHONPATH所包含的路径;(shell变量 PYTHONPATH 下的每个目录)

        PYTHONPATH变量:

    1.Windows系统:
    set PYTHONPATH=c:python20lib;
    2.UNIX系统:
    set PYTHONPATH=/usr/local/lib/python

        (4)包:(python导入自定义包的机制:http://www.verydemo.com/demo_c89_i33039.html)

        包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的Python的应用环境。

        1)包可以帮助我们解决以下问题:

    1.为平坦的名称空间加入有层次的组织结构
    2.允许程序员把有联系的模块组合到一起
    3.允许分发者使用目录结构而不是一大堆混乱的文件
    4.帮助解决有冲突的模块名称

        2)模块包:(可以将功能相似的模块放在同一个文件夹中,构成一个模块包。)

    import test_dir.module        #引入在目录test_dir下的所有模块

        注意:该文件夹中必须包含一个__init__.py的文件,提醒Python,该文件夹为一个模块包。__init__.py可以是一个空文件。

        3)创建Python包的实例:

    #1.创建目录结构:
      person
        __init__.py    #这里注意init的前是两个'_'
        dog.py
        eater.py
        drinker.py
    #其中person是目录:
    各个文件的内容如下: __init__.py: from eater import eat from drinker import drink from dog import wow dog.py: def wow(): print 'Dog is WW' eater.py def eat(): print 'Eater is eating' dog.py: def wow(): print 'Dog is WW' #2.在包所在的本地目录下创建文件text.py import person person.eater.eat() person.dog.wow() person.drinker.drink() #__init__.py作用的地方 person.eat() person.drink() person.wow() #3.text.py的执行结果:
    # 包作用的地方 Eater is eating Dog is WW Drinker is drinking
    # __init__文件作用的地方 Eater
    is eating Drinker is drinking Dog is WW 

        4)遇到的问题:

          1.包的标志文件是__init__.py而不是_init_.py文件。(注意'_'的长度);

          2.在Python的.py中添加带有中文的注释要加上一句 "# -*- coding: utf-8 -*-".

          3.如果不在系统中添加搜索路径,使用自定义python包时要将执行文件与包文件放在同一目录。

          4.实现在系统任意目录下引用自定义python包:

          临时方法:(每次关闭Python进程后,修改自动无效)

          _1.将自定义包所在路径加入sys.path:

    >>> import sys
    >>> sys.path
    ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
    >>> sys.path.append('/home/sunjimeng/桌面')
    >>> sys.path
    ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/home/sunjimeng/xe6xa1x8cxe9x9dxa2']

          永久方法:(修改配置文件)

          _2.将文件拷贝到site-package文件夹下:

    root@SJM:/# find / -name '*site-package*'
    /home/sunjimeng/.local/share/Trash/files/Python-3.5.2/Lib/site-packages
    /usr/local/lib/python3.5/site-packages
    /usr/local/lib/python2.7/site-packages
    root@SJM:/# cd /usr/local/lib/python2.7/site-packages
    root@SJM:/usr/local/lib/python2.7/site-packages# cp -r /home/sunjimeng/桌面/person .

          _3.在dist-packages文件夹下新建*.pth(不是.path文件)路径文件。将路径名添加到.path文件中:

          首先python下有两个自定义包配置文件:

    root@SJM:/usr/local/lib/python2.7# ll
    总用量 16
    drwxrwsr-x 4 root staff 4096  7月 23  2014 ./
    drwxr-xr-x 6 root root  4096  7月 17 12:04 ../
    drwxrwsr-x 2 root staff 4096  7月 23  2014 dist-packages/
    drwxrwsr-x 3 root staff 4096  7月 24 11:46 site-packages/

          这种方法相当于永久修改sys.path:

    root@SJM:/usr/local/lib/python2.7/dist-packages# cat person.pth
    /home/sunjimeng/桌面
    root@SJM:/usr/local/lib/python2.7/dist-packages# python
    Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
    [GCC 4.8.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.path
    ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/home/sunjimeng/xe6xa1x8cxe9x9dxa2', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
    >>> import person
    >>> person.eat()
    Eater is eating

        (5)其他与模块有关知识:

        1)命名空间和作用域:

        变量是拥有匹配对象的名字(标识符);命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典.

        一个Python表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。Python会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。

        因此,如果要给全局变量在一个函数里赋值,必须使用global语句:

    # -*- coding= utf-8 -*-
    myname='MenAngel'
    def modifyName():
      myname='sunjimeng'
      # global myname 
      print "函数里的姓名为:",myname
    print "全局里的姓名为:",myname
    modifyName()
    print "全局里的姓名为:",myname

        代码的结果:

    1.没去掉注释:
    全局里的姓名为: MenAngel
    函数里的姓名为: sunjimeng
    全局里的姓名为: MenAngel
    2.去掉注释:
    全局里的姓名为: MenAngel
    函数里的姓名为: sunjimeng
    全局里的姓名为: sunjimeng

        2)dir()函数:

        dir()函数一个排好序的字符串列表,内容是一个模块里定义过的名字:

    >>> import math
    >>> list=dir(math)
    >>> print list
    ['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
    >>> import text
    >>> list=dir(text)
    >>> print list
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'modifyName', 'myname']

        3)globals()和locals()函数:

        根据调用地方的不同,globals()和locals()函数可被用来返回全局和局部命名空间里的名字。

        如果在函数内部调用locals(),返回的是所有能在该函数里访问的命名。如果在函数内部调用globals(),返回的是所有在该函数里能访问的全局名字。

        两个函数的返回类型都是字典。所以名字们能用keys()函数摘取。

    # -*- coding= utf-8 -*-
    # 全局变量
    myname='MenAngel'
    def localArea():
      yourname='sunjimeng' 
      print "局部函数",locals() 
      print "全局函数",globals() 
    print "调用函数"
    localArea()
    print "局部函数",locals()
    print "全局函数",globals()
    调用函数
    局部函数 {'yourname': 'sunjimeng'}
    全局函数 {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'text.py', 'myname': 'MenAngel', '__package__': None, 'localArea': <function modifyName at 0x7f5979061578>, '__name__': '__main__', '__doc__': None}
    局部函数 {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'text.py', 'myname': 'MenAngel', '__package__': None, 'localArea': <function localArea at 0x7f5979061578>, '__name__': '__main__', '__doc__': None}
    全局函数 {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'text.py', 'myname': 'MenAngel', '__package__': None, 'modifyName': <function localArea at 0x7f5979061578>, '__name__': '__main__', '__doc__': None}

        4)reload()函数:

        当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。因此,如果你想重新执行模块里顶层部分的代码,可以用reload()函数。该函数会重新导入之前导入过的模块。语法如下:

    reload(module_name)

        在这里,module_name要直接放模块的名字,而不是一个字符串形式。比如想重载hello模块,如下:

    reload(hello)
  • 相关阅读:
    Centos7下部署两套python版本并存
    运维监控系统之Open-Falcon
    Linux下如何查看系统启动时间和运行时间以及安装时间
    linux下使用FreeRDP 连接 Windows 远程桌面
    python3.6环境部署文档
    应用Fiddler对手机应用来抓包
    Highcharts 向下钻取饼图
    Highcharts 散点图
    IntelliJ IDEA2017 激活方法
    iterable 类型
  • 原文地址:https://www.cnblogs.com/MenAngel/p/5699030.html
Copyright © 2020-2023  润新知