[2022.7.13] python模块基础知识


学习内容概要

  • 迭代取值与索引取值的差异

  • 模块简介

  • 导入模块的两种语法句式

  • 导入模块句式的其他用法

  • 循环导入问题

  • 模块查找顺序问题

内容详细

迭代取值与索引取值的差异

l1 = [1,2,3,4,5,6,7,8,9]
# print(l1[0]) # 1
# print(l1[2]) # 2
# print(l1[0]) # 1
# 迭代取值
# res = l1.__iter__()
# print(res.__next__()) # 1
# print(res.__next__()) # 2
# print(res.__next__()) # 3
"""
# 索引取值:
优点:可以根据自己的需求 精确的索引到想要的值 支持反复取值
缺点:针对无序的容器类型 比如 字典 集合 就无法用索引来取值

# 迭代取值:
优点:不区分容器类型 只要容器内有值 都可以取到 最基础通用的一种取值方式
缺点:无法反复的取值 不能回退取值 循环取值直到把最后一个值取出来后报错结束
"""

模块简介

  • 简介:

    模块化是将程序分解为一个个的模块module,通过组合模块来搭建出一个完整的程序。

    优点:

    便于团队开发,方便维护,代码复用。

  • 1.如何理解模块:

    在python中一个脚本(.py)文件就是一个模块,创建模块实际上就是创建一个.py文件

    相当于一系列功能的结合体集成了在一个模块内(.py文件内) 使用模块就相当于拥有使用了这个集合体所有的功能 非常的便捷

  • 2.模块的分类

    2.1.内置模块

    和内置空间一样 都是有解释器提供自带的 直接就可以使用的模块

    import time

    time.sleep()

    首先使用import导入time包,这样意味着我们能够使用time包里的所有公共内容。最后利用time包的相关计时功能计算出该程序执行时长。调用模块可以减少函数的重复使用,精简代码。

     

    2.2.自定义模块

    包含所有你自己定义的函数和变量的文件,其后缀名是.py 例:注册功能 登录功能 …

    自定义模块的时候要注意命名的规范,使用小写,不要使用大写,不要使用中文,不要使用特殊字符等

     

    2.3.第三方模块

    别人写好的模块 发布于网路上 使用前直接下载导用就可

    例如:

    图片识别 图形可视化 人脸识别 语音识别

  • 模块的表现形式

    1.py文件(py文件也可以称之为是模块文件) 2.含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储) 3.已被编译为共享库或DLL的c或C++扩展(了解) 4.使用C编写并链接到python解释器的内置模块(了解)

    导入模块的两种句式

    • 1.导入模块句式1

    1.1.import句式
    先创建一个模块(.py文件)
    例如:
    mk.py 里面写入内容

    在创建一个执行文件(zx.py)
    用import mk 调用(不用去写入.py文件名的类型)
       然后就可以去随意调用模块里的功能
    过程:
    ①.创建执行文件时会产生一个执行的名称空间
    ②.创建模块文件时会产生一个导入文件的名称空间
    ③.模块名称空间内写入的代码功能 储存赋值的变量名 在被执行文件名称空间调用获取时指向被导入文件名称空间
       ④.在执行文件中可以用import然后加上导入文件的名字 再用点的方式 点上被导入文件的名字 就可以随意获取模块里的功能信息了
    注意:
    在同一个执行文件内 反复去导入同一个模块 导入语只会执行一次
    import mk  # 有效
    import mk  # 无效
    import mk  # 无效

    image-20220713185448582

image-20220713185229156

  • 2.导入模块的句式2

    2.1 from…import…句式

    # from mk import name # 指名道姓导入(目标明确)

    image-20220713193548602

image-20220713193608467

过程:

1.创建执行文件的名称空间 2.创建被导入文件的名称空间 3.执行被导入文件中的代码 将产生的名字存储到被导入文件的名称空间中 4.在执行文件中获取到指定的名字 指向被导入文件的名称空间

两种导入句式的优缺点

句式类型 优点 缺点
import mk 导入语后 模块内的所有功能 都可以随意的去调用 模块里的内容暴露无遗 有时候并不想让他人所有的内容都被获取
from mk import name,index 可以明确的去获取想要的名字 不需要加模块名 名字很容易冲突 如果把绑定的关系修改

补充知识

1.重命名
情况1:多个模块一起调用写入时 有些模块名相同 可以改名调用
for mk import name as mk_a
for mk1 import name as mk1_a
   print(mk_a)
   print(mk1_a)
   情况2:模块名复杂时 也可以从新命名
   import mkkkkkkkk as mk
2.导入多个模块内的多个名字
import mk1 mk2 mk3
   # 如果多个模块内的功能相似 可以一起导入
   如果类型不一建议分开
   
   for mk import name1 index func
  # 上述导入方式是想一次性导入同一个模块里的多个名字

3.全导入
from md import *  # *表示所有
   只有在固定只能使用 from ... import 方式的导入情况下 用加 * 的方式可以一次性全导入所有的名字
   默认情况下 正常全部导入使用
   但是如果在模块文件中使用__all__ = [字符串的名字]控制*能够获取的名字 那执行文件中的 * 就被限制使用的功能了

循环导入问题

  • 本质就是两个py文件 循环相互导入

image-20220713204909263

image-20220713204927233

上述情况就是循环导入的结果

循环导入容易出现 报错现象 使用彼此的名字可能是在没有准备好的情况下就使用了

  • 如何去解决循环报错现象

image-20220713205418403

image-20220713205429904

相互导入时 必须先有一方在被使用名字时 提前先准备好 上述所示

一般这种情况需要尽量避免 可以用另外的py文件去存储 如果真的避免不了 就想办法让所有的名字在使用之前提前准备好

判断文件类型

所有的创建的py文件中都自带一个__name__内置名

情况一:
   当py文件是执行文件的时候
   运行__name__ 结果是__main__
情况二:
当py文件是被导入文件的时候
   运行 __name__ 结果是模块名(文件名)
   
__name__主要用于开发模块的作者测试自己的代码使用

模块的查找顺序

先去内存中查找 > 内置空间找 > sys.path中找
1.导入一个模块 然后在导入过程中删除该模块发现还可以使用
       import mk
       import time
       time.sleep(10)
       print(mk.age)  # 24
"""
即使运行时已删除了 但是名字已经存入到内存中了   执行文件找的时候 会先从内存中去找
"""
2.创建一个跟内置模块名相同的文件名
       for time import name
       # print(name)
       #
       # import time
       # print(time.name)
""" 及时格式导入正确 但是还是会报错
  创建模块时文件名尽量不要和内置模块名冲突
"""
3.导入模块的时候一定要知道谁是执行文件
所有的路径都是参照执行文件来的
  import sys
  sys.path.append(r'C:/pythonProject/7.13/mm')
   import mkk
   print(mkk.name)
   """
1.通用的方式
sys.path.append(目标文件所在的路径)
2.利用from...import句式
起始位置一定是执行文件所在的路径
from mm import mdd
"""

 

 

原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/tech/python/274166.html

(0)
上一篇 2022年7月13日 22:31
下一篇 2022年7月13日 22:41

相关推荐

发表回复

登录后才能评论