- 迭代取值与索引取值差异
- 模块简介
- 导入模块的两种语法
- 两种语法各个的优缺点
- 导入模块的过程
- 导入模块的补充知识
- 循环导入问题
- __name__内置名
- 模块的查找顺序
""" 1. 索引取值 索引取值可以根据索引随意取出任意数据值 """ l1 = [1, 2, 3, 4, 5] print(l1[0]) # 1 print(l1[1]) # 2 print(l1[0]) # 1 """ 缺点是对于没有索引的无序数据类型无法取数据值 """ """ 2. 迭代取值 迭代取值提供了一种通用的取值方式 """ res = l1.__iter__() print(res.__next__()) # 1 print(res.__next__()) # 2 print(res.__next__()) # 3 """ 缺点是无法控制取值方向,只能向下取值 """二、模块
- 模块简介
- 怎么理解模块
模块就相当于是将许多功能整合在一起的文件
调用模块就可以使用文件中的各种功能 - 模块的分类
1.内置模块
解释器内自带的模块,可以直接调用
2.自定义模块
自己写的模块
3.第三方模块
别人写的模块,使用前需要下载 - 模块的表现形式
1.py文件(py文件也可以被称为模块文件)
2.含有多个py文件的文件夹(按照功能的不同分为不同文件夹)
3.已被编译为共享库或DLL的c或C++扩展(了解)
4.使用C编写并链接到python解释器的内置模块(了解)
- 怎么理解模块
- 导入模块的两种语法
"""1. 使用import...""" import md md.fn() # 使用模块名.名字的方式使用 """2. 使用form...import...""" from md import fn fn() # 直接调用
- 两种语法各自的优缺点
import md """ 优点:通过模块名.名字的方式调用模块的中的名字,不会与执行文件的名字冲突 缺点:会导入模块中所有的名字 """ from md import fn """ 优点:只导入指定的名字,而且调用不用加上前缀 缺点:使用方式和执行文件的名字相同,可能会产生名字冲突 """
- 模块导入的过程
1.执行a.py文件,先创建a.py文件的名称空间
2.执行import导入b模块,会使b模块文件先执行一遍
3.执行b模块会创建b模块的名称空间
4.然后将b模块执行完毕后产生的名字放入b的名称空间
5.在a.py会产生一个b名字,绑定的就是b模块的名称空间,使用b.名字的方式调用b模块的名字
如果使用from b import fn1 ,会直接在a.py产生同名的变量绑向b.py中的fn1绑向的值 - 导入模块的补充知识
1. 起别名 当导入的多个模块文件有相同名字,或模块名字复杂时 在在import导入后使用as加变量名起别名 然后使用别名.名字 import unicodedata as ucd 2. 导入多个名字 import time, os, sys """上边的导入方式除非是功能相似,不然建议分开导入""" import time, datetime import os import sys 3. 全导入 如果模块中有很多名字,而又想直接使用调用名字的方式 可以使用*号 from dm import * *号表示导入所有名字 而在模块文件中也可以控制使用*号可以导入哪些名字 使用__all__ = [可以被导出的名字]来控制,列表中的名字是字符串格式
- 循环导入问题
循环导入就是两个文件相互导入
文件a:import b name = 'a' print(b.name)
文件b:
import a name = 'b' print(a.name)
- 运行a文件,先创建a的名称空间,然后执行代码
- 导入b模块,创建b的名称空间,然后执行代码
- 导入a模块,名称空间已经存在,直接执行代码
- 因为导入过b文件,不会在重复导入,所以继续往下执行
- 执行到打印b.name时,因为b还没有执行到赋值的代码所以名称空间没有名字,所以会直接报错
解决方案:
在赋值后再执行导入模块(循环导入要尽量避免出现) - __name__内置名
开始使用模块以后,之后的程序可能不止是运行一个py文件
如果有需要只在运行当前文件时才执行,而导入这个文件不执行的代码
就可以使用到__name__了
a.py:"""在当前运行当前文件时,打印__name__是__main__""" name = __name__ print(name) # __main__
b.py
import a # a 导入时会执行被导入文件代码 print(a.name) # a 返回的是被导入文件的文件名
if __name__ == '__main__': 一般在执行文件中使用上边的判断代码,在子代码中编写只有执行文件执行时才执行的代码
- 模块的查找顺序
- 先在内存中查找
- 再在内置模块中查找
- 最后在sys.path中查找(程序系统环境变量)
1.先导入一个模块,然后在执行文件过程中删除模块,发现还是能执行该模块中名字 import md import time time.sleep(10) md.fn() 2.先创建和内置模块同名的模块,发现调用的还是内置模块 import time print(time.time()) time.fn() 3.导入模块时一定要知道谁是执行文件,所有的路径都是参照当前执行文件的路径的 import sys print(sys.path) """ [ 'F:\pythonProject\day20', 'F:\pythonProject\day20', 'F:\PyCharm 2021.3.3\plugins\python\helpers\pycharm_display', 'F:\python\python39.zip', 'F:\python\DLLs', 'F:\python\lib', 'F:\python', 'F:\python\lib\site-packages', 'F:\PyCharm 2021.3.3\plugins\python\helpers\pycharm_matplotlib_backend' ] """ 当在内存和内置中找不到对应的模块时,就会依次在上边的路径中查找 如果上边的路径还是没有,而sys.path的返回值是一个列表,所以可以使用列表的内置方法追加一个需要导入模块的绝对路径,就可以导入指定模块了



