• Python的模块


    模块

    模块是Python架构的一个核心概念

    • 模块就好比工具包,要想使用这个工具包中的工具,就需要导入import这个模块
    • 每一个以拓展名py结尾的python原代码文件都是一个模块
    • 在模块中定义的全局变量、函数、类都是模块能够提供给外界直接使用的工具
    • 导入模块时一般要遵循的规范【补充】

      • 注释:文件顶部或init文件中。

      • 在文件顶部导入

      • 有规则导入,并用空行分割。

        # 先内置模块
        
        # 再第三方模块
        
        # 最后自定义模块

    1.1第一个模块体验

    • 第一个模块:
       1 # -*- coding: gbk -*-
       2 # 找最大值
       3 def max_1(a,b,c):
       4     if a>b:
       5         if a>c:
       6             print("最大值为:",a)
       7         else:
       8             print("最大值为:",c)
       9     else:
      10         if b>c:
      11             print("最大值为:",b)
      12         else:
      13             print("最大值为:",c)
      14 
      15 # 找最小值
      16 def min_1(a,b,c):
      17     if a<b:
      18         if a<c:
      19             print("最小值为:",a)
      20         else:
      21             print("最小值为:",c)
      22     else:
      23         if b<c:
      24             print("最小值为:",b)
      25         else:
      26             print("最小值为:",c)
      27 
      28 name_1 = "某人飞"
      test1模块
    • 第二个模块:
      1 import test1
      2 test1.max_1(10,60,30)
      3 test1.min_1(10,60,30)
      4 print(test1.name_1)
      test2模块
    • 体验小结:
      • 可以在一个Python文件中定义变量或者函数
      • 然后在另一个文件中使用import导入这个模块
      • 导入之后,就可以使用 模块名.变量 / 模块名.函数 方式,使用这个模块中定义的变量或者函数
    • 模块可以让曾经写过的代码方便被 复用

    1.2模块名也是一个标识符

    • 标识符可以由 字母、数字 和 下划线 组成
    • 不能以数字开头
    • 不能与关键字重名

    注意:如果在给Python文件起名时,以数字开头是无法在 PyCharm 中导入这个模块的  

    1.3导入模块的两种方式

    1. import 导入:
      import 模块名1, 模块名2     #不推荐使用

      提示:在导入模块时,每个导入应该独占一行:

      import 模块名1
      import 模块名2
      • 导入之后
        • 通过 模块名. 使用 模块提供的工具 —— 全局变量、函数、类
    • 使用 as 指定模块的别名
      • 如果模块的名字太长,可以使用as指定模块的名称,以方便在代码中的使用:
        import 模块名1 as  模块别名

        注意:模块别名应该符合 大驼峰 命名法

      •  演示:
         1 # -*- coding: gbk -*-
         2 # 找最大值
         3 def max_1(a,b,c):
         4     if a>b:
         5         if a>c:
         6             print("最大值为:",a)
         7         else:
         8             print("最大值为:",c)
         9     else:
        10         if b>c:
        11             print("最大值为:",b)
        12         else:
        13             print("最大值为:",c)
        14 
        15 # 找最小值
        16 def min_1(a,b,c):
        17     if a<b:
        18         if a<c:
        19             print("最小值为:",a)
        20         else:
        21             print("最小值为:",c)
        22     else:
        23         if b<c:
        24             print("最小值为:",b)
        25         else:
        26             print("最小值为:",c)
        27 
        28 name_1 = "某人飞"
        test_1_wohaofuzaa模块
        1 import test_1_wohaofuzaa as tes
        2 tes.max_1(10,60,30)
        3 tes.min_1(10,60,30)
        4 print(tes.name_1)
        test2模块

        注意:当导入模块时,给模块起了别名,那么就只能使用别名去调用模块中的工具

    1. from...improt导入
    • 如果希望 从 某一个模块 中,导入 部分工具,就可以使用 for...import的方式
    • import 模块名 是一次性把模块中 所有的工具全部导入,并且通过 模块名/别名 访问
      #从模块导入某一个工具
      from...模块名1  import  工具名
    • 导入之后

      • 不需要通过 模块名.
      • 可以直接使用 模块提供的工具——全局变量、函数、类
         1 # -*- coding: gbk -*-
         2 # 找最大值
         3 def max_1(a,b,c):
         4     if a>b:
         5         if a>c:
         6             print("最大值为:",a)
         7         else:
         8             print("最大值为:",c)
         9     else:
        10         if b>c:
        11             print("最大值为:",b)
        12         else:
        13             print("最大值为:",c)
        14 
        15 # 找最小值
        16 def min_1(a,b,c):
        17     if a<b:
        18         if a<c:
        19             print("最小值为:",a)
        20         else:
        21             print("最小值为:",c)
        22     else:
        23         if b<c:
        24             print("最小值为:",b)
        25         else:
        26             print("最小值为:",c)
        27 
        28 name_1 = "某人飞"
        test_1_wohaofuzaa模块
        1 # -*- coding: gbk -*-
        2 from test_1_wohaofuzaa import max_1
        3 from test_1_wohaofuzaa import name_1
        4 max_1(10,60,30)
        5 #min_1(10,60,30)    #报错,并没有导入这个函数
        6 print(name_1)
        test2模块

      注意:如果两个模块,存在同名的函数名,那么后导入的模块的函数,会覆盖掉先导入的函数

      • 开发时 import 代码应该统一写在 代码的顶部,更容易及时发现冲突
      • 一旦发现冲突,可以使用as关键字给其中一个工具起别名
        1 # -*- coding: gbk -*-
        2 from test_1_wohaofuzaa import max_1 as ma
        3 from test_1_wohaofuzaa import name_1 as name
        4 ma(10,60,80)
        5 #min_1(10,60,30)    #报错,并没有导入这个函数
        6 print(name)
        别名演示
    • from...import * 
      •  一次性导入模块的所有工具
      • 不推荐使用这种方式,因为函数重名并没有任何提示,出现问题不好排查(会被后导入的模块函数覆盖)
        # -*- coding: gbk -*-
        from test_1_wohaofuzaa import *
        max_1(10,60,80)
        min_1(10,60,30)
        print(name_1)

     使用场景:

    • import:项目根目录的包、模块级别的导入
    • from:成员、嵌套的包、木块导入
    • 两种都可以使用as别名,处理重名情况

    2.1模块的搜索顺序

    Python解释器在导入模块时,会:

    • 搜索 当前目录 指定模块名的文件,如果有就会直接导入
    • 如果没有,再搜索 系统目录
      [
          '当前执行脚本所在的目录', /Users/wupeiqi/PycharmProjects/luffyCourse/day14/bin
          /Users/wupeiqi/PycharmProjects/luffyCourse/day14
          '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display',
          '/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
          '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
          '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
          '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages',              #这个是第三方模块存放的包
          '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_matplotlib_backend'
          
      ]
    • 想要在系统目录中添加自己需要的目录,可以使用sys模块中的sys.path.append(路径)
      import sys
      import os
      """
      举例子:如果当前脚本不在项目的根目录,又想将项目的跟目录添加进搜索目录的列表
      """
      # 获取当前脚本的路径,然后找到根目录
      path = os.path.dirname(os.path.abspath(__file__))
      # 将路径添加到搜索目录的列表
      sys.path.append(path)
      import xxxxx  # 导入路径A下的一个xxxxx.py文件

      注意:在开发时,给文件起名,不要和 系统的模块文件 重名

    Python中每一个模块都有一个内置属性 __file__ 可以 查看模块 的完整路径

    import random
    rand = random.randint(1,3)
    print(rand)

    此时代码可以正常执行,但是如果我再当前目录下,新建了一个空白的random模块,那么就会报错

    import random
    # 查看导入的模块的路径
    print(random.__file__) #D:\python_DM\venv\jiaoxue\模块\random.py

    2.1原则——每一个文件都应该是被导入的

    • 一个独立的python文件就是一个模块
    • 在导入文件时,文件中所有没有任何缩进的代码 都会被执行一遍
       1 # -*- coding: gbk -*-
       2 # 找最大值
       3 def max_1(a,b,c):
       4     if a>b:
       5         if a>c:
       6             print("最大值为:",a)
       7         else:
       8             print("最大值为:",c)
       9     else:
      10         if b>c:
      11             print("最大值为:",b)
      12         else:
      13             print("最大值为:",c)
      14 
      15 # 找最小值
      16 def min_1(a,b,c):
      17     if a<b:
      18         if a<c:
      19             print("最小值为:",a)
      20         else:
      21             print("最小值为:",c)
      22     else:
      23         if b<c:
      24             print("最小值为:",b)
      25         else:
      26             print("最小值为:",c)
      27 
      28 name_1 = "某人飞"
      29 print("我是test1")
      test2模块
      1 # -*- coding:gbk -*-
      2 import test_1
      3 print("我是text2")
      4 '''
      5 运行效果:
      6 我是text2
      7 我是test1
      8 '''
      test2模块
    • 文件被导入时:
      • 提供的工具:全局变量、函数、类
      • 直接被执行的代码不是向外界提供的工具
    • 文件被导入时,能够直接执行的代码不需要被执行

    __name__属性:

    • __name__属性可以做到,测试模块的代码只在测试情况下被运行,而在被导入时不会被执行!
    • __name__是python的一个内置属性,记录着一个字符串
      • 如果被其他文件的导入,__name__就是模块名
      • 如果是当前执行程序,__name__就是__main__
    • #这个是模块test1
      # 如果直接执行模块test1,得到的结果永远是__main__
      print(__name__)
      #这个是模块test2
      import test_1
      '''
      运行结果:
      test_1
      '''
    • 在很对Python文件中都会看到以下格式的代码

      #如果是测试模块,那么就会执行测试语句块内容
      #如果是导入该模块,那么就不会执行测试语句块内容
      if __name__ == "__main__":
              测试语句块

  • 相关阅读:
    java面试常见的类
    Day6
    DAY5
    Day4
    Day3
    Day2
    Day1
    echarts3关系图:力引导布局, 固定某些节点
    Hbuilder中配置cmd
    webpack 学习
  • 原文地址:https://www.cnblogs.com/fjfsu/p/15526170.html
Copyright © 2020-2023  润新知