zoukankan      html  css  js  c++  java
  • 初始python模块

    Python语言中,模块分为三类。

    第一类:内置模块,也叫做标准库。此类模块就是python解释器给你提供的,比如我们之前见过的 time模块,os模块。标准库的模块非常多(200多个,每个模块又有很多功能),我们这几天 就讲常用的十几种,后面课程中还会陆续的讲到。

    第二类:第三方模块,第三方库。一些python大神写的非常好用的模块,必须通过pip install 指令安 装的模块,比如BeautfulSoup, Django,等等。大概有6000多个。

    第三类:自定义模块。我们自己在项目中定义的一些模块。

    一、自定义模块

    • 什么是模块?

      • 模块的本质就是.py文件,封装代码的最小单位
    • 什么是自定义模块?

      • 就是自己写的.py文件,可以定义函数,变量、循环等
    • 模块的运行方式:

      • 脚本方式:用解释器运行(cmd运行、pyc右键运行)
      • 模块的方式:import导入运行,为导入它的模块提供资源
    • python为我们内置了全局变量__name__

      • 当文件被当做脚本执行时:name 等于'main'
      • 当文件被当做模块导入时:__name__等于模块名
      • 这样设置的作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码)
    • print('from the tbjx.py')
      
      __all__ = ['name', 'read1',]
      
      name = '太白金星'
      
      def read1():
      
      def read2():
         print('tbjx模块')
         read1()
      
      def change():
          
         global name
         name = 'barry'
      
      #添加了这个判断的的调用,说明是在测试阶段,那么调用本模块的时候,下面的read1()不会执行的
      if __name__ == '__main__':  
         # 在模块文件中测试read1()函数
         # 此模块被导入时 __name__ == tbjx 所以不执行
         read1()
      

    二、模块的搜索路径

    • Python中引用模块是按照一定的规则以及顺序去寻找的,这个查询顺序为
      • 内存中已经加载的模块->内置模块->sys.path路径中包含的模块
    • 模块的查找顺序
      1. 在第一次导入某个模块时(比如tbjx),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用(ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看)
      2. 如果没有,解释器则会查找同名的内置模块
      3. 如果还没有找到就从sys.path给出的目录列表中依次寻找tbjx.py文件。
    • 需要特别注意的是:
      • 我们自定义的模块名不应该与系统内置模块重名!!!!
    #在初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载。
    
    import sys
    sys.path.append('/a/b/c/d')
    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')
    
    #至于.egg文件是由setuptools创建的包,这是按照第三方python库和扩展时使用的一种常见格式,.egg文件实际上只是添加了额外元数据(如版本号,依赖项等)的.zip文件。
    
    #需要强调的一点是:只能从.zip文件中导入.py,.pyc等文件。使用C编写的共享库和扩展块无法直接从.zip文件中加载(此时setuptools等打包系统有时能提供一种规避方法),且从.zip中加载文件不会创建.pyc或者.pyo文件,因此一定要事先创建他们,来避免加载模块是性能下降。
    
    接下来我们就开始讲解python常用的内置模块,由于Python常用的模块非常多,我们不可能将所有的模块都讲完, 所以只针对于工作中经常用到模块进行讲解。剩下的模块可以在课余时间自学。
    
    import sys
    #过去当前文件的绝对路径
    print(__file__)
    
    #使用os模块获取当前文件的父路径
    import os
    print(os.path.dirname(__file__)+'/A')
    
    #使用os、sys模块获取当前文件夹的相对路径
    import sys
    import os
    sys.path.append(os.path.dirname(__file__) + '/aa')
    

    三、导入方式

    3.1、直接导入

    import 模块名
    

    3.2、导入多个模块

    import os,sys,json   # 这样写可以但是不推荐
    
    #推荐写法  
    #多行导入:易于阅读 易于编辑 易于搜索 易于维护。
    import os
    import sys
    import json
    

    3.3、from ... import ... 使用

    • from...import... 与import对比
      • 唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀:tbjx.
    • from...import...的方式有好处也有坏处
      • 好处:使用起来方便了
      • 坏处:容易与当前执行文件中的名字冲突、执行文件有与模块同名的变量或者函数名,会有覆盖效果。

    一行导入一个:

    from ... import ... 的使用示例。
    
    from tbjx import name, read1
    print(name)
    read1()
    
    '''
    执行结果:
    from the tbjx.py
    太白金星
    tbjx模块: 太白金星
    
    '''
    

    一行导入多个:

    from tbjx import read1,read2,name
    

    3.4、 from ... import *

    • from spam import * 把tbjx中所有的不是以下划线(_)开头的名字都导入到当前位置

    ​ 大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。

    可以使用all来控制*(用来发布新版本),在tbjx.py中新增一行

    #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字
    __all__=['money','read1'] 
    

    3.5、模块循环导入问题

    ​ 模块循环/嵌套导入抛出异常的根本原因是由于在python中模块被导入一次之后,就不会重新导入,只会在第一次导入时执行模块内代码

    ​ 在我们的项目中应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方在程序出现了循环/嵌套导入后的异常分析、解决方法如下(了解,以后尽量避免

    3.6、为模块起别名

    • 好处

      • 可以将很长的模块名改成很短,方便使用
      import tbjx as t
      t.read1()
      
      • 有利于代码的扩展和优化
      #mysql.py
      def sqlparse():
          print('from mysql sqlparse')
      #oracle.py
      def sqlparse():
          print('from oracle sqlparse')
      
      #test.py
      db_type=input('>>: ')
      if db_type == 'mysql':
          import mysql as db
      elif db_type == 'oracle':
          import oracle as db
      
      db.sqlparse()
      
  • 相关阅读:
    Android中使用File文件进行数据存储
    Android 获取 json
    Android服务之Service
    php
    宝塔数据库连接不上
    idea中使用github
    elasticjob 当当的分布式定时任务管理
    定时任务规则生成器
    MySQL中group_concat()函数的排序方法
    mysql 中关于怎么写 row_number()over(order by) 类似的功能支持
  • 原文地址:https://www.cnblogs.com/hsyw/p/13624524.html
Copyright © 2011-2022 走看看