迭代器和生成器

迭代器和模块

什么是迭代器

迭代器是容器型数据类型。

打印一个迭代器无法查看这个迭代器中所有的元素,迭代器无法通过len获取元素个数;

如果想要使用迭代器中的元素,必须将元素从迭代器中取出,而且在取的时候只能从上往下按顺序,取一个就少一个,取出来的数据无法再放回迭代器。

创建迭代器

  1. 用iter将其他序列转换成迭代器

    i1 = iter('abc')
    print(i1)
    
    i2 = iter([10, 20, 30, 40])
    print(i2)
    
  2. 迭代器的查操作

    1. 获取单个元素:next(迭代器)
     print(next(i1))  # 'a'
     print(next(i1))  # 'b'
    
    1. 遍历

      print(next(i2))
      print('*' * 20)
      for x in i2:
          print(x)
      
      i3 = iter('hello')
      result = list(i3)  # ['h', 'e', 'l', 'l', 'o']
      print(result)
      

生成器

什么是生成器

  1. 生成器就是容器型数据类型(具备创建多个数据的能力,而不是保存多个数据的能力)。
  2. 打印生成器无法查看所有的元素,生成器也不支持len操作。
  3. 如果需要使用生成器中的数据,必须将数据提取出来,而且取一个就少一个。
  4. 生成器获取数据的方式和迭代器一样。

创建生成器

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

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

定义生成器对应的函数

  1. 生成器创建数据的个数和数据的值,由在执行生成器对应的函数的函数体的时候会遇到几次yield,每次遇到yield的时候对应的数据来决定。
  2. 执行函数体会遇到几次yield对应的生成器就可以创建多少个数据;
  3. 每次遇到yield,yield后面的值是什么,对应的元素就是什么。

案例1:

def func1():
    print('=====')
    print('++++++')
    if False:
        yield
    return 100


# 如果被调用的函数的函数体中有yield,调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器对象(函数调用表达式的值就是生成器)
result = func1()
print(f'result:{result}')
# print(next(result))

案例2:

def func2():
    yield 100
    yield 200
    yield 300


gen2 = func2()
print(next(gen2))
print(next(gen2))
print(next(gen2))
# print(next(gen2))


def func3(subject):
    for x in range(1, 100):
        yield f'{subject}{x:0>3}'


gen3 = func3('python')
print(next(gen3))
for x in gen3:
    print(f'x:{x}')

生成器产生数据的原理

  1. 调用函数创建生成器的是不会执行函数体,获取生成器中的元素的时候才会执行函数体。
  2. 每次在执行函数体的时候从开始位置开始,执行到yield就停下来,并且将yield后面的数据作为获取到的元素。

案例1:

def func4():
    print('=======1=======')
    yield 10
    print('=======2=======')
    yield 20
    print('=======3=======')
    yield 30


gen4 = func4()
print(next(gen4))
print('----')
print(next(gen4))
print('----')
print(next(gen4))

案例2:

def get_file_data():
    f = open('豆瓣电影.csv', encoding='utf-8')
    while True:
        data = f.readline()
        if not data:
            break
        yield data


reader = get_file_data()
print(next(reader))
print(next(reader))

模块

认识模块

  1. 前提:被使用的模块的模块名(py文件的文件名)必须符合变量名的要求
  2. 使用原则:先导入才能使用(能被别的模块使用的内容只能是)

导入模块

  1. import 模块名 - 导入指定模块,导入可以通过’模块名.xxx’的方式使用这个模块中所有的全局变量
  2. from 模块名 import 变量1,变量2,…… - 导入指定模块中的指定变量,导入后可以直接使用所有指定的变量1
  3. from 模块名 import * - 导入指定模块中所有的变量,导入后可以直接使用所有的变量
  4. import 模块名 as 新模块名 - 导入模块的时候对模块重命名,通过’新模块名.xxx’的方式只用模块中所有的全局变量

导入方式1:

import test1

print(test1.a)

导入方式2:

from test1 import a, func1

print(a)
func1()

导入方式3:

from test1 import *

print(a)
func1()

导入方式4:

import test1 as t1

导入模块的原理

if __name__ == '__main__':
    # 这个语句中的代码不会被别的模块执行
    pass

包就是包含__init__.py文件的文件夹。

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

怎么使用包中的内容

  1. import 包名 - 导入指定的包(必须是包,文件夹无意义),导入后可以通过’包名.xxx’的方式使用__init__.py文件中所有内容
  2. import 包名.模块名 - 导入指定包中的指定模块(文件夹也可以用)
  3. from 包名 import 模块名1,模块名2,…
  4. from 包名.模块名 import 变量1, 变量2,…

直接导入包:

import fileManager

fileManager.create_file()
print(fileManager.m)

直接导入包中的模块:

import fileManager.operateFile
import files.test2

fileManager.operateFile.open_file()
fileManager.operateFile.close_file()

print(files.test2.x)
files.test2.func2()

直接导入包中的模块,然后重命名:

import fileManager.operateFile as file
file.close_file()
file.open_file()

直接导入包中指定多个模块:

from fileManager import operateFile, operateJsonFile as json
operateFile.open_file()

导入指定包名中指定模块中的指定内容:

from files.test2 import x, func2
print(x)
func2()


from files.images.image import load_image
load_image()


from fileManager import add_filter, remove_file
add_filter()
remove_file()

异常捕获

异常

异常就是错误
执行程序的过程中,如果出现异常,会中断程序的执行(让程序提前结束)

exit() - 让程序正常退出

异常捕获

让程序在出现异常的时候,不崩溃,还可以接着往后执行

注意:不要滥用异常捕获。如果是因为使用者使用不当导致程序出现异常,又希望在出现异常程序可以继续执行才使用异常捕获。

结构1 :捕获所有异常

"""
try:
    代码段1(需要捕获异常的代码段)
except:
    代码段2(捕获到异常需要执行的代码段)

执行过程:先执行代码段1,如果出现异常直接马上执行代码段2;如果没有出现异常,就不执行代码段2
"""

结构2 : 捕获指定异常

"""
try:
    代码段1(需要捕获异常的代码段)
except 异常类型:
    代码段2(捕获到异常需要执行的代码段)
""" 

结构3 - 同时捕获多种异常

"""
try:
    代码段1(需要捕获异常的代码段)
except (异常类型1, 异常类型2,...):
    代码段2(捕获到异常需要执行的代码段)
"""

结构4 - 同时捕获多种异常

"""
try:
    代码段1(需要捕获异常的代码段)
except 异常类型1:
    代码段11
except 异常类型2:
    代码段22
...
"""

示例:

try:
    print('abc'[4])         # IndexError
    print('=====')
    print('+++++')
except:
    print('捕获到异常!')

print('程序结束!')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值