模块的导入
迭代取值与索引取值的差异
索引取值
l1 = [11,22,33,44,55]
# 索引取值
print(l1[0])
print(l1[1])
print(l1[2])
"""
优势:可以随意反复的获取任意数据值
劣势:针对无序的容易类型无法取值
"""
迭代取值
l1 = [11,22,33,44,55]
res = l1.__iter__() # 创建可迭代对象
print(res.__next__())
print(res.__next__())
print(res.__next__())
"""
优势:提供了一种通用的取值方式,需要使用的时候,就创建可迭代对象,性能较好
劣势:取值没有索引取值方便,只能一个按顺序取值,不能回退取值
"""
模块简介
模块前言
'python发展史'
python刚开始出来的时候被其他编程语言瞧不起:太简单,写代码都是调用模块(调包侠 贬义词)
随着业务的扩展其他程序员也需要使用python写代码,写完之后发现python真香,贼好用(调包侠 调参大师 褒义词)
'python的特点'
python所支持的模块非常的多,非常的全,非常的猛
将来我们接到某个业务需求的时候,不要上来就想着自己写,先看看有没有相应的模块便于我们开发
如何理解模块
1.模块可以看成是一系列功能的结合体,使用模块就相当于拥有了这结合体的所有功能
2.在实际开发中将各自的功能都以模块的形式分开,需要用到功能就导入模块,可以让项目的独立性更好,避免不必要的冲突
ps:使用模块编程就相当于站在巨人的肩膀上
模块分类
# 1.内置模块:解释器自带的,直接可以使用的模块
eg: import time
time.sleep(5)
# 2.自定义模块:自己写的模块
eg: 注册登录功能等
# 3.第三方模块:别人写的,存在于网络,使用前需要下载
eg: 图形识别 图形可视化 语言识别等
模块的表现形式
1.python文件(py文件也可以称之为是模块文件)
2.含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
3.已被编译为共享库或DDL的C或C++扩展(了解)
4.使C编写并链接到python解释器的内置模块(了解)
导入模块的两种句式
补充说明
# 以后真正的项目中,所有的py文件名称都是英文
没有所谓的编号和中文
eg:
01.变量的使用.py # 错误的
test01.py # 正确的
导入模块的句式1(import)
"""当在py文件名为03 模块的导入句式导入如下模块"""
import md
"""整个代码的执行流程为如下"""
1.会产生执行文件的名称空间
2.会产生被导入的文件的名称空间并运行该文件内所有的代码
3.在执行文件中通过导入模块的名字就可以点出该模块名称空间的名字、函数等
"""补充说明"""
同一个py文件内反复导入相同的模块,导入的语句只会执行一次
import md 有效
import md 无效
import md 无效
导入模块的句式2(from ... import ...)
from 被导入的py文件 import py文件内的变量1 [,py文件内的变量2...]
# 通过此方式导包,就不需要通过点的方式使用函数或变量,直接使用即可
"""执行流程"""
1.创建执行文件的名称空间
2.创建被导入文件的名称空间
3.执行被导入文件中的代码,将产生的变量名存储到被导入文件的名称空间
4.在执行文件中获取到执行的名字,指向被导入文件的名称空间
两种导入句式的优缺点
'import md'
优点:通过md点的方式可以使用到模块所有的名字,并且不会冲突
缺点:md什么都可以点,有时候并不想让所有的名字都能被使用
'from md import name, index'
优点:指明道姓的使用指定的名字,并且不需要加模块名前缀
缺点:因为不需要通过'模块名点的形式',名字及其容易与'执行文件内'的变量名产生冲突(绑定关系被修改)
补充知识
起别名
# 情况1:多个模块文件名相同
from md import money as my_md1
from md import money as my_md2
# 情况2:原有的模块文件名复杂
import mddddddddd as md
导入多个名字
# import time,sys,os
'上述导入方式建议多个模块功能相似才能适应,不相识尽量分开导入'
import time
import os
import sys
from md import name,index
'上述导入方式是推荐的使用的,因为多个名字出自于一个模块文件'
全导入
'需求:需要使用模块名称空间中很多名字,并且只能使用from...import ...'
from md import * # *表示所有
# 针对*号的导入可以通过控制名字的数量
在模块文件中使用__all__=['定义的变量名或函数名']控制*能够获取的名字,如果没有添加进去的名字则无法通过'from ...import ...'获取。
循环导入问题(类似于循环引用)
# 如何理解循环导入:
两个文件彼此导入彼此
# 循环导入容易出现报错现象:
使用彼此的名字可能是在没有准备好的情况下就使用了
# 如何解决循环导入保存现象
在'import [模块]'前面就定义好变量名
判断文件类型
# 学习完模块之后,以后我们的程序运行起来可能涉及到的文件就不只一个
"""
所有的py文件中都自带一个__name__内置名
当py文件是执行文件的时候:__name__的结果是__main__
当py文件是被导入文件的时候:__ name__的结果是模块名(文件名)
"""
age = 18
name ='tom'
import md1
print(name)
print(__name__) # __main__
print(md1.__name__) # md1
"""
__name__主要用于开发模块的作者测试自己的代码使用
if __name__=='__main__':
当文件是执行文件的时候才会执行if的子代码
"""
模块的查找顺序
# 1.导入一个文件,然后在过程中删除该文件,发现还可以使用
import md
import time
time.sleep(10)
print(md.name) # jason
"""
原因:pycharm的优化,执行的时候,pycharm就将md的文件读取到内存中。
如果在python解释器中就会报错。
"""
# 2.创建一个跟内置模块名相同的文件名
# import time
# print(time.time())
from time import name
print(name)
"""
创建模块文件的时候不能与内置模块名冲突,可以用下划线加以区分
"""
# 3.导入模块的时候一定要知道谁是执行文件
import sys
sys.path.append('/Users/xunfei/PycharmProjects/day22/aaa/bbb/ccc') # py文件不能添加到环境变量,只需要添加文件目录
print(sys.path)
import md1
print(md1.name)
# 4.查找顺序
1.先去内存中找
2.再去内置中找
3.再去sys.path中查找(程序系统环境变量)
# 5.补充(导包/模块的路径复杂时的方法)
# py文件内添加环境变量
sys.path.append('目标文件所在的路径目录')
# 利用from ... import ...句式
from xxx.[...] improt mdd