• 010-python之迭代器


    一、迭代器

    迭代器是容器型数据类型,迭代器可以使用容器型数据类型的通用操作

    1、迭代器的特点
    • 打印迭代器的时候无法查看迭代器中的所有元素,也无法通过len()获取元素的个数
    • 如果要使用迭代器中的元素必须将该元素取出,取元素的时候只能从上往下按顺序取,取出来的元素无法再放回迭代去
    2、创建迭代器

    (1)用iter将其他序列转换成迭代器
    (2)创建生成器 生成器 创建多个数据

    i1 = iter('abcdefg')
    print(i1)
    i2 = iter([1, 2, 3, 4])
    print(i2)
    
    • 1
    • 2
    • 3
    • 4
    3、查操作

    不管以什么样的方式获取到了迭代器的元素,那么获取的元素一定会从迭代器中消失

    3.1 获取单个元素
    next(迭代器)  迭代器中为空时取元素会报错
    
    • 1
    # 获取单个元素
    i2 = iter([1, 2, 3, 4])
    i2 = iter([1, 2, 3, 4])
    print(next(i1)) # a
    print(next(i1)) # b
    print(next(i2)) # 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3.2 遍历
    # 遍历
    i2 = iter([1, 2, 3, 4])
    for i in i2:
        print(i)
    
    • 1
    • 2
    • 3
    • 4
    3.3 迭代器转换成序列
    i3 = iter('hello')
    result = list(i3)
    print(result)  # ['h', 'e', 'l', 'l', 'o']
    # print(next(i3))  # 报错  因为将i3转换成了列表,已经将元素全部取出,再从i3中取元素就会报错
    
    • 1
    • 2
    • 3
    • 4

    二、生成器

    生成器是容器型数据(具备创建多个数据的能力,而不是保存多个数据的能力)

    1、生成器的特点

    特点和迭代器一样

    • 打印生成器的时候无法查看迭代器中的所有元素,也不支持len()操作

    • 如果要使用生成器中的元素必须将该元素取出,元素取一个少一个,取出来的元素无法再放回迭代器

    • 生成器获取数据的方式和迭代器一样

    2、创建生成器

    生成器保存的不是数据本身,而是产生数据的算法(函数)

    2.1 调用yield关键字的函数,就可以得到一个生成器

    如果调用的函数中有yield关键字,调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器对象

    3、创建生成器对应的函数

    生成器创建数据的个数和数据的值 由执行 生成器对应的函数的函数体 的时候会遇到几次yield

    每次由遇到的yield对应的数据来决定
    遇到多少次yield就是产生多个个数据;yield后面的值是什么,元素就是什么

    def fun1():
        yield 100
        yield 200
        yield 300
    nums = fun1()
    print(next(nums))  # 100
    print(next(nums))  # 100
    print(next(nums))  # 100
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    def fun2(subject):
        for i in range(1, 5):
            yield f'{subject}{i:0>3}'
    
    
    nums2 = fun2('python')
    for i in range(1, 5):
        print(next(nums2), end=' ')  # python001 python002 python003 python004
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    4、生成器产生数据的原理

    调用函数的时候不会执行函数体,在获取生成器的元素的时候函数体才执行;

    而且每次执行的时候只执行一次yield,不会全部执行函数体

    三、模块

    1、模块是什么

    python中一个py文件就是一个模块

    2、怎么在一个模块中使用另一个模块的内容

    前提:被使用的模块的模块名必须符合变量名的要求

    使用原则:先导入后使用(能被别的模块使用的内容只能是全局变量)

    3、导入模块

    方法1

    import 模块名	导入指定模块,可以通过'模块名.xxx'的方式使用这个模块中所有的全局变量
    
    • 1

    方法2

    from 模块名 import 变量1,变量2,变量3,...  导入指定模块中的指定变量,导入后可以直接使用所有指定的变量
    
    • 1

    方法3

    from 模块名 *  导入指定模块中所有的变量
    
    • 1

    方法4

    import 模块名 as 新模块名   导入模块的时候对模块重命名,通过'新模块.xxx'的方式只用模块中的全局变量
    
    • 1

    方法5

    from 模块名 import 变量1 as 新变量1,变量2 as 新变量2,...  对导入的变量重命名
    
    • 1
    4、导入模块的原理

    不管以什么方式导入模块或者模块中内容,系统都会在导入模块的时候进入对应模块,将模块中的代码执行一遍

    导入模块的时候选择性执行代码:模块中不需要被别的模块执行的代码放入if __name__ == '__main__':中;需要被别的模块执行的代码不做修改

    if __name__ == '__main__':
        # 这个模块中的代码不会被别的模块执行
        pass
    
    • 1
    • 2
    • 3

    四、包

    1、包是什么

    包就是包含__init__.py文件的文件夹
    包就是用来管理py文件的,对py文件按照特定的方式进行分类

    2、创建包

    项目右键 - new - Python Package

    3、怎么使用包中的内容

    方法1

    import 包名     导入指定的包,导入后可以通过'包名.xxx'的方式使用'__init__.py'中的内容
    
    • 1

    方法2

    import 包名.模块名     导入指定包中的指定模块
    
    • 1

    方法3

    import 包名.模块名 as 新名字   重命名
    
    • 1

    方法4

    from 包名 import 模块名1,模块名2,...    直接导入包中指定的模块
    
    • 1

    方法5

    from 包名.模块名 import 变量1,变量2,...    
    
    • 1

    五、异常

    1、异常是什么

    异常就是错误

    执行程序的过程中,如果出现异常,会中断程序的执行

    exit() 程序正常退出

    2、异常捕获

    让程序在出现异常的时候不奔溃,还可以继续往后执行。

    注意:不要滥用异常捕获,如果是使用者使用不当造成的程序异常又希望程序可以继续执行可以使用异常捕获

    3、结构

    结构1

    结构1     捕获所有异常
    try:
        代码段1(需要捕获异常的代码)
    except:
        代码段2(捕获到异常需要执行的代码)
    执行过程:
            先执行代码段1,如果出现异常**直接马上**执行代码段2;如果不出现异常就不执行代码段2
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    try:
        age=int(input('输入年龄:'))# 出现异常,直接执行except中的代码,try中剩余的代码不会再执行
        if age>=18:
            print('成年')
        else:
            print('未成年')
    except:
        print('输入错误')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结构2

    结构2:    捕获指定异常 
    try:
        代码段1(需要捕获异常的代码)
    except 异常类型:
        代码段2(捕获到异常需要执行的代码)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结构3

    结构3     同时捕获多种指定异常
    try:
        代码段1(需要捕获异常的代码)
    except(异常类型1,异常类型2,...):
        代码段2(捕获到异常需要执行的代码)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结构4

    结构4        同时捕获多种异常,但是每种异常的处理都不一样
    try:
        代码段1(需要捕获异常的代码)
    except 异常类型1:
        代码段2(捕获到异常需要执行的代码)
    except 异常类型2:
        代码段3
        ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    【附源码】计算机毕业设计SSM网上购物系统
    低代码与医疗的结合
    浅谈电动汽车充电桩设计与应用研究
    用Python写个工具,同时应付10个客服MM!
    JS中call(),apply()是什么,call(),apply()的原理是什么?如何手写一个call(),apply()?Symbol是什么,怎么用Symbol调优?含详细解析
    【时间序列异常检测】Anomaly Transformer论文笔记
    优步让一切人工智能化
    洛谷P5732 【深基5.习7】杨辉三角题解
    Golang开发--互斥锁和读写锁
    基于Python和mysql开发的智慧校园答题考试系统(源码+数据库+程序配置说明书+程序使用说明书)
  • 原文地址:https://blog.csdn.net/qq_44087994/article/details/126147709