• Python的模块


     1、什么是模块?

        模块就是一系列功能的集合体
    (1)内置的模块c和c++编写(python解释器已经做好了),只需要研究如何用。
    (2)第三方模块 (其他人帮忙写的)
    (3)自定义的模块(自己开发的),
    python写的
    c、c++编写
    一个python文件(文件名m.py)本身就是一个模块。模块名叫m
    了解:
    模块有四种形式:
    (1)使用python编写的.py文件
    (2)已被编译为共享库或DLL的C或C++扩展(了解)
    (3)把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
    (4)使用C编程并链接到python解释器的内置模块。
    2、为何有模块?
    (1)内置与第三方的模块拿来就用,无需自己定义,这种拿来主义,可以极大的提高开发效率。
    (2)自定义模块
    可以将程序的各部分功能提取出来放到一个模块中,可以为大家共享。
    优点:减少了代码的冗余,程序组织结构更加清晰。
    3、如何用模块?
    导入功能
    # 首次导入模块会发生的事?
    # 1、执行foo.py文件
    # 2、产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中。
    # 3、在当前文件中产生一个名字foo,该名字指向步骤2中产生的名称空间。

    # 之后的导入,都是直接引用首次导入产生的foo.py名称空间,不会重复执行代码。
    # import foo

    先定义一个foo.py文件

    print("模块foo==>")
    
    x = 1
    # 函数在定义阶段已经定义好了x
    def get():
        print(x)
    
    def change():
        global x
        x = 0
    y = 333
    z = 444
    import foo
    # 首次导入模块会发生的事?
    # 1、执行foo.py
    # 2、产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中。
    # 3、在当前文件中产生一个名字foo,该名字指向步骤2中产生的名称空间。
    
    # 之后的导入,都是直接引用首次导入产生的foo.py名称空间,不会重复执行代码。
    # import foo
    # 引用
    # 强调1:指名道姓的问某个模块要名字对应的值,名称空间的作用不会与当前名称空间中的名字发生冲突。
    # import foo
    # print(foo.x)
    # print(foo.get)
    # print(foo.change)
    """运行结果如下:
    模块foo==>
    1
    <function get at 0x000001FB30359670>
    <function change at 0x000001FB30359700>
    """
    # x=1111
    # print(x) # 1111
    
    # 强调2:无论是查看还是修改操作的都是模块本身,与调用位置无关。
    import foo
    x = 3333
    foo.get()  # 当初在foo文件中就定义了get()函数 运行结果是: 1
    
    foo.change()
    print(x)
    # 可以以逗号为分隔符在一行导入导入多个模块
    # import foo,foo1,foo2  # 不建议这么做,代码不清晰
    
    # 4、建议如下方式导入
    # import foo
    # import foo1
    # import foo2
    
    
    # 5、导入模块的书写规范:按顺序导入
    # import 内置模块
    # import 第三方模块
    # import 自定义模块
    
    # 6、import 。。。as 。。。起一个别名,针对导入的名称过长使用别名
    import foo as f  # f = foo
    f.get()
    # 7、模块是第一类对象,指的是模块可以当返回值,当作变量,当作参数,当作容器类型的元素,可以被赋值,
    
    # 8、自定义模块应该采用纯小写+下划线的风格。
    # python2中有驼峰式风格,python3全改成了小写风格。
    
    # 9、可以在函数内导入模块
    def func():
        import foo

     10、from...import....

    # import 导入模块在使用必须加前缀'模块.'的优缺点
    # 优点:肯定不会与当前名称空间中的名字冲突
    # 缺点:加入前缀显得麻烦。
    
    # 可以不加'模块.'前缀吗?使用from
    from foo import x  # x=模块foo中值0的内存地址
    from foo import get
    from foo import change
    
    # print(x)      # 1
    # print(get)    # <function get at 0x000002B282459670>
    # print(change) # <function change at 0x000002B282459700>
    
    # from...import...导入也发生了三件事
    # 1、产生一个模块的名称空间。
    # 2、运行foo.py将运行过程中产生的名字都丢到模块的名称空间去。
    # 3、在当前名称空间拿到一个名字,该名字与模块名称空间中的某一个内存地址
    
    x = 33333333
    # print(x)

    from foo import x  # x=模块foo中值0的内存地址
    from foo import get
    from foo import change
    
    # x = 33333333
    # print(x)
    
    get() # 1
    
    change()  # 运行change后查看x是否变化
    print(x)  # 1
    get()  # 0
    print(x)  # 1

     

    # from...import...导入模块在使用时也不用加前缀
    # 优点:代码更精简
    # 缺点:容易与当前名称空间混淆
    
    from foo import x # x=模块foo中值1的内存地址
    x = 1111  # 当前名称空间的内存地址
    11# from...import....:一行导入多个名字(不推荐使用)
    # from foo import x,get,change
    
    # *:导入模块中所有名字(大多情况下不使用,容易与当前名称空间里的名字混淆)
    # name = 'lsj'
    # from foo import name

     

    12、了解:__all__
    __all__
    = ['x','get','change'] # 控制*代表的名字有哪些
    # 13、起别名使用as
    from foo import get as g
    # 14、循环导入问题
    # 模块互相导入--垃圾设计
    # 准备数据:m1.py和m2.py文件。
    # 假设:从m1模块中导入m2,从m2模块中导入m1 import test021_07_m1 # 循环导入不会产生重复创建名称空间 # ImportError: cannot import name 'x' from partially initialized module 'test021_07_m1' (most likely due to a circular import) (D:pycharmoldboy_29day021 est021 est021_07_m1.py) # 方案一:解决循环导入这种垃圾设计,把变量放到导入的上面。 # 方案二:提出两个模块中的共有部分给第三个模块,这两个模块都跟第三方要。 # 方案三:利用函数在定义阶段不会运行代码的特点# 使用方案二:
    # m1的模块print("正在导入m1")
    # # x = "这是m1里的x" # 方案一:解决循环导入这种垃圾设计,把变量放到导入的上面 # from test021_07_m2 import y x = "这是m1里的x" # m2的模块print("正在导入m1")
    # # y = "这是m2里的y" # 方案一:解决循环导入这种垃圾设计,把变量放到导入的上面 # from test021_07_m1 import x y = "这是m2里的y"

     

    # 使用方案三:某个函数需要调用某些功能,导入的时候放到局部内。
    #
    m1的模块 print("正在导入m1") # 方案三:利用函数在定义阶段不会运行代码的特点 def f1(): from test021_07_m2 import y print(x) x = "这是m1里的x" # m2的模块 print("正在导入m1") # 方案三:利用函数在定义阶段不会运行代码的特点 def f1(): from test021_07_m1 import x print(y) y = "这是m2里的y"

     

    # 15、模块查找的优先级:import和from...import...在导入模块时都涉及到查找问题。
    # 优先级:
    # 1、内存中存在过的,先从内存中查找,(内置模块)
    # 2、从硬盘找:按照sys.path中存放的文件的顺序依次查找要导入的模块。(执行文件和导入文件)
    # 3、
    
    import foo
    
    from foo import x
    
    import sys
    print(sys.path)  # 值为一个列表,存放了一系列文件夹,其中第一个文件夹时当前执行文件所在的文件夹
    
    # python中的.zip是文件夹

     

    # 16、了解:sys.modules查看已经加载到内存中的模块
    # import sys
    # print(sys.modules)  # 打印查看的modules模块
    # print('foo' in sys.modules)  # 判断模块是否存在--》False
    # print('builtins' in sys.modules)  # 判断模块是否存在--》True
    #
    # # 导入foo模块再次查看
    # import foo  # foo=模块的内存地址
    # print('foo' in sys.modules)  # 判断模块是否存在--》True
    # print(sys.modules)  # ...'D:\pycharm\oldboy_29\day021\test021\foo.py'>
    #
    # del foo  # 解除链接
    # print(sys.modules)  # 但是还有:'D:\pycharm\oldboy_29\day021\test021\foo.py'>,这是python的优化机制

     

    # 当我找一个模块时候
    import sys
    # 都找不到的时候,添加个文件路径,到环境变量中
    sys.path.append(r'D:pycharmoldboy_29day021	est021a_pathfoo.py')
    
    import foo

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Java开发中的23种设计模式详解(转)
    主表和从表
    MyBatis开发中解决返回字段不全的问题
    个人常用配置文件解析
    SpringMVC+MyBatis开发中指定callSettersOnNulls,可解决返回字段不全的问题
    mybatis之sql执行有数据但返回结果为null
    Hadoop window win10 基础环境搭建(2.8.1)
    什么水平算精通C++ Builder?
    Delphi中取得汉字的首字母(十分巧妙)
    全部的Windows消息对应值
  • 原文地址:https://www.cnblogs.com/liunaixu/p/12674971.html
Copyright © 2020-2023  润新知