学习python-Day20


今日学习内容

一、迭代取值与索引取值的差异

l1 = [11, 22, 33, 44, 55]

#索引取值
print(l1[0]) # 11
print(l1[1]) # 22
print(l1[0]) # 11

#迭代取值
res = l1.__iter__()
print(res.__next__())  # 11
print(res.__next__())  # 22
print(res.__next__())  # 33

索引取值 迭代取值
优势 可以随意反复的获取任意数据值 提供了一种通用的取值方式
劣势 针对无序容器类型无法取值 取值方向固定(从前往后),不能回退

二、模块

1. 简介

模块可以看成是一系列功能结合体

使用模块就相当于拥有了这结合体内的所有功能。

2. 模块的分类
内置模块 自定义模块 第三方模块
简介 解释器自带的,直接就可以使用的模块 自己写的模块 别人写的模块,存在于网络上,使用前需要提前下载。
举例 import time
time.sleep(3)
注册功能,登录功能,
可以随时导入不同文件拿来用。
图形识别,图形可视化,语音识别
3. 模块的表现形式
  1. py文件(py文件也可以称为之是模块文件)
  2. 含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
  3. 已被编译为共享库或DLL的c或C++扩展(了解)
  4. 使用C编写并链接到python解释器的内置模块(了解)

三、导入模块

补充说明:
	在真正项目中,所有文件的py文件名称都是英文,没有所谓的编号和中文。
	eg:
		错误的 01.变量的使用
		正确的 test01.py
	模块文件的名称要用英文。
	
1. 导入模块的句式1 import句式
import md
money = 10
print(md.money) #666
print(money)  #10


def read1():
    print('我是执行文件里面的read函数')
md.read2()  #我是被执行文件的read2函数

money = 1000
md.change()
print(money) #1000
print(md.money) # 6666

'''
注意:
1.md.(md.py文件里的名字) 就是用这个模块的名字。
2.import 必须要 md +.+名字 才行。
3.md.read2()就是在md.文件中调用read函数。与上面read1函数没有关系。
'''

导入模板句式1的步骤:

  1. 先执行文件one.py的代码。此文件创建的一个全局名称空间。

  2. import md 就是运行 md.py 文件并创建一个全局名称空间。来存储moneyread1read2change名字。

  3. 如果执行文件想获取模块文件里的名字,则需要通过 . (模块里的名字)的方式就可以使用到被导入文件名称空间里的名字。

2. 导入模块的句式2 from...import...句式
from md import money  # 指名道姓的导入  指定名字导入其中,未导入就不能使用。
def read1():
    print('我是执行文件里面的read函数')

print(money)  # 999 将md.py 文件中的change函数注销掉,出现是没被修改的money,此刻money绑定的是md.py 文件里的 999 数据值。
money = '嘿嘿嘿'  # 将money重新绑定数据值,与原来的数据值绑定断开。
print(money)  # 嘿嘿嘿  #打印出与新的数据值的效果。
print(read1()) # 我是执行文件里面的read函数
#print(md.read1()) #在这种句式中,read1 未导入其中,所以不能使用,会报错。


 from md import money, read1  #可导入多个在同一模块的名字
    read1()


导入模板句式2的步骤:

  1. 执行 one.py 文件 ,创建执行文件的名称空间

  2. from md import money 创建被导入文件的名称空间

  3. 执行被导入文件的代码,将产生的名字存储到被导入文件的名称空间中

  4. 在执行文件中获取指定的名字,指向被导入文件的名称空间。

3. 两种导入句式的优缺点
import md from md import read1...
优点 通过md.的方式可以使用到模块内所有的名字,并且不会冲突 指名道姓的使用指定的名字,并且不需要加模块名前缀
缺点 md什么都可以点,有时候并不想让所有名字都能使用 名字及其容易产生冲突(绑定关系被修改)
4. 补充知识
  1. 起别名

    情况一:多个模块文件名相同时,我们可以将文件名换个新名字。

    from md import money as md_my
    from md1 import money as md1_my
    print(md_my)
    print(md1_my)
    

    情况二:原有的模块文件名复杂。

    import mddddd as md
    
  2. 导入多个名字

    1.import 句式
    import time, sys, os
    '上述导入方式建议多个模块功能相似才能适应 不相似尽量分开导入'
    import time
    import os
    import sys
    
    2. from ...import...句式  
    from md import money, read1, read2	
    '上述导入方式是推荐使用的 因为多个名字出自于一个模块文件'
    
  3. 全导入

    需求:需要使用模块名称空间中很多名字,并且只能使用from...import句式

    from md import *  # *表示所有
    
    ps:针对*号的导入还可以控制名字的数量
    在模块文件中可以使用__all__ = [字符串的名字] 控制*能够获取的名字
    __all__ = ['money']  #执行文件中只能用模块文件中的 money名字
    
  4. 循环导入问题

    1. 循环导入简介:

      循环导入就是两个文件彼此导彼此。

    2. 循环导入容易出现报错现象

      使用彼此名字可能在没有准备好的情况下就使用了。

      如果先执行了a.py 创建了一个全局名称空间,导入模块b后执行了b.py文件也创建了一个名称空间,但是a.py中需要b.name 但是b.py还没准备好。

    3. 如何解决循环导入保存现象

      彼此在使用彼此名字之前,先准备好。所以需要先定义再导入。

四、判断文件类型

  1. 所有py文件中都自带一个__name__内置名

  2. py文件是被导入文件时,__name__的结果是__main__

  1. py文件是执行文件的时候 __name__的结果是模块名(文件名)

  1. __name__主要用于开发模块的作者测试自己的代码使用。

  2. if __name__== '__main__':

    当文件是执行文件的时候会执行if的子代码

    func1放进去,则在执行文件中不执行func1的函数

  1. 上述判断一般只出现整个程序的启动文件中。

    在pycharm中可以直接编写main按tab键自动补全

五、模块的查找顺序

  1. 先去内存中查找
  2. 再去内置中查找
  3. 再去sys.path中查找(程序系统环境变量)
1.导入一个文件,然后在导入过程中删除该文件,发现还能使用。
import md
import time

time.sleep(15)
print(md.money)

? 再次执行,会报错,此文件已经不存在。

'''
原因:
1.当执行文件test.py时,创建了一个全局名称空间。这些都保存到内存上。
2.导入md和time,分别用 md.py 自定义模块和内置模块里的名字。运行后就创建了各自名称空间。保存到内存上面。
3.在运行过程中即使删掉,但还是能够得到md里的money,原因md里的money还暂时保存在内存上,再次运行时,不在内存上面了,因为没有保存到硬盘上。
'''
2.创建一个跟内置模块名相同的文件名
import time
print(time.time())
from time import name
print(name)

'''
创建模块文件的时候尽量不要与内置模块名冲突
'''

3.导入模块的时候一定要知道谁是执行文件
	所有的路径都是参照执行文件来的
	import sys
	sys.path.append(r'D:\pythonProject\day22\xxx')
	import mdd
	print(mdd.name)
    
'''
注意:
1.导入模块时,要明白当前执行文件是否和被导入文件在同一层
2.如果不在同一层,我们要去找到被导入文件路径是否在系统环境变量中
3.如果不在就导入一个 sys.path 的模块,在执行文件中添加。
'''

1.通用的方式
	sys.path.append(目标文件所在的路径)
2.利用from...import句式
	起始位置一定是执行文件所在的路径
	from xxx import md
	from xxx.xx.x import md
	(文件一层层包含其中就用点的方法,一步步找到被导入文件。)
	from xxx.xx.x.md import name
	(也可以用点的方式导入文件具体的名字)