迭代取值与索引取值的优缺点
1.索引取值
优点:可以随意反复的获取任意数据值
缺点:针对无序的容器类型无法取值
eg:
l1 = [1,2,3,4,5,6]
dict1 = {'name':'nana','age':18}
print(l1[3]) # 4
print(dict1[1]) # 报错 字典是无序的,不能索引取值
2.迭代取值
优点:提供了一种通用的取值方式
缺点:取值一旦开始只能从左往右依次取值
eg:
res1 = l1.__iter__()
print(res1.__next__()) # 1
print(res1.__next__()) # 2
res2 = dict1.__iter__()
print(res2.__next__()) # name
print(res2.__next__()) # age
模块
模块简介
1.模块:模块可以看成是一系列功能的结合体,使用模块就相当于拥有了这结合体的所有功能
2.模块的分类:
2.1 内置模块:是解释器自带的,直接导入即可 eg:import time
2.2 自定义模块:自己写的模块 eg:自己写的注册、登陆功能
2.3 第三方模块:别人写的模块,使用之前下载下来就可以 eg:图形识别
3.模块的表现形式
3.1 py文件(模块文件)
3.2 含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
3.3已被编译为共享库或DLL的c或C++扩展(了解)
3.4使用C编写并链接到python解释器的内置模块(了解)
导入模块的两种方式
前提简要:在真正编写项目的过程中,所有的py文件名都得是英文,并且py文件被当做模块导入的时候不需要考虑后缀;导入模块有两种方式:import句式、from …import…句式
import句式
1.语法格式: import 模块名(py文件名)
2.知识补充:
2.1 执行文件与被导入文件
执行文件:指的是点击鼠标右键运行的当前文件
被导入文件:是import后面的文件名就是被导入文件
2.2 同一个程序反复导入相同的模块,导入语句只会执行一次
3.运行步骤
3.1 创建执行文件的名称空间
3.2 创建被导入文件的名称空间
3.3 执行被导入文件中的代码,将产生的名字存储到被导入文件的名称空间
3.4 在执行文件中获取到一个模块的名字,通过该名字点的方式就可以使用到被导入文件名称空间中的名字
from…import…句式
1.语法格式: from 模块名(py文件名) import 被导入文件中具体的名字
2.运行步骤
2.1 创建执行文件的名称空间
2.2 创建被导入文件的名称空间
2.3 执行被导入文件中的代码,并将产生的名字存储到被导入的文件名称空间中
2.4 在执行文件中获取到指定的名字,指向被导入文件的名称空间
两种导入句式的优缺点
1.import句式
优点:通过点的方式可以使用到模块内所有的名字,并且不会冲突
缺点:在 import句式中,通过点的方式可以使用到模块内所有的名字,但有时候并不想所有的名字都能被使用
2.from...import...句式
优点:指名道姓的使用指定的名字,并且不需要家模块名的前缀
缺点:名字及其容易产生冲突,使绑定关系被修改
导入模块句式的补充
1.起别名: import 文件名 as 新的名字;from 文件名 import 被导入文件名称空间里的名字 as 新的名字
情况1:多个模块文件名相同(一个项目由多个人写)
情况2:原有的模块名文件复杂
2.导入多个名字
import time,sys,os >>>建议多个模块功能相似才一起导入,不相似尽量分开导入
推荐:
import time
import sys
import sys
from 被导入文件名 import 被导入文件名称空间里的名字1、名字2 、名字3 、名字4
上述导入方式是推荐使用的,因为多个名字出自于同一个模块文件中
循环导入
循环导入就是两个文件彼此导入彼此
1.循环导入容易出错的原因:使用彼此的名字可能是在没有准备好的情况下就使用了
2.解决循环导入的方法:彼此在使用彼此名字之前就先准备好
ps:尽可能的避免循环导入,如果真的避免不了,就想办法让所有的名字在使用之前提前准备好
判断文件类型
1.__name__内置名
所有的py文件都自带一个__name__内置名
当py文件是执行文件的时候,__name__的结果是__main__
当py文件是被导入文件的时候,__name__的结果是模块名(文件名)
2.应用:__name__主要用于开发模块的作者测试自己的代码使用
if __name__ == '__main__': >>>在pycharm中可以直接编写main+tab键自动补全
当文件执行是执行文件的时候才会执行if的子代码
ps:上述判断一般只出现在整个程序的启动文件中
模块 查找顺序
1.顺序
1.1 先去内存中查找 >>>代码运行后产生的内存空间
1.2 再去内置中查找 >>>解释器自带的模块
1.3 最后去sys.path中去查找(程序系统环境变量)
2.验证
2.1在内存中找:导入一个文件,然后再导入过程中删除文件,发现还可以使用
import bbb
import time
time.sleep(10)
print(bbb.money)
2.2内置中查找:创建一个跟内置模块名相同的文件名
import time
time.func1() # 报错 AttributeError: module 'time' has no attribute 'func1'
print(time.time()) # 1657707299.632187
from time import func1
func1() # ImportError: cannot import name 'func1'
2.3在sys.path中查找:执行文件默认只能在同级别中导入文件,如果想导入不同级别的文件,则需要手动在sys.path中用append()方法添加绝对路径
ps:导入模块的时候,一定要知道谁是执行文件,所有的路径都是参照执行文件来的
pycharm会自动将项目跟目录添加到sys.path中
import eee # ModuleNotFoundError: No module named 'eee'
import sys
print(sys.path) # ['D:\\2期学习\\pythonProject\\17', 'D:\\2期学习\\pythonProject\\17',........ ] 在执行文件的路径中没有eee的文件路径,所以导入不了
解决方式:
import sys
sys.path.append(r'D:\2期学习\pythonProject\17\ccc\ddd')
print(sys.path) # ['D:\\2期学习\\pythonProject\\17',......, 'D:\\2期学习\\pythonProject\\17\\ccc\\ddd']
import eee
eee.func2() # 可以执行
3.导入与执行文件不同层级的模块方法
3.1 通用方式:sys.path.append(目标文件所在的路径)
3.2 利用from...import句式
from aaa.bbb.ccc import 模块名
from aaa.bbb.ccc.模块名 import 模块名的名称空间的名字