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 +模块名 导入过程!!!!重要理解

image

-----------过程-------------------------------------------
	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 ...句式 导入调用过程

image

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
  """
posted @ 2022-07-13 19:04  名字长的像一只老山羊  阅读(57)  评论(0编辑  收藏  举报