今日内容概要
- 索引取值与迭代取值的差异
- 模块简介
- 导入模块的两种句式
- 导入模块的句式补充
- 循环导入问题及解决策略
- 判断文件类型
- 模块的查找顺序
- 模块的绝对导入与相对导入
今日内容详细
索引取值与迭代取值的差异
l1 = [11,22,33,44,55]
1.索引取值
可以在任意的位置任意的次数取值
不支持无序类型的数据取值
2.迭代取值
只能从前往后依次取值,无法后退
支持所有类型的数据取值(有序,无序皆可)
PS:两者的使用都需要结合实际的应用场景
模块简介
1.模块的本质
内部具有一定的功能(代码)的py文件
2.python模块的历史
python刚开始的时候所有搞其他编程语言的程序员都看不起 甚至给python起了个外号>>>:调包侠(贬义词)
随着时间的发展项目的复杂度越来越高 上面那帮人也不得不用一下python 然后发现真香定律>>>:调包侠(褒义词)
3.python模块的表现形式
1.py文件(py文件也可以称之为是模块文件)
2.含有多个py文件的文件夹(按照模块功能的不同划分不同文件夹来进行储存)
3.已被编译为共享库或DLL的C或C++扩展(了解即可)
4.使用C编写并链接到python解释器的内置模块(了解)
注:
1 自定义模块的时候要注意命名的规范,使用小写,不要使用大写,不要使用中文,不要使用特殊字符等。
2 不要与内置模块冲突 sys 等。
模块的分类
1.自定义模块
就是自己写的模块文件
2.内置模块
python解释器提供的模块
Python提供了一个强大的标准库,内置了许多非常有用的模块,可以直接使用(标准库是随python一起安装的),不用单独安装。
3.第三方模块
别人写好的模块文件(python背后真正的大佬)
官网:https://docs.python.org/zh-cn/3/library/index.html
https://www.cnblogs.com/jiangchunsheng/p/9275881.html
一个模块无论导入多少次,这个模块在做整个解释器进程内有且有有一个实例对象。
导入模块的两种句式
1.import句式
以import a 为列研究底层原理
import 语句的基本语法格式如下:
import 模块名 # 导入一个模块
import 模块1,模块2. # 导入多个模块
import 模块名 as 模块别名 # 导入模块并使用新名字
1、先产生执行文件的名称空间
2、执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3、在执行文件的名称空间中产生一个模块名字
4、在执行文件中使用该模块名点的方式使用模块名称空间中所有的名字
2、from。。。import。。。句式
以from a import name,func1位列研究底层原理
如果进行类比的话,import导入的是“文件”,我们要使用该“文件”下的内容,必须前面加“文件名称”。from ..,import导入的是文件下的“内容”,直接使用这些“内容”即可
1、先产生执行文件的名称空间
2、执行被导入文件的代码将产生的名字放入被导入文件的名称空间
3、在执行文件的名称空间中产生的名字绑定模块名称空间中对应的名字
4、在执行文件中直接使用名字就可以访问名称空间中对应的名字
import导入的是模块。from...import导入的是模块中的一个函数/一个类。
导入模块补充说明
1.import 与 from。。。import。。。两者优缺点
import句式
由于使用模块名称空间中的名字都需要模块名点的方式才可以用
所以不会轻易的被执行文件中的名字替换掉
但是每次使用模块名称空间中的名字都必须使用模块名点才可以
form 。。。import。。。句式
指名道姓的导入模块名称空间中需要使用的名字,不需要模块名点
但是容易跟执行文件中名字冲突
2.重复导入模块
解释器只会倒入 一次,后续重复的导入语句并不会执行
3.起别名
import wuyongerciyuan as wy
from wuyongerciyuan import zhangzehonglovezhanghong as zz
from a import name as n,func1 as f1
4.涉及到多个模块导入
import a
import wwnuhnuuin
如果模块的功能相似度不高,就推荐第一种,相似度高就推荐第二种
import a , wwnuhnuuin
循环导入问题
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.内存
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) # 列表
sys.path.append(r'D:\pythonProject03\day17\mymd')
import ccc
print(ccc.name)
PS: 当导入某个模块文件时,Python解释器只有找到文件时,才能读取,装载运行该模块文件。它一般按照如下路径寻找模块文件(按顺序寻找,找到即停不继续往下寻找)
1.内置模块
2.当前目录
3.程序的主目录
4.pythonpath目录(如果已经设置好了)
5.标准链接库目录
6.第三方库目录(site-packages目录)
7.pth文件的内容(如果存在的话)
8.sys.path.append()临时添加的目录
当任何一个python程序启动时,就将上面这些搜索路径(除内置模
块以外的路径)进行收集,放在sys模块的path属性中(sys.path).
绝对导入与相对导入
再次强调:一定要分清楚谁是执行文件!!!
模块的导入全部以执行文件为准
绝对导入
from mymd.aaa.bbb.ccc.ddd import name # 可以精确到变量名
from mymd.aaa.bbb.ccc import ddd # 也可以精确到模块名
PS:反正套路就是按照项目的根目录一层层的往下查找
相对导入
.在路径中表示当前目录
..在路径中表示上层目录
..\..在路径中表示上上一层目录
不在依据执行文件所在的sys.path ,而是一模块自身路径为准
form . import b
相对导入只能用于模块文件中,不能在执行文件中使用
‘‘相对导入使用频率较低,一般用绝对导入即可,结构更加清晰’
包
通俗来讲就是多个py文件的集合>>>>:文件夹
专业的讲:内部含有__init__.py文件的文件夹(python2必须要求,python3无所谓)