今日内容回顾
目录- 索引取值和迭代取值的差异
- 模块的简介
- 导入模块的两种句式
- 导入模块的补充
- 循环导入问题
- 判断文件类型
- 模块的查找顺序
- 模块的绝对导入与相对导入
索引取值和迭代取值的差异
1.索引取值
可以任意位置次数取值
不支持无序的数据类型
2.迭代取值
只能从前往后一次取值无法后退
支持所有的类型的数据取值(包括有序无序)
# 两者要的使用需要结合实际的应用的场景
模块简介
python语言:最早起源于linux运维、胶水语言、调包侠
1、什么是模块?
模块:一系列功能的结合体
2、为什要用模块?
为了提高开发效率
3、模块的四种表现形式
1.py文件(py文件也可以称之为模块文件)
2.含有py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
3.已被编译为共享或DLL的C或C++的扩展(了解)
4.使用编写并链接到python解释器的内置模块(了解)
4、模块的三种分类
1.内置的:python解释器自带能够直接导入使用的
2.第三方的:别人写好的发布在网上的 需要下载后使用
3.自定义的:自己写的
导入模块的两种句式
'''
1.一定要搞清楚谁是执行文件 谁是被导入文件
2.以后开发项目的时候py文件的名称一是纯英文
不会出现中文甚至空格
3.导入模块文件你不需要填写后缀名
'''
1.import句式
以import a 为例研究底层原理
'''
1.先产生执行文件的名称空间
2.执行被导入的文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生一个模块的名字
4.在执行文件中使用该模块名点的方式使用模块名称空间所有的名字 并且肯定不会产生冲突(指名道姓)
'''
2.from...import...句式
以from a import name, func1为例研究底层原理
'''
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件中的名称空间中产生对应的名字绑定模块名称空间中对应的名字
4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
ps:在使用的时候直接写名字即可 但是当当前名称空间有相同名字的时候 就会产生冲突 使用的就成了当前名称空间
'''
导入模块的补充
1.import与from...imppot...两者优缺点
import句式
由于使用模块名称空间中的名字都需要模块名点的方式才可以用
所以不会轻易的执行文件中的名字替换掉
但是每次使用模块名称空间中的名字都必须使用模块点才可以
from...import...句式
指名道姓的导入模块名称空间需要使用的名字 不需要模块名点
但是容易跟执行文件中名字冲突
2.重复导入模块
解释器只会导入一次 后续重复的导入语句并不会执行
3.起别名
既可以给模块起别名也可以给模块中某个名字起别名
import mddddd as m
from mddddd import name as n
from a import name as n, func1 as f1
4.涉及到多个模块导入
import 模块名1
import 模块名2
# 如果功能不同并不属于一个系列那么推荐分行导入 推荐第一种
相似度高可以使用第二种
import 模块名1, 模块名2 # 可以连续导入多个模块 但是只有当多个模块功能相似或者属于同一个系列
5.通用导入
from md import * # 将模块中所有的名字全部导入(*表示所有)
print(name)
print(age)
__all__ = ['money', 'age'] # 在被导入的模块文件中可以使用__all__定可以被导入使用的名字
循环导入问题
1.循环导入
两个文件之间彼此导入彼此并且相互使用各自名称空间中的名字 极容易包错
2.如何解决循环导入问题
1.确保名字在使用之前就已经准备完毕
2.我们以后在编写代码的过程中应该尽可能避免出现循环导入
判断文件类型
所有的py文件都可以直接打印__name__对应的值
当py文件是执行文件的时候__name__对应的值是__main__
当py文件是被导入文件的时候__name__对应的值是模块名
if __name__ == '__main__':
print('我是执行文件 我可以运行这里的子代码')
上述脚本可以用来区分所在py文件内python代码的执行
使用场景
1.模块开发
2.项目启动文件
'''
from a import * *默认是将模块名称空间中所有的名字导入
__all__ = ['名字1', '名字2'] 针对*可以限制拿的名字
'''
模块的查找顺序
"""
1.先从内存中查找
2.再去内置模块中查找
3.最后去sys.path系统路径查找(自定义模块)
如果都没有查找到则报错
"""
1.内存
import aaa
import time
time.sleep(15)
print(aaa.name)
aaa.func1()
2.内存
import time
print(time)
print(time.name)
'''
以后在自定义模块的时候尽量不要与内置模块名冲突
'''
3.执行文件所在的sys.path(系统环境)
# 一定要以执行文件为准
可以将模块所在的路径也添加到执行文件的sys.path中即可
import sys
print(sys.path) # 一个大列表 结果中第一个元素永远是当前执行文件所在的路径
当某个自定义模块查找不到的时候解决方案
1.自己手动将该模块所在的路径添加到sys.path中
import sys
sys.path.append(r'D:\pythonparctice\day17\aaa')
2.from...import...句式
from 文件夹名称.文件夹名称 import 模块名
from 文件夹名称.模块名称 import 名字
绝对导入与相对导入
'''
一定分清楚谁是执行文件!!!
模块的导入全是以执行文件为准
'''
绝对导入
from mymd.aaa.bbb.ccc.ddd import name # 可以精确到变量名
from mymd.aaa.bbb.ccc import ddd # 也可以精确到模块名
就是按照项目根目录一层层往下查找
相对导入
.在路径中表示当前目录
..在路径中表示上一层目录
..\..在路径中表示上上一层目录
不在依据执行文件所在的sys.path 而是以模块自身路径为准
from . import b
相对导入只能用于模块文件中 不能在执行文件中使用
'''
相对导入使用频率较低 一般绝对导入即可 结构更加清晰
'''
包package
大白话:多个py文件的集合>>>就是文件夹
专业:内部含有__init__.py文件的文件夹(python2必须要求 python3无所谓)
标签:__,文件,句式,名字,导入,模块,import
From: https://www.cnblogs.com/xiao-fu-zi/p/16803623.html