【Python 高级】Python全栈体系(八)

Python 高级

第四章 迭代

  • 每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。例如:循环获取容器中的元素。

一、可迭代对象iterable

  1. 定义:具有__iter__函数的对象,可以返回迭代器对象。
  2. 语法
-- 创建:
	class 可迭代对象名称:
  		def __iter__(self):
      		return 迭代器
-- 使用:
	for 变量名 in 可迭代对象:
		语句
  1. 原理:
迭代器 = 可迭代对象.__iter__()
while True:
    try: 
        print(迭代器.__next__())
    except StopIteration:
        break

二、迭代器对象iterator

  1. 定义:可以被next()函数调用并返回下一个值的对象。
  2. 语法
class 迭代器类名:
    def __init__(self, 聚合对象):
        self.聚合对象= 聚合对象 

    def __next__(self): 
        if 没有元素:
            raise StopIteration
        return 聚合对象元素
  1. 说明:
    – 聚合对象通常是容器对象。
  2. 作用:使用者只需通过一种方式,便可简洁明了的获取聚合对象中各个元素,而又无需了解其内部结构。
"""
    可迭代对象
"""
list01 = [34, 4, 5, 46, 57, 87]


# for item in list01:
#     print(item)

# 对象可以for的条件是什么?
# 对象具有__iter__方法
# 对象可以获取迭代器

# for 原理:
# 1. 获取迭代器对象
iterator = list01.__iter__()
print(dir(list01))
while True:
    try:
        # 2. 获取下一个元素
        item = iterator.__next__()
        print(item)
    # 3. 如果没有元素,则捕获异常,停止循环。
    except StopIteration:
        break
"""
    练习1:使用迭代思想,获取元组中所有元素
    练习2:使用迭代思想,获取字典中所有k.v
"""
dict01 = {"唐僧":27,"悟空":29,"八戒":30}
iterator = dict01.__iter__()
while True:
    try:
        key = iterator.__next__()
        print(key,dict01[key])
    except StopIteration:
        break
"""
    迭代器
    目的:迭代自定义对象

"""


class SkillIterator:
    def __init__(self, data):
        self.__data = data
        self.__index = -1

    def __next__(self):
        self.__index += 1
        if self.__index > len(self.__data) - 1:
            raise StopIteration()
        return self.__data[self.__index]


class SkillManager:
    def __init__(self):
        self.__skills = []

    def add_skill(self, skill):
        self.__skills.append(skill)

    def __iter__(self):
        return SkillIterator(self.__skills)


manager = SkillManager()
manager.add_skill("九阳神功")
manager.add_skill("乾坤大挪移")
manager.add_skill("太极")

# for item in manager:
#     print(item)#

iterator = manager.__iter__()
while True:
    try:
        item = iterator.__next__()
        print(item)
    except StopIteration:
        break

在这里插入图片描述

"""
    for item in MyRange(5):
        print(item)# 0 1 2 3 4
"""


class MyRangeIterator:
    def __init__(self, stop):
        self.__number = -1
        self.__stop_value = stop

    def __next__(self):
        self.__number += 1
        if self.__number >= self.__stop_value:
            raise StopIteration()

        return self.__number


class MyRange:
    def __init__(self, stop):
        self.__stop = stop

    def __iter__(self):
        return MyRangeIterator(self.__stop)


# 循环一次 计算一次  返回一次
for item in MyRange(999999999999999999999999999999999999):
    print(item)  # 0 1 2 3 4
"""
    迭代器 --> yield
"""

class SkillManager:
    def __init__(self):
        self.__skills = []

    def add_skill(self, skill):
        self.__skills.append(skill)

    def __iter__(self):
        # 你看见的代码,不是这个样子.
        # 代码生成大致流程:
        # 1. 将yield以前的代码,定义在__next__方法中
        # 2. 将yield以后的数据,作为__next__方法的返回值
        print("准备")
        yield self.__skills[0]
        print("准备")
        yield self.__skills[1]
        print("准备")
        yield self.__skills[2]

        for item in self.__skills:
            print("准备")
            yield item


manager = SkillManager()
manager.add_skill("九阳神功")
manager.add_skill("乾坤大挪移")
manager.add_skill("太极")

for item in manager:
    print(item)

# iterator = manager.__iter__()
# while True:
#     try:
#         item = iterator.__next__()
#         print(item)
#     except StopIteration:
#         break

