python22迭代取值/索引取值/模块/导入模块/模块的查找顺序
今日学习
迭代取值和索引取值的差异
模块
导入模块的两种句式
两种模块导入的优缺点
补充知识
循环导入问题
判断文件类型
模块的查找顺序
切记!!
在项目中,所有的py文件都是英文,没有编号和中文!!
切记!!!
迭代取值与索引取值
l1 = [11, 22, 33, 44, 55]
# 索引取值
# print(l1[0])
# print(l1[1])
# print(l1[0])
--------------------------------------
# 迭代取值
res = l1.__iter__()
print(res.__next__())
print(res.__next__())
print(res.__next__())
优势 | 劣势 | |
---|---|---|
索引取值 | 可以随意反复的获取任意数据值 | 针对无序的容器类型无法取值 |
迭代取值 | 提供了一种通用的取值方式 | 取值一旦开始只能往前不能回退 |
具体取值使用,需要结合实际情况
模块
前言:
python刚开始出来的时候被其他编程程序员瞧不起
ps:太简单 写代码都是调用模块(调包侠 贬义词)
随着业务的扩展其他程序员也需要使用python写代码
写完之后发现python真香 贼好用(调包侠 褒义词)
----------------------------------------------------警戒线----------------------------------------------------------------------------------
为什么python很牛逼
python之所以牛逼就是因为**支持python的模块非常的多**非常的全 非常的猛
-
作为一名python程序员注意了
将来接收到某个业务需求的时候 不要上来就想着自己写 先看看有没有相应的模块已经实现
-
如何理解模块,模块是啥?
模块可以堪称一系列功能的结合体,使用模块相当于拥有这结合体的所有功能。
-
为什么要使用模块?模块自己不能写?
兄弟,问这么多为什么?
自己写,重复造轮子吗?他有当然用了。模块用来保证程序的功能,结构,还有重复利用,直接站在巨人肩膀指指点点。
-
模块分类
-
内置模块
解释器自带的,直接就可以使用的模块 -----------例子---------- eg: import time time.sleep(3)
-
自定义模块
自己写的模块 eg: 注册功能 登录功能
-
第三方模块
别人写的模块,存在网络上使用前需要提前下载 eg: 图形识别,图形可视化,语音识别
-
-
模块的表现形式/类型
1.py文件(py文件也可以称之为是模块文件) 2.含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储) 3.已被编译为共享库或DLL的c或C++扩展(了解) 4.使用C编写并链接到python解释器的内置模块(了解)
导入模块的句式
-
第一种:import 模块名
md.py文件理解为模块
print('我是模块文件md.py') money = 999 def read1(): print('from md.py read1 function') print(money) def read2(): print('from md.py read2 function') read1() def change(): global money money = 666 __all__ = ['money', 'read1']
---------------例子-------------- #md.py为模块 import md #有效 import md #无 效 import md #无 效 #.... #执行文件是当前文件名! #.... #被导入模块文件是md.py --------代码块1---------------------- money = 10 print(md.money) #999 print(money) #10 ----执行结果:------- 我是模块文件md.py 999 10 --------2.代码块2------------ def read1(): print('我是执行文件里面的read函数') md.read2() ------执行结果---------- 我是模块文件md.py from md.py read2 function from md.py read1 function 999 ---------代码块3----------------- # money = 1000 # md.change() # print(money) #调用当前 # print(md.money) -------执行结果-------------- 我是模块文件md.py 1000 666
-
import +模块名 导入过程!!!!重要理解
-
-----------过程-------------------------------------------
1.当前文件执行时,先产生一个名称空间,我称为当前文件名称空间
2.产生被导入模块文件md的名称空间并运行该文件内所有的代码,存储名字;我称为模块名称空间
3.在当前文件执行过程中,获取到一个模块的名字,例如md模块,通过该名字点的方式就
就可以使用模块名称空间。
4.注意的是,在当前文件执行中,重复调用相同的模块,导入语句只会执行一次
-
第二种:from ...import ....句式
-------------------------------------------- # from md import money # 指名道姓的导入 # print(money) # 999 # money = '嘿嘿嘿' # print(money) # 嘿嘿嘿 # print(read1) # print(md.read1()) ------------结果-------------------------- 我是模块文件md.py 999 嘿嘿嘿 ---------------------------------------------- from md import money, read1 read1()
-
from ... import ...句式 导入调用过程
-
1.当前文件执行时,产生一个名称空间,我称为当前文件名称空间
2.创建一个被导入模块文件的名称空间,我称为模块名称空间
3.执行模块文件代码,将产生的名字存储到模块名称空间中
在执行当前文件中,获取到指定的名字,指向模块名称空间。
-
两种导入式的优缺点
例子 | 优点 | 缺点 | |
---|---|---|---|
import 模块名 | import md | 通过md点的方式可以使用到模块内所有的名字 并且不会冲突 | md什么都可以点 有时候并不想让所有的名字都能被使用 |
from 模块名import 句式 | from md import money,read1 | 指名道姓的使用指定的名字 并且不需要加模块名前缀 | 名字及其容易产生冲突(绑定关系被修改) |
-
补充知识,其他导入方式
1.起别名 情况1:多个模块文件名相同(多个人写) from md import money as md_my from md1 import money as md1_my print(md_my) print(md1_my) 情况2:原有的模块文件名复杂 import mdddddddddd as md ------------------------------------------------------ 2.导入多个名字 import time, sys, os 上述导入方式建议多个模块功能相似才能适应 不相似尽量分开导入 import time import os import sys from md import money, read1, read2 上述导入方式是推荐使用的 因为多个名字出自于一个模块文件 ----------------------------------------------------------- 3.全导入 需求:需要使用模块名称空间中很多名字 并且只能使用from...import句式 from md import * # *表示所有 ps:针对*号的导入还可以控制名字的数量 在模块文件中可以使用__all__ = [字符串的名字]控制*能够获取的名字
循环导入问题
---------例子---------------
md1.py
print("正在调用md1")
from md2 import y
x = 'md1'
----------------------------
md2.py
print("正在调用md2")
from md1 import x
y = 'md2'
1.如何理解循环导入
循环导入就是两个文件彼此导彼此
2.循环导入容易出现报错现象
使用彼此的名字可能是在没有准备好的情况下就使用了
3.如何解决循环导入保存现象
彼此在使用彼此名字之前 先准备好
循环导入将来尽量避免出现!!! 如果真的避免不了 就想办法让所有的名字在使用之前提前准备好
判断文件类型
学习完模块之后 以后我们的程序运行起来可能涉及到的文件就不止一个
所有的py文件中都自带一个__name__内置名
当py文件是执行文件的时候 __name__的结果是__main__
当py文件是被导入文件的时候 __name__的结果是模块名(文件名)
__name__主要用于开发模块的作者测试自己的代码使用
if __name__ == '__main__':
当文件是执行文件的时候才会执行if的子代码
上述判断一般只出现整个程序的启动文件中
ps:在pycharm中可以直接编写main按tab键自动补全
模块的查找顺序
"""
1.先去内存中查找
2.再去内置中查找
3.再去sys.path中查找(程序系统环境变量) 下面详细的讲解
"""
-------------------------------------------------
1.导入一个文件 然后在导入过程中删除该文件 发现还可以使用
import md
import time
time.sleep(15)
print(md.money)
----------------------------------------------
2.创建一个跟内置模块名相同的文件名
# import time
# print(time.time())
from time import name
print(name)
ps:创建模块文件的时候尽量不要与内置模块名冲突
-------------------------------------------------
3.导入模块的时候一定要知道谁是执行文件
所有的路径都是参照执行文件来的
import sys
sys.path.append(r'D:\pythonProject\day22\xxx')
import mdd
print(mdd.name)
"""
1.通用的方式
sys.path.append(目标文件所在的路径)
2.利用from...import句式
起始位置一定是执行文件所在的路径
from xxx import mdd
"""