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

liftword5个月前 (01-12)技术文章44
# 列表推导式提供了一种简洁高效的方式来创建列表,
# 生成器表达式则是一种节省内存的方式
# 例子:
# 列表推导式
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最常用的数据类型,格式是方括号[]中包含以逗号分隔的字符或者数字。列表中的每个元素都有一个位置(称为下标或者索引),从0开始。二、创建列表>>> list...

Python数据类型—列表

序列是python中最基本的数据,python中有六个序列的内置类型,但最常见的是列表和元组。序列中的每个元素都分配一个位置,用数字表示,即是该元素的索引值,第一位元素的索引值是0,第二位是1,以此类...

[1]Python基础语法-【7】列表

Python中的列表是一种有序的数据集合,可以容纳任意类型的数据,包括数字、字符串和其他列表等。列表是Python编程中最常用的数据结构之一,可以用来存储和处理大量数据。定义列表在Python中,列表...

Python学习笔记——列表

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

python入门006:认识列表

一、列表简介1、什么是列表列表由一系列按特定顺序排列的元素组成。列表是有序信息集合。列表让你能够在一个地方存储成组的信息,其中可以只包含几个元素,也可以包含数百万个元素。2、列表的表示方法在pytho...