三、生成器generator

  1. 定义:能够动态(循环一次计算一次返回一次)提供数据的可迭代对象。
  2. 作用:在循环过程中,按照某种算法推算数据,不必创建容器存储完整的结果,从而节省内存空间。数据量越大,优势越明显。
  3. 以上作用也称之为延迟操作或惰性操作,通俗的讲就是在需要的时候才计算结果,而不是一次构建出所有结果。
1. 生成器函数
  1. 定义:含有yield语句的函数,返回值为生成器对象。
  2. 语法
-- 创建:
def 函数名():yield 数据
	…

-- 调用:
for 变量名 in 函数名():
	语句

  1. 说明:
    – 调用生成器函数将返回一个生成器对象,不执行函数体。
    – yield翻译为”产生”或”生成”
  2. 执行过程:
    (1) 调用生成器函数会自动创建迭代器对象。
    (2) 调用迭代器对象的__next__()方法时才执行生成器函数。
    (3) 每次执行到yield语句时返回数据,暂时离开。
    (4) 待下次调用__next__()方法时继续从离开处继续执行。
  3. 原理:生成迭代器对象的大致规则如下
    – 将yield关键字以前的代码放在next方法中。
    – 将yield关键字后面的数据作为next方法的返回值。
  4. 小结
    函数返回单个对象使用return
    函数返回多个对象使用yield
"""
    yield --> 生成器
"""

"""
    # 生成器:可迭代对象(可以参与for) + 迭代器(产生数据)
    calss Generator:
        def __iter__(self):
            return self
        
        def __next__(self):
            ...
"""

def my_range(stop):
    number = 0
    while number < stop:
        yield number
        number += 1

# for item in my_range(5):
#     print(item)  # 0 1 2 3 4

# 惰性操作/延迟操作
my = my_range(5)
iterator = my.__iter__()
while True:
    try:
        item = iterator.__next__()
        print(item)
    except StopIteration:
        break
"""
    定义函数,在列表中获取所有偶数.
        -- 传统思想:将结果存入新列表再返回
        -- 生成器思想:将结果交给生成器对象推算
    通过调试,体会惰性操作
"""
list01 = [43, 42, 68, 66, 78, 87, 453, 4]


def get_even01():
    list_result = []
    for item in list01:
        if item % 2 == 0:
            list_result.append(item)
    return list_result

result = get_even01()
for item in result:
    print(item)

def get_even02():
    for item in list01:
        if item % 2 == 0:
           yield item

result = get_even02()
for item in result:
    print(item)
2. 内置生成器
2.1 枚举函数 enumerate
  1. 语法:
for 变量 in enumerate(可迭代对象):
    语句

for 索引, 元素in enumerate(可迭代对象):
    语句
  1. 作用:遍历可迭代对象时,可以将索引与元素组合为一个元组。
2.2 zip
  1. 语法:
for item in zip(可迭代对象1, 可迭代对象2.):
    语句
  1. 作用:将多个可迭代对象中对应的元素组合成一个个元组,生成的元组个数由最小的可迭代对象决定。
3. 生成器表达式
  1. 定义:用推导式形式创建生成器对象。
  2. 语法:变量 = ( 表达式 for 变量 in 可迭代对象 [if 真值表达式] )
"""
    参照下列代码,自定义生成器my_enumerate.
"""


def my_enumerate(iterable):
    index = 0
    for item in iterable:
        yield (index, item)
        index += 1


dict01 = {"悟空": 26, "八戒": 28}
for item in my_enumerate(dict01):
    print(item)

for item in enumerate(dict01):
    print(item)
"""
    参照下列代码,自定义生成器my_zip
"""


def my_zip(iterable01, iterable02):
    for i in range(len(iterable01)):
        yield (iterable01[i], iterable02[i])


list01 = ["八戒", "悟空", "苏大强"]
list02 = [102, 105]

for item in zip(list01, list02):
    print(item)
"""
    生成器表达式
"""

# 列表推导式
list01 = [34, 43, 54, 65, 67, 7]
list02 = [item for item in list01 if item > 10]
for item in list02:
    print(item)


generator02 = (item for item in list01 if item > 10)
for item in generator02:
    print(item)


for item in (item for item in list01 if item > 10):
    print(item)
"""
    1. 使用生成器表达式在list01中找出所有字符串
    2. 使用生成器表达式找出所有大于10的整数
"""
list01 = ["悟空",57,"八戒",True,"三藏",5.8,10,90]

for element in (item for item in list01 if type(item) == str):
    print(element)


for element in (item for item in list01 if type(item) == int and item > 10):
    print(element)
4. 小结
  • 在循环过程中,按照某种算法推算数据,不必创建容器存储完整的结果,从而节省内存空间,数据量越大,优势越明显。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬小帽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值