学习python-Day20
今日学习内容
一、迭代取值与索引取值的差异
l1 = [11, 22, 33, 44, 55]
#索引取值
print(l1[0]) # 11
print(l1[1]) # 22
print(l1[0]) # 11
#迭代取值
res = l1.__iter__()
print(res.__next__()) # 11
print(res.__next__()) # 22
print(res.__next__()) # 33
| 索引取值 | 迭代取值 | |
|---|---|---|
| 优势 | 可以随意反复的获取任意数据值 | 提供了一种通用的取值方式 |
| 劣势 | 针对无序容器类型无法取值 | 取值方向固定(从前往后),不能回退 |
二、模块
1. 简介
模块可以看成是一系列功能的结合体。
使用模块就相当于拥有了这结合体内的所有功能。
2. 模块的分类
| 内置模块 | 自定义模块 | 第三方模块 | |
|---|---|---|---|
| 简介 | 解释器自带的,直接就可以使用的模块 | 自己写的模块 | 别人写的模块,存在于网络上,使用前需要提前下载。 |
| 举例 | import time time.sleep(3) |
注册功能,登录功能, 可以随时导入不同文件拿来用。 |
图形识别,图形可视化,语音识别 |
3. 模块的表现形式
- py文件(py文件也可以称为之是模块文件)
- 含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
- 已被编译为共享库或DLL的c或C++扩展(了解)
- 使用C编写并链接到python解释器的内置模块(了解)
三、导入模块
补充说明:
在真正项目中,所有文件的py文件名称都是英文,没有所谓的编号和中文。
eg:
错误的 01.变量的使用
正确的 test01.py
模块文件的名称要用英文。
1. 导入模块的句式1 import句式
import md
money = 10
print(md.money) #666
print(money) #10
def read1():
print('我是执行文件里面的read函数')
md.read2() #我是被执行文件的read2函数
money = 1000
md.change()
print(money) #1000
print(md.money) # 6666
'''
注意:
1.md.(md.py文件里的名字) 就是用这个模块的名字。
2.import 必须要 md +.+名字 才行。
3.md.read2()就是在md.文件中调用read函数。与上面read1函数没有关系。
'''
导入模板句式1的步骤:
-
先执行文件
one.py的代码。此文件创建的一个全局名称空间。 -
import md就是运行md.py文件并创建一个全局名称空间。来存储money,read1,read2,change名字。 -
如果执行文件想获取模块文件里的名字,则需要通过
. (模块里的名字)的方式就可以使用到被导入文件名称空间里的名字。
2. 导入模块的句式2 from...import...句式
from md import money # 指名道姓的导入 指定名字导入其中,未导入就不能使用。
def read1():
print('我是执行文件里面的read函数')
print(money) # 999 将md.py 文件中的change函数注销掉,出现是没被修改的money,此刻money绑定的是md.py 文件里的 999 数据值。
money = '嘿嘿嘿' # 将money重新绑定数据值,与原来的数据值绑定断开。
print(money) # 嘿嘿嘿 #打印出与新的数据值的效果。
print(read1()) # 我是执行文件里面的read函数
#print(md.read1()) #在这种句式中,read1 未导入其中,所以不能使用,会报错。
from md import money, read1 #可导入多个在同一模块的名字
read1()
导入模板句式2的步骤:
-
执行
one.py文件 ,创建执行文件的名称空间 -
from md import money创建被导入文件的名称空间 -
执行被导入文件的代码,将产生的名字存储到被导入文件的名称空间中
-
在执行文件中获取指定的名字,指向被导入文件的名称空间。
3. 两种导入句式的优缺点
import md |
from md import read1... |
|
|---|---|---|
| 优点 | 通过md.的方式可以使用到模块内所有的名字,并且不会冲突 |
指名道姓的使用指定的名字,并且不需要加模块名前缀 |
| 缺点 | md什么都可以点,有时候并不想让所有名字都能使用 |
名字及其容易产生冲突(绑定关系被修改) |
4. 补充知识
-
起别名
情况一:多个模块文件名相同时,我们可以将文件名换个新名字。
from md import money as md_my from md1 import money as md1_my print(md_my) print(md1_my)情况二:原有的模块文件名复杂。
import mddddd as md -
导入多个名字
1.import 句式 import time, sys, os '上述导入方式建议多个模块功能相似才能适应 不相似尽量分开导入' import time import os import sys 2. from ...import...句式 from md import money, read1, read2 '上述导入方式是推荐使用的 因为多个名字出自于一个模块文件' -
全导入
需求:需要使用模块名称空间中很多名字,并且只能使用
from...import句式from md import * # *表示所有 ps:针对*号的导入还可以控制名字的数量 在模块文件中可以使用__all__ = [字符串的名字] 控制*能够获取的名字 __all__ = ['money'] #执行文件中只能用模块文件中的 money名字 -
循环导入问题
-
循环导入简介:
循环导入就是两个文件彼此导彼此。
-
循环导入容易出现报错现象
使用彼此名字可能在没有准备好的情况下就使用了。
如果先执行了a.py 创建了一个全局名称空间,导入模块b后执行了b.py文件也创建了一个名称空间,但是a.py中需要b.name 但是b.py还没准备好。
-
如何解决循环导入保存现象
彼此在使用彼此名字之前,先准备好。所以需要先定义再导入。
-
四、判断文件类型
-
所有
py文件中都自带一个__name__内置名 -
当
py文件是被导入文件时,__name__的结果是__main__
- 当
py文件是执行文件的时候__name__的结果是模块名(文件名)
-
__name__主要用于开发模块的作者测试自己的代码使用。 -
if __name__== '__main__':当文件是
执行文件的时候会执行if的子代码将
func1放进去,则在执行文件中不执行func1的函数
-
上述判断一般只出现整个程序的启动文件中。
在pycharm中可以直接编写main按tab键自动补全
五、模块的查找顺序
- 先去内存中查找
- 再去内置中查找
- 再去
sys.path中查找(程序系统环境变量)
1.导入一个文件,然后在导入过程中删除该文件,发现还能使用。
import md
import time
time.sleep(15)
print(md.money)
? 再次执行,会报错,此文件已经不存在。
'''
原因:
1.当执行文件test.py时,创建了一个全局名称空间。这些都保存到内存上。
2.导入md和time,分别用 md.py 自定义模块和内置模块里的名字。运行后就创建了各自名称空间。保存到内存上面。
3.在运行过程中即使删掉,但还是能够得到md里的money,原因md里的money还暂时保存在内存上,再次运行时,不在内存上面了,因为没有保存到硬盘上。
'''
2.创建一个跟内置模块名相同的文件名
import time
print(time.time())
from time import name
print(name)
'''
创建模块文件的时候尽量不要与内置模块名冲突
'''
3.导入模块的时候一定要知道谁是执行文件
所有的路径都是参照执行文件来的
import sys
sys.path.append(r'D:\pythonProject\day22\xxx')
import mdd
print(mdd.name)
'''
注意:
1.导入模块时,要明白当前执行文件是否和被导入文件在同一层
2.如果不在同一层,我们要去找到被导入文件路径是否在系统环境变量中
3.如果不在就导入一个 sys.path 的模块,在执行文件中添加。
'''
1.通用的方式
sys.path.append(目标文件所在的路径)
2.利用from...import句式
起始位置一定是执行文件所在的路径
from xxx import md
from xxx.xx.x import md
(文件一层层包含其中就用点的方法,一步步找到被导入文件。)
from xxx.xx.x.md import name
(也可以用点的方式导入文件具体的名字)