Python 迭代器的应用

一、合并多个有序序列,再对整个有序序列进行迭代 ----> heapq.merge

        1、 heapq.merge 的迭代性质意味着它对所有提供的序列都不会做一次性读取,因此在处理长序列时,开销比较小

        2、heapq.merge() 要求所有输入的序列都是有序的,因为函数本身不会对输入做任何关于是否有序的验证

        3、heapq.merge() 只是简单的检查每个输入序列中的第一个元素,将最小的发送出去,然后再从之前选择的序列 中读取一个新的元素,重复执行此步骤

"""
    1、合并多个有序序列,再对整个有序序列进行迭代 ----> heapq.merge
    2、heapq.merge 的迭代性质意味着它对所有提供的序列都不会做一次性读取,因此在处理长序列时,开销比较小
    3、heapq.merge() 要求所有输入的序列都是有序的,因为函数本身不会对输入做任何关于是否有序的验证
    4、heapq.merge() 只是简单的检查每个输入序列中的第一个元素,将最小的发送出去,然后再从之前选择的序列
        中读取一个新的元素,重复执行此步骤
"""
import heapq

a = [1, 4, 7, 10]
b = [2, 5, 6, 11]
c = [3, 8, 11, 12]
d = heapq.merge(a, b, c)
print(d)
for item in d:
    print(item, end=' ')

a1 = [10, 7, 4, 1]
b1 = [2, 5, 6, 11]
c1 = [3, 8, 11, 12]
d1 = heapq.merge(a1, b1, c1)
print('\n')
for item in d1:
    print(item, end=' ')
print('\n')


def Merge(l1, l2):
    l3 = []
    len1, len2 = len(l1), len(l2)
    p1, p2 = 0, 0
    while p1 < len1 or p2 < len2:
        if p1 == len1:  # 判断序列1是否遍历完成
            l3.append(l2[p2])
            p2 += 1
        elif p2 == len2:  # 判断序列2是否遍历完成
            l3.append(l1[p1])
            p1 += 1
        elif l1[p1] <= l2[p2]:  # 仅用此判断,当某个序列遍历完成后,索引值继续加1,由于or语句的存在,会再次进入循环中,于是出现索引超出范围的情况
            l3.append(l1[p1])
            p1 += 1
        else:
            l3.append(l2[p2])
            p2 += 1

    return l3


if __name__ == '__main__':
    print(Merge(a, b))
    print(Merge(a1, b1))

二、同时迭代多个序列

        1、zip(a, b)的工作原理是创建出一个迭代器,迭代的长度和其中最短的输入序列相同

        2、itertools.zip_longest() 可将最长的输入序列迭代出来

"""
    1、同时迭代多个序列
    2、zip(a, b)的工作原理是创建出一个迭代器,迭代的长度和其中最短的输入序列相同
    3、itertools.zip_longest() 可将最长的输入序列迭代出来
"""


from itertools import zip_longest


a = [1, 2, 3]
b = ['x', 'y', 'z']
c = ['A', 'B', 'C', 'D', 'E']

r1 = zip(a, b, c)
print(r1, type(r1))
for item in r1:
    print(item)

r2 = zip_longest(a, b, c)
print(r2, type(r2))
for item in r2:
    print(item)

三、跳过可迭代对象中的前一部分元素

        1、itertools.dropwhile()函数的使用:提供一个函数和一个可迭代对象

        2、itertools.dropwhile()函数只会丢弃元素,直到有某个元素不满足测试函数为止,之后的所有剩余元素都不会经过筛选而直接返回

"""
    1、跳过可迭代对象中的前一部分元素
    2、itertools.dropwhile()函数的使用:提供一个函数和一个可迭代对象
    3、itertools.dropwhile()函数只会丢弃元素,直到有某个元素不满足测试函数为止,之后的所有剩余元素都不会经过筛选而直接返回
"""

import os
from itertools import dropwhile

# # 当前脚本的工作路径
# print(os.getcwd())
# # 获取绝对路径
# print(os.path.abspath(__file__))
# print(os.path.abspath(os.path.dirname(__file__)))
# # 获取当前文件上层目录
# print(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
# 获取上上级目录
# print(os.path.abspath(os.path.join(os.getcwd(), "../..")))

BASE_DIR = os.path.abspath(os.path.join(os.getcwd(), "../../.."))
print(BASE_DIR)

print('-' * 50)
with open(BASE_DIR + '/vm_install.conf') as f:
    for line in f:
        print(line)

print('-' * 50)
with open(BASE_DIR + '/vm_install.conf') as f:
    for line in dropwhile(lambda lin: lin.startswith('#'), f):
        print(line)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值