模块

模块是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__":
            测试语句块

     

 

posted on 2021-11-09 15:10  J.FengS  阅读(55)  评论(0编辑  收藏  举报