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

liftword6个月前 (01-12)技术文章52
# 列表推导式提供了一种简洁高效的方式来创建列表,
# 生成器表达式则是一种节省内存的方式
# 例子:
# 列表推导式
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小案例38-列表的定义和创建

在Python中,列表是一种有序、可变、可重复的数据结构。列表用方括号 [] 表示,其中的元素可以是任意类型的数据,包括数字、字符串、布尔值、甚至是其他列表。要定义和创建一个列表,可以使用以下两种方法...

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

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

python基础——列表详解

一、简述 列表是Python最常用的数据类型,格式是方括号[]中包含以逗号分隔的字符或者数字。列表中的每个元素都有一个位置(称为下标或者索引),从0开始。二、创建列表>>> list...

什么是Python列表

列表是一个任意类型的对象的位置相关的有序集合,它没有固定大小,是可变的,与数组类似。列表中的元素没有固定类型的限制,可以由任意对象来构成,是Python语言中一种高频使用的数据类型。其定义方式如下:...

Python学习笔记——列表

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