python学习Day22
Day 22
今日内容概要
- 迭代取值与索引取值的差异
- 模块简介
- 导入模块的两种语法句式及优缺点
- 模块的重要补充知识
- 循环导入问题
- 判断文件类型
- 模块的查找顺序
今日内容详细
1.迭代取值与索引取值的差异
索引取值 | 迭代取值 | |
---|---|---|
优点 | 可以反复获取任意数据值 | 提供了通用的取值方式 |
缺点 | 针对无序容器类型(字典、集合)无法取值 | 取值一但开始,只能往前不能回退 |
具体使用哪个需要结合实际情况
2.模块的简介
'''
python屈辱史:
python刚出来时被瞧不起因为太简单,写代码都是调用模块(调包侠 贬义)
后来业务扩展很多程序员也需要使用python写代码,发现好用(调包侠 褒义)
python为什么好用?
因为支持python的模块非常多还很全面
作为python程序员将来接收到业务需求时不要一上来就想自己写,先看看有没有相应的模块已经实现可以调用
'''
1.什么是模块
模块可以看成是很多功能的结合体,使用模块就相当于拥有了结合体内所有的功能
ps:使用模块编程就相当于站在巨人的肩膀上,基于别人的成就去完成自己的成就
2.模块的分类
1)内置模块#解释器自带可以直接使用的模块
eg:
import time
time.sleep(3)
2)自定义模块#自己写的模块
eg:
注册、登录功能
3)第三方模块#别人写的模块 在网上下载的
eg:
图形识别、图像可视化
3.模块的表现形式
1)py文件(也称之为模块文件)
2)含有多个py文件的文件夹
3)(了解)已被编译为共享库或DLL的c或c++扩展
4)(了解)使用c编写并链接到python解释器的内置模块
3.导入模块的两种句式及优缺点
补充说明:
1)以后真正的项目中所有py文件名称都是英文,没有中文和序号。
2)py文件被当作模块导入的时候不需要考虑后缀
1)导入模块的句式1:import句式
'''
import md
1.会产生执行文件的名称空间
2.执行被导入文件(模块文件)的名称空间并运行该文件内的所有代码 存储名字
3.在执行文件中会获取一个模块的名字 通过该名字点的方式就可以使用被导入文件名称空间中的名字
补充说明:同一个程序反复导入相同的模块 导入语句只会执行一次
eg:
import md 有效
import md 无效
import md 无效
'''
eg:
import md #我是模块文件md.py 导入执行md.py文件中的代码(不包括函数)
print(md.money) #99 打印md模块中的money
print(md.read1) #<function read1 at 0x000002CF8523A4C0> 打印函数名不执行(加括号才会执行,且会有返回值)
md.read1() #执行md模块中的read1()函数体代码(没返回值)
2)导入模块的句式2:from 模块文件 import 名字 #执行该模块中的代码(不包括函数)在该模块中单独拿一个名字出来(指名道姓的导入)。如需多个名字则逗号隔开
'''
from md import money
1.创建执行文件的名称空间
2.创建被导入文件的名称空间
3.执行被导入文件中的代码,将产生的名字存储到被导入文件的名称空间中
4.在执行文件中获取到指定的名字,该名字指向被导入文件的名称空间
'''
eg:
from md import money#我是模块文件 执行md模块中的代码(不包括函数),单独拿一个名字出来
print(money)#99 模块中money绑定的值
——————————————————————————————————————————————————————————————
from md import money,read1
read1()#可直接执行md模块文件中read1函数
import md | from md import money,read1 | |
---|---|---|
优点 | 通过md点的方式可以使用到模块内所有的名字,且不会冲突 | 指名道姓的使用指定名字,且不需要加模块前缀 |
缺点 | md什么都可以点,有时候不想让所有的名字都能被使用 | 名字很容易产生冲突(绑定关系被修改) |
5.模块的重要补充知识
1.起别名
1)情况1:多个人写的模块文件名相同
假如有两个模块文件中都有money,当我打印时只会打印离打印最近的模块中的数据,如果两个都要用则需要把其中一个改名字
from md import money as m#把第一个md模块名改为m
from md1 import money
print(m)#改名前模块m中money数据
print(money)#未改名的模块md1中money数据
2)情况2:原有的模块文件名复杂
import md as m#把md模块名改成m
print(m.money)#以后就用m点的方式使用
————————————————————————————————————
from md import money as m#把md模块名改成m
print(m)#以后打印m就可以使用
2.导入多个名字
import time, sys, os
上述导入方式建议多个模块功能相似才能使用 不相似尽量分开导入如下:
import time
import os
import sys
____________________________________________
from md import money,read1,read2
上述导入方式推荐使用,因为多个名字出自一个模块文件
3.全导入
需求:需要使用模块名称中多个名字且只能使用from..import句式
from md import * #*表示所有
仅针对*号的导入还可以控制名字数量
在模块文件中使用__all__=['字符串的名字'] 当调用该模块,用*获取的名字时仅允许使用[]中的名字
6.循环导入问题
1.什么是循环导入?
循环导入就是两个文件彼此导彼此
2.循环导入容易出现报错现象
使用彼此的名字可能是在没有准备好的情况下就使用了
3.如何解决循环导入报错现象
彼此在使用彼此名字前先准备好
'''
循环导入尽量避免出现,会循环打印多次结果,如果真的避免不了就让名字使用前提前准备好
'''
7.判断文件类型
学完模块后,以后程序运行起来涉及的文件就不止一个
所有的py文件中都自带一个__name__内置名
当py文件是执行文件时,打印__name__的结果就是__main__
当py文件是被导入文件时打印__name__,执行文件调用被导入文件的结果就是模块名(文件名)
__name__主要用于开发模块的作者测试自己的代码使用
if __name__ == '__main__'
当文件是执行文件时,才会执行if的子代码
上述判断一般只出现在整个程序的启动文件中
ps:在pycharm中可以直接编写main按tab键自动补全
8.模块的查找顺序
'''
1.先去内存中查找
2.再去内置中查找
3.再去sys.path中查找(程序系统环境变量)
'''
验证以上:
1.导入一个文件 然后再导入过程中删除该文件 发现还可以使用
import md #导入执行md模块
import time #导入执行time模块
time.sleep(15) #让程序暂停15s再执行 中途如果把md模块文件删掉 还会继续执行,因为删除的是硬盘中的,内存中的还在
print(md.money)#99
2.创建一个跟内置模块相同的模块文件名
import time
print(time.time())
#结果会报错
from time import name
print(name)
#结果会报错
ps:创建模块文件的时候尽量不要与内置模块名冲突
3.导入模块的时候一定要知道谁是执行文件
所有的路径都是参照执行文件所在的路径来查找的
import sys
print(sys.path)#会显示一堆文件路径,当内存、内置都找不到需要的文件时,会在该文件路径内查找
sys.path.append(r'D:\pythonProject\day22\xxx')#把找不到的那个文件路径用.append追加在后面就可以找到了
import mdd
print(mdd.name)#jason 找到了
'需注意pycharm会自动将项目根目录添加到sys.path中'
查找方式:
1.通用的方式:(尾部追加路径)
sys.path.append(目录文件所在的路径)
2.利用from..import句式
起始位置一定是执行文件所在的路径
from xxx import mdd #xxx为文件夹名字内导模块mdd名字
print(mdd.name)#可以找到
#xxx.内部文件夹名字.内内部文件夹名字(可以查看文件夹嵌套的文件夹)
作业:
1.整理今日内容及博客
将导入模块发送的事情用详细的文字和图片二次说明
2.尝试着将之前有多个功能函数的题目代码都拆分(一个函数一个文件)使用模块导入的形式调用执行
非常简单 体会一些导来导入的感觉
3.预习明日内容
常见内置模块