学习内容概要
-
迭代取值与索引取值的差异
-
模块简介
-
导入模块的两种语法句式
-
导入模块句式的其他用法
-
循环导入问题
-
模块查找顺序问题
内容详细
迭代取值与索引取值的差异
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 # 无效 -
-
2.导入模块的句式2
2.1 from…import…句式
# from mk import name # 指名道姓导入(目标明确)
过程:
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文件 循环相互导入
上述情况就是循环导入的结果
循环导入容易出现 报错现象 使用彼此的名字可能是在没有准备好的情况下就使用了
-
如何去解决循环报错现象
相互导入时 必须先有一方在被使用名字时 提前先准备好 上述所示
一般这种情况需要尽量避免 可以用另外的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/274166.html