• Python的学习之旅———模块与包的使用 常用模块


    一:import

    导入模块,只会在第一次导入时执行源文件的代码
    如果模块已经加载到内存了,下一次导入直接引用内存中导入的结果

    eval:提取字符串内的表达式执行,然后返回执行结果

    import 导入文件都做了哪些事?

    1 以源文件为准产生一个名称空间
    2 以刚刚产生的名称空间为准,执行源文件的代码
    3 会在当前文件中定义一个名字,这个名字就是模块名,用来引用模块中的名字

    为模块起别名

    import spam as sm

    1 engine_type='mysql'
    2 if engine_type == 'mysql':
    3      import mysql as engine
    4 elif engine_type == 'oracle':
    5      import oracle as engine
    6 engine.parse()

    可以把两个不同的模块引入时候起相同的别名 ,做到调用的时候统一化。小技巧

    在一行导入多个模块

    1 import sys,os,re

    二 使用模块之from ... import...

    from spam import read1,read2,moeny

    直接导入了spam中的 函数 read1 和read2 的名字 也可以导入变量名字 money

    这样使用的时候就不用以spam.read1()的方式调用函数了.

    from spam import *

    一下把spam.py中的所有名字都引入了

    如果引入的模块中有__all__=['字符串函数名','字符串变量名']那么

    from spam import * 中* 对应模块spam内的__all__列表内的名字。

    三模块的重载 

    考虑到性能的原因,每个模块只被导入一次,放入字典sys.module中,如果你改变了模块的内容,你必须重启程序,python不支持重新加载或卸载之前导入的模块,

    有的同学可能会想到直接从sys.module中删除一个模块不就可以卸载了吗,注意了,你删了sys.module中的模块对象仍然可能被其他程序的组件所引用,因而不会被清楚。

    特别的对于我们引用了这个模块中的一个类,用这个类产生了很多对象,因而这些对象都有关于这个模块的引用。

    如果只是你想交互测试的一个模块,使用 importlib.reload(), e.g. import importlib; importlib.reload(modulename),这只能用于测试环境。

    四py文件模块与脚本的区别

     1 编写好的一个python文件可以有两种用途:
     2     一:脚本,一个文件就是整个程序,用来被执行
     3     二:模块,文件中存放着一堆功能,用来被导入使用
     4 
     5 
     6 python为我们内置了全局变量__name__,
     7     当文件被当做脚本执行时:__name__ 等于'__main__'
     8     当文件被当做模块导入时:__name__等于模块名
     9 
    10 作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
    11     if __name__ == '__main__':

    __name__的判断要在写在模块(脚本程序中)

    文件spam.py当做脚本执行,该值等于__main__,文件spam.py当做模块被导入时,该值等于脚本名(spam)

    五 模块的搜索路径

    模块的查找顺序是:内存中已经加载的模块->内置模块(系统内置那些)->sys.path路径中包含的模块

    1 import sys
    2 sys.path.append(r'文件路径a')   a是文件夹
    3 import m
    4 也可以先去找到a 然后顺着a找到m(a和执行文件是在同一个目录下)
    5 from a import m

    把文件的路径加入系统环境变量中,这是加入一次,而不是永久写入。

    六 包介绍

    1包是一种通过使用‘.模块名’来组织python模块名称空间的方式

    具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来
    
    #需要强调的是:
      1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
    
      2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块

    2需要注意的是

    #1.关于包相关的导入语句也分为import和from ... import ...两种,
    但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:
    凡是在导入时带点的,点的左边都必须是一个包(也就是说文件夹下必须有__init__.py这个文件),否则非法。
    可以带有一连串的点,如item.subitem.subsubitem,
    但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,
    点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
    
    #2、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件即包下的__init__.py,导入包本质就是在导入该文件
    
    #3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

    包的标志就是包含__init__.py这个文件。

    图列:

     模块导入的时候都会做三件事 

    1 以源文件为准产生一个名称空间
    2 以刚刚产生的名称空间为准,执行源文件的代码
    3 会在当前文件中定义一个名字,这个名字就是模块名,用来引用模块中的名字

    总结

    1 import包的时候 建议使用 from ...import的形式。这样就不用sys.path.append(r'包的路径')
    2 
    3 from可以用来指定路径  import决定需要获取的名称空间
    4 
    5 运行文件和包在同一文件夹下的时候 可以直接import
    6 
    7 运行文件和包不在同一文件夹下的时候c:acd 运行文件在a下  包在d下 那么就需要在运行文件中首先导入sys.path.append(r'c:acd')
    包以及包所包含的模块都是用来被导入的,而不是被直接执行的。而环境变量都是以执行文件为准的

     执行文件调用包内名称的方式决定了from 路径结构

    第一种

    1 执行文件中
    2 import a
    3 a.f1()
    4 a.f2()
    5 a.f3()
    6 a包 __init__中的代码 7 from .am1 import f1 #等同于绝对路径from a.am1 import f1
    8 from .am2 import f2 9 from .b.bm1 import f3

    第二种

    执行文件中
    import a.b.bm1
    a.b.bm1.f3()
    a包
    __init__中没有代码

    第三种

    1 执行文件中
    2 from a.b.bm1 import f3
    3 f3()
    4 a包 __init__中没有代码

     第一种依赖包中__init__ ,第二种是不依赖__init__.

  • 相关阅读:
    为什么今日头条是技术牛人收割机(FW)
    独家|浅谈用户行为数据的价值挖掘(PPT)(FW)
    深度学习笔记
    "堕落"的头条,还是"不堪"的民众?
    理解传统企业的问题与困惑
    人工智能在医疗领域究竟要怎么玩?(FW)
    佟崴嵬
    youtube true view的逻辑
    AI第一性原理
    域对象的属性和请求的转发重定向
  • 原文地址:https://www.cnblogs.com/surehunter/p/7687201.html
Copyright © 2020-2023  润新知