Python中使用yield实现迭代器

遇到复杂数据处理逻辑,想到可以使用Python的yield迭代器可以优雅地实现,切实体验到了迭代器的好处,多数情况下,代码不够优雅,也别是多层循环嵌套的,都可以常使用迭代器重构。

1,减少内存的占用,正如yield的经典用途,不必把所需的数据一次性生成到内存中,可以分批生成
2,明确函数职责,代码更优雅,可以遍历“迭代器函数”后进行逻辑处理,而不是原函数内部做逻辑处理


# 迭代器返回部分结果
def get_data_from_mysql(batch_size):
    target_conn = {'host': '***.***.***.***', 'database': 'db01', 'port': 8000, 'user': 'root', 'password': '***'}
    var_list = []
    with pymysql.connect(**target_conn) as conn:
        with conn.cursor() as cursor:
            cursor.execute("SELECT * FROM test_table LIMIT 100;")
            for row in cursor:
                var_list.append(row)
                if len(var_list) == batch_size:
                    yield var_list
                    var_list.clear()


# 遍历迭代器进行逻辑处理
def do_business_process():
    var_batch_size = 10
    for var_list in get_data_from_mysql(var_batch_size):
        print(var_list)
        print('do something complicated business for var list')


if __name__ == "__main__":
    do_business_process()

'''
1,减少内存的占用,正如yield的经典用途,不必把所需的数据一次性生成到内存中,可以分批生成
2,明确函数代码职责,代码更优雅,可以遍历“迭代器函数”后进行逻辑处理,而不是遍历函数的同时做逻辑处理
'''

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中使用yield实现迭代器 - Python技术站

(0)
上一篇 2023年3月31日
下一篇 2023年3月31日

相关文章

  • 译:在Python调用线程中处理线程异常(如何在主线程中捕获子线程异常)

     python多线程中,主线程中如果捕获子线程的异常,笔者查阅了相关资料,有一种方式是使用队列(queue)将子线程的异常写入队列,然后主进程中去遍历异常消息队列,这种方式不近需要额外引入一个q对象,要同时遍历队列和判断线程状态,实现上上非常丑陋,后来发现如下方式,通过继承threading.Thread后,重写run和join方法,优雅地实现了线程方法的异…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部