• 14.Python略有小成(自由模块)


    Python(模块)

    一、模块定义与分类

    ​ 我们说一个函数就是一个功能,那么把一些常用的函数放在一个py文件中,这个文件就称之为模块,模块,就是一些列常用功能的集合体,模块就是文件,存放一堆常用的函数,一个模块就是一个py文件,这个模块存储很多相似的函数集合体

    ​ 10个文件有50个函数,有一些相同功能或者相似功能的函数,代码冗余,重复,我们应该将这10个函数提取出来,放在一个文件中.

    1. 节省代码
    2. 容易维护,组织结构更清晰

    模块分类

    • 内置模块,标准库python解释器自带的有200多种

    • 第三方库(模块),各种大神些的一些模块,通过pip install...安装,6000种

    • 自定义模块,我们自己在项目中定义的一些模块

      # 定义一个模块,定义一个模块其实很简单就是写一个文件
      print('from the tbjx.py')
      name = '张三丰'
      def read1():
          print('tbjx模块:',name)
      def read2():
          print('tbjx模块')
          read1()
      def change():
          global name
          name = 'barry'
      

    二、import

    • import(导入的意思),模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行

    • import语句是可以在程序中的任意位置使用的,且针对同一个模块,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句)

      # 注意 : 那个文件执行文件,哪个文件是被执行模块。   
      代码示例:
      import tbjx
      import tbjx
      import tbjx
      import tbjx
      import tbjx
      # import tbjx 只在第一次导入时才执行tbjx.py内代码,此处的显式效果是只打印一次,当然其他的顶级代码也都被执行了,只不过没有显示效果.
      

    三、第一次导入模块发生的三件事

    1. 将tbjx.py文件加载到内存
    2. 在内存中创建一个以tbjx命名的名称空间
    3. 通过tbjx名称空间的名字,等方式引用此模块的名字(变量,函数名,类名等等)

    注意 : 重复导入会直接引用内存中已经加载好的结果

    四、被导入模块有独立的名称空间

    ​ 每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

    # 模块名字 lern.py 模块内如下信息 
    print("乾坤")
    name="张三丰"
    ---------------------------------
    import lern # 执行结果 乾坤
    name="张无忌"
    print(lern.name) # 打印结果 张三丰
    

    五、为模块起别名

    1. 将一个比较长的模块名化简成简单的

      import tbjx as t
      t.read1()
      
    2. 有利于代码的扩展和优化

      #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()
      

    六、导入多个模块

    ​ 我们以后再开发过程中,免不了会在一个文件中,导入多个模块,

    • 注意 : 推荐写法是一个一个导入

      import os,sys,json   # 这样写可以但是不推荐
      ---------------------------------
      # 推荐写法
      import os
      import sys
      import json
      

    七、from...import...

    1. form...import...的使用

      # 模块名字 lern.py 模块内如下信息 
      print("乾坤")
      name="张三丰"
      def read1():
      	print("丐帮")
      ---------------------------------
       # from ... import ... 的使用示例。
      from lern import name, read1 # 执行结果 乾坤
      print(name) # 张三丰
      read1() # 丐帮
      
    2. form...import...与import对比

      ​ 唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀

      ​ from...import...的优缺点

      • 优点 : 使用起来方便了
      • 容易与当前执行文件中的名字冲突

      注意1 : 执行文件有与模块同名的变量或者函数名,会有覆盖效果,例子如下

      # 模块名字 lern.py 模块内如下信息 
      name = '武当'
      def read1():
          print('tbjx模块:',name)
      def read2():
          return read1()
      def change():
          global name
          name = 'barry'
      ---------------------------------
      name = 'oldboy'
      from lern import name, read1, read2
      print(name) # 武当
      ---------------------------------
      from lern import name, read1, read2
      name = 'oldboy'
      print(name) # oldboy
      ---------------------------------
      def read1():
          print(666)
      from lern import name, read1, read2
      read1() # tbjx模块:武当
      ---------------------------------
      from lern import name, read1, read2
      def read1():
          print(666)
      read1() # 666
      

      注意2 : 当前位置直接使用read1和read2就好了,执行时,仍然以lern.py文件全局名称空间

      # 模块名字 lern.py 模块内如下信息 
      name = '武当'
      def read1():
          print('tbjx模块:',name)
      def read2():
          return read1()
      def change():
          global name
          name = 'barry'
      ---------------------------------
      from lern import read1
      name = 'alex'
      read1() # tbjx模块: 武当
      ---------------------------------
      from lern import read2
      def read1():
          print('==========')
      read2() # tbjx模块:武当
      ---------------------------------
       # 同时通过这种方式引用的模块也可以对模块进行改名。
      from tbjx import read1 as read
      read()
      
      
    3. form...import*

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

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

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

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

    八、一行导入多个

    from tbjx import read1,read2,name
    
    

    九、py文件的两种功能

    1. 编写好的一个python文件可以有两种用途:

      • 脚本,一个文件就是整个程序,用来被执行(比如模拟博客园的登录)
      • 模块,文件中存放着一堆功能,用来被导入使用
    2. python为我们内置了全局变量__ name __

      • 当文件被当做脚本执行时:__ name __ 等于__ main __
      • 当文件被当做模块导入时:__ name __等于模块名

    作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码)

    十、模块的搜索路径

    当你引用一个模块时,不见得每次都可以import到

    • Python中引用模块是按照一定的规则以及顺序去寻找的,这个查询顺序为:先从内存中已经加载的模块进行寻找找不到再从内置模块中寻找,内置模块如果也没有,最后去sys.path中路径包含的模块中寻找。它只会按照这个顺序从这些指定的地方去寻找,如果最终都没有找到,那么就会报错。
    • 内存中已经加载的模块->内置模块->sys.path路径中包含的模块

    模块的查找顺序

    1. 在第一次导入某个模块时(比如lern),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用(ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看)
    2. 如果没有,解释器则会查找同名的内置模块
    3. 如果还没有找到就从sys.path给出的目录列表中依次寻找lern.py文件。

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

  • 相关阅读:
    UniGui使用IconFont图标(新)
    uniGUI uniEdit回车键处理遇到的问题
    War包的目录结构
    FAT32和NTFS最大支持的单个文件大小分别是多大?
    释放 MappedByteBuffer映射的内存
    C#基础篇 正则表达式入门
    JAVA获取文件MD5值
    C#正则表达式语法规则详解
    MD5加密算法原理及实现
    Java 文件名操作的相关工具类 & Java中windows路径转换成linux路径等工具类
  • 原文地址:https://www.cnblogs.com/chenshuo531702820/p/11093512.html
Copyright © 2020-2023  润新知