zoukankan      html  css  js  c++  java
  • 模块的使用

    1、导入模块的时候,重复导入多次,效果等同导入一次

    (看看自己的内存里有没有,如果已经存在,就不干活,没有才导入)

    import time
    import time
    import time
    ...
    # 重复导入,不用的担心报错

    2、导入模块,给这个模块创建一个命名空间,在这个命名空间中执行代码

    3.模块里面的变量名不影响当前文件里面的同名的变量

    (注意:模块本身的名字不能和当前文件中的变量名重名,因为导入模块后,模块名想当于当前文件的全局变量)

    import re
    def findall():
        return '11'
    l = 'abcd'
    print(re.findall('a',l))      #['a'] re模块里面的函数名
    print(findall())                #11 当前文件的函数名

    import name as new_name

    import time as a
    print(a.time())     #10000000000        # a.time     (time.time,把前面的time重命名成a)

    什么时候用这种方式

    1.前面的名字太长    重新命名一个简洁的
    2.当import的模块和我的文件中的变量同名的时候
    3.兼容多个模块的时候
            if 是MySQL数据库:
                import MySQL as db
            elif 是oracle数据库:
                import oracle as db
            db.open
            db.write
            ......

    注意: 重名名之后,之前的名字失效

    导入多个模块注意事项:

    1.先导入内置的模块
    2.再导入扩展模块: (requests  beautifulsoup  django  selenium  paramiko 等)
    3.最后导入自定义的模块
    (空行隔开)
    from collections import namedtuple          #也支持as重命名   from collections import namedtuple  as abcd
    namedtuple = 1   
    ## namedtuple 就会发生重新赋值

    import name #引用name模块中的方法较多的时候,用这个

    from name import * #不推荐使用

    from name import a #当 引用name模块中的1,2个方法的时候,用这个(节省内存)

    from name import * 中:

    1.把my_module中所有的不是以下划线(_)开头的名字都导入到当前位置
    2.*受到 __all__ = [变量名........]的限制,
                如果没有__all__,默认全部
                定义了__all__,列表中有的变量名才可以用

    自定义模块

    为了不使模块中的变量直接 调用 或 打印,整个模块文件要加一个判断

    if __name__ == ‘__main__’:
        模块代码
        print(11)
        ...
    #在模块自身文件中执行,name==main
    #在需要导入的当前文件中执行,name == 模块名

    import me

    当一个py文件被当做一个模块导入的时候,会自动生成一个pyc文件

    pyc文件是这个代码编译之后的文件,节省了每一次导入代码之后还要编译的时间

    很智能,先检测,没有pyc文件,新创建一个,如果检测pyc文件修改了,在重新编译并覆盖

    模块搜索路径

    在第一次导入某个模块时(比如my_module),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用,如果没有,解释器则会查找同名的内建模块,如果还没有找到就从sys.path给出的目录列表中依次寻找my_module.py文件。

    所以模块的查找顺序是:

      内存中已经加载的模块->内置模块->sys.path路径中包含的模块

    需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。

    在初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载

    sys.path 自己可以修改

    1 >>> import sys
    2 >>> sys.path.append('/a/b/c/d')  #放到后面,会被最后搜索(前提是前面找不到)
    3 >>> sys.path.insert(0,'/x/y/z') #排在前的目录,优先被搜索

    注意:搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找

    sys.path中还可能包含.zip归档文件和.egg文件,python会把.zip归档文件当成一个目录去处理。

    #首先制作归档文件:zip module.zip foo.py bar.py
    import sys
    sys.path.append('module.zip')
    import foo,bar
    #也可以使用zip中目录结构的具体位置
    sys.path.append('module.zip/lib/python')
    #windows下的路径不加r开头,会语法错误
    sys.path.insert(0,r'C:UsersAdministratorPycharmProjectsa')

    官网解释:

    官网链接:https://docs.python.org/3/tutorial/modules.html#the-module-search-path

    当一个命名为my_module的模块被导入时,解释器首先会从内建模块中寻找该名字,找不到,则去sys.path中找该名字

    sys.path从以下位置初始化

      执行文件所在的当前目录

      PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)

      依赖安装时默认指定的

    注意:在支持软连接的文件系统中,执行脚本所在的目录是在软连接之后被计算的,换句话说,包含软连接的目录不会被添加到模块的搜索路径中


    在初始化后,我们也可以在python程序中修改sys.path,执行文件所在的路径默认是sys.path的第一个目录,在所有标准库路径的前面。这意味着,当前目录是优先于标准库目录的,需要强调的是:我们自定义的模块名不要跟python标准库的模块名重复,除非你是故意的,傻叉。

    dir()函数:

    内建函数dir是用来查找 模块中定义的名字 ,返回一个有序字符串 列表

    import my_module
    dir(my_module) 

    如果没有参数,dir()列举出 当前定义的名字

    dir()不会列举出内建函数或者变量的名字,它们都被定义到了标准模块builtin中,可以列举出它们,

    import builtins
    dir(builtins)

    包:

    为了组织好模块,会将多个模块分为包。

    简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件。

    (一群模块文件的集合 + __init__文件)

    python2里面必须有 init

    python3 可以没有

    1..关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个

    包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。

  • 相关阅读:
    ACM题集以及各种总结大全
    ACM题集以及各种总结大全
    线段树题集
    线段树题集
    POJ 1159 Palindrome【LCS+滚动数组】【水题】
    POJ 1159 Palindrome【LCS+滚动数组】【水题】
    开课博客
    第一周学习进度
    开学测试
    寒假总结
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/9295628.html
Copyright © 2011-2022 走看看