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

l1 = [11, 22, 33, 44, 55]
# 索引取值
print(l1[0]) # 11
print(l1[1]) # 22
print(l1[0]) # 11
# 迭代取值
res = l1.__iter__()
print(res.__next__())
print(res.__next__())
print(res.__next__())

索引取值

  • 优势:可以随意反复的获取任意数据

  • 劣势:针对无序的容器类型无法取值

迭代取值

  • 优势:提供了一种通用的取值方式

  • 劣势:取值 一旦开始只能往前不能后退

模块

简介

  • python屈辱史

    • python刚开始出来的时候,被其他的编程程序员瞧不起(因为太简单)
      • 外号:调包侠(贬义词)
    • 随着业务的扩展,其他程序员也需要使用python写代码(真香警告)
      • 外号:调包侠(褒义词)
  • 模块:一系列功能的结合体,使用模块就相当于拥有了这结合体内的所有功能(是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句)

  • 模块分类:

    1. 内置模块:python解释器自带的,可以直接使用(import time)

    2. 自定义模块:我们自己写的模块

    3. 第三方模块:在网络上别人写的模块,使用时需要提前下载(图形识别、图形可视化、语音识别)

  • 模块表现形式:

    1. py文件(py文件也可以叫做模块文件)
    2. 含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
    3. 已被编译为共享库或DLL的c或c++扩展(了解)
    4. 使用c编写并链接到python解释器的内置模块(了解)

导入模块的两种语法句式

模块文件注意事项

  • 在以后真正的项目中,py文件命名必须是英文
  • 学习模块的时候,模块文件名称得用英文
  • py文件被当做模块导入的时候不需要考虑后缀

导入模块句式一:import句式

import md
'''
执行文件:run.py
被导入的文件:import 后面的文件名 eg:md.py
'''

image

  • 过程:
    1. 会产生执行文件的名称空间
    2. 产生被导入文件的名称空间并运行该文件内所有的代码,导入存储的名字
    3. 在执行文件会获取一个模块的名字,通过该名字点的方式就可以使用到被导入的文件名称空间中的名字

image

  • 注意:同一个程序反复导入相同的模块,导入的语句只会执行一次
import md	# 有效
import md	# 无效
import md	# 无效

导入模块句式二:from-import句式(指名道姓的导入)

from md import money, read1
print(money)
read1()

image

  • 过程:
    1. 创建执行文件的名称空间
    2. 创建被导入文件的名称空间
    3. 执行被导入文件中的代码,将产生的名字存储到被导入文件的名称空间中
    4. 在执行文件中获取到指定的名字,指向被导入文件的名称空间

image

两种导入句式的优缺点

  • import …
    • 优点:通过点的方式可以使用到模块内所有的名字,并且不会冲突
    • 缺点:什么都可以点,有时候并不想让所有的名字都能被使用
  • from … import …
    • 优点:指名道姓的使用指定名字,还不需要加模块名前缀
    • 缺点:名字容易产生冲突(冲突:绑定关系被修改)

导入模块句式的其他用法

起别名

  • 情况一:多个模块文件名相同(多个人写)
from md import money as md_my
from md import money as md1_my
print(md_my)
print(md1_my)
  • 情况二:原有的模块文件名复杂
import mdddddddddd as md

导入多个名字

import time,sys,os
# 上述导入方式建议多个模块功能相似才能适应,不相似尽量分开
import time
import os
import sys

from md import money,read1,read2
# 这个导入方式是推荐使用的,因为多个名字出自于同一个模块文件

全导入

# 需求:需要使用模块名称空间中的很多名字,并且只能使用from...import句式
from md import * # *表示所有
'''针对 * 的导入还可以控制名字的数量'''
__all__ = [字符串名字]
# 可以用来在模块文件中控制*能够获取的名字

循环导入问题

  • 循环导入:循环导入就是两个文件互相导入

  • 循环导入出现报错现象原因:使用彼此的名字可能是在没有准备好的情况下就使用了

image

  • 解决循环导入保存现象:在彼此使用彼此名字之前先准备好

image

  • 注意:循环导入将来要尽量避免出现,如果真的避免不了就想办法让所有的名字在使用之前提前准备好

判断文件类型

  • __ name__内置名

    • 所有py文件都自带__ name__内置名
    • 当py文件是执行文件的时候__ name__ 的结果是__ main__
    • 当py文件是被导入文件的时候__ name__的结果是模块名(文件名)
  • __ name__内置名的应用场景

    • 一般是模块开发者用于测试自己的代码
if __name__ == '__main__':
	当文件是执行文件的时候才会执行if的子代码
	上述判断一般只出现整个程序的启动文件中
ps:在pycharm中可以直接编写main按tab键自动补全

模块的查找顺序

  • 内存查找>>>>>内置中查找>>>>>sys.path中查找(程序系统环境变量)

    1. 内存查找:导入一个文件,然后在导入过程中删除该文件,发现还可以使用
import md
import time

time.sleep(15)
print(md.money)
  1. 创建一个跟内置模块名相同的文件名

    • 注意:创建模块文件的时候尽量不要与内置模块名冲突
import time
print(time.time())
from time import name
print(name)

image

  1. sys.path中查找(程序系统环境变量):导入模块的时候一定要知道谁是执行文件

    • ​ 所有的路径都是参照执行文件来的,执行文件默认只能导入同级的模块文件,如果要导入不同级的模块文件,需要添加模块文件的路径
import mdd # 不能导入
import sys
print(sys.path)
'''
['D:\\pycham\\PycharmProjects\\day22', 
'D:\\pycham\\PycharmProjects\\day22', 
'D:\\pycham\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display', 
'D:\\python\\python36\\python36.zip', 
'D:\\python\\python36\\DLLs', 
'D:\\python\\python36\\lib', 
'D:\\python\\python36', 
'D:\\python\\python36\\lib\\site-packages', 
'D:\\pycham\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend', '被导入文件的路径']
'''

image

# 解决办法
import sys
sys.path.append(r'D:\pycham\PycharmProjects\day22\yahuo') # 将mdd的路径添加到sys中
import mdd
print(mdd.name) # 不同级的名字


import sys
sys.path.append(r'被导入文件的路径')
'''
1.通用方式
sys,path.append('目标文件路径')
2.利用from...import句式
from 目标文件路径 import ...
起始位置一定是执行文件所在的路径
'''

image

 posted on 2022-07-13 20:25  念白SAMA  阅读(64)  评论(0)    收藏  举报