python 简述列表推导式和生成器

liftword4个月前 (01-12)技术文章39
# 列表推导式提供了一种简洁高效的方式来创建列表,
# 生成器表达式则是一种节省内存的方式
# 例子:
# 列表推导式
print([x**2 for x in range(10)])
# 推导式 生成九九乘法表
print("\n".join([" ".join(["{}*{}={}".format(x, y, x*y) for x in range(1,y+1)]) for y in range(1,10)]))

# 生成器:是一种特殊的程序,它可以控制循环的迭代行为,可以暂时性挂起,可以保留局部变量,再次调用时使用。

# 主要使用场景包括:
# 生成器也是一种迭代器,用于迭代一组数据
# 如果序列元素是通过算法推导出来的,可以迭代边循环边计算,不必创建完整的序列 ,可以节省大量空间
# 协程是基于生成器实现的,以在单个线程中实现并发

# 生成器的创建:列表生成式 的 [] 改成 (),就是一个简易生成器
gender =(x for x in range(10) if x % 2 == 0)
# 生成器的读取
print(next(gender)) # 0
print(next(gender)) # 2
print(next(gender)) # 4
print(next(gender)) # 6
print(next(gender)) # 8
# 超出访问结果,程序会会抛出StopIteration错误
#========================================================
# yield 生成器:
def func(n):
    i = 0
    while i < n:
        yield  i ** 2
        i+=1;
    return '执行结束'
g = func(5)
# 第一种:单个读取数据
print('生成器结果:',next(g))
print('生成器结果:',next(g))
print('生成器结果:',next(g))
print('生成器结果:',next(g))
# 超出访问结果,程序会会抛出StopIteration错误

# 第二种 遍历生成器读取
while True:
    try:
        result = next(g)
        print('生成器结果:',result)
    except StopIteration as e:
        print('生成器返回:', e.value)
        break
# 注:超出生成器的取值返回,程序会报错


# send() 和  yield from

# 发送值到生成器 send()
def echo():
    while True:
        print("输出值前")
        value = yield
        print(f"收到值: {value}")

gen = echo()
next(gen)  # 初始化生成器,进入循环
gen.send(42)  # 输出: 收到值: 42
gen.send(10) # 输出: 收到值: 10


# yield from  在执行过程中,调用其他的生成器
def leaf():
    yield '叶'
    yield '子'

def branch():
    yield '枝'
    yield from leaf() # 调用其他生成器
    yield '条'

for item in branch():
    print(item)

# 协程的定义是可以在某个点暂停执行并在恢复执行时从该点开始的生成器函数。

# 简单的生产者和消费者的协程例子
def consumer():
    while True:
        d = yield 'data from consumer'
        print('[Consumer] get data from producer: %d' % d)

def producer(consumer_obj):
    next(consumer_obj)
    for count in range(5):
        print('[Producer] producing %d' % count)
        consumer_obj.send(count)
    consumer_obj.close()

c = consumer()
producer(c)

# 利用生成器实现的协程。可以在无锁的情况下实现从 producer() 向 consumer() 传递数据。
# 单独看 consumer() 还是生成器类型,但是整体是借助生成器实现任务的协作控制。

相关文章

. Python 中的列表用法详解

列表是 Python 中最通用和最常用的数据结构之一。它们是有序的项目集合,可以保存各种数据类型并且是可变的,这意味着它们的内容在创建后可以更改。列表提供了一种有效的方法来有效地组织和操作数据。1...

一篇文章带你弄懂Python基础之列表介绍和循环遍历

大家好,我是Go进阶者,今天给大家分享一些Python基础 (列表基础和循环遍历介绍),一起来看看吧~一、列表介绍想一想:字符串可以用来存储一串信息,那么想一想,怎样存储所有同学的名字呢?定义100个...

函数式编程在Python中:概念与列表推导式

在Python编程中,函数式编程是一种强大的编程范式,它将计算视为数学函数的评估,并避免状态和可变数据。本文将介绍函数式编程的基本概念,并重点探讨列表推导式在Python中的应用。一、函数式编程简介函...

Python之列表是什么

列表是由一系列按照特定顺序排列的元素组成。你可以创建包含字母、数字等等的列表;也可以将任何东西加入到列表中,各个元素之间可以没有任何关系。 在Python中,用英文格式的方括号([ ])来表示列表,...

Python学习笔记——列表

一、列表的定义:由一系列按特定顺序排列的元素组成。二、列表的表示方式:[*, *, ...., n]。例如:bicycles = ['A', 'B', 'C&#...