生成器和生成器表达式

一.生成器

生成器的本质就是迭代器

生成器的特点和迭代器一样,取值方式和迭代器一样__next__(),send():给上一个yield.

生成器一般由生成器函数或者生成器表达式创建,其实就是手写的迭代器.

def func():
    print("111")
    yield 222

gener = func() #这个时候函数不会执行,而是获取生成器
ret = gener.__next__() #这个时候函数才会执行,yield的作用和return一样,也是返回数据
print(ret)
结果:
111
222

yield和return的效果是一样的,区别是yield是分段来执行一个函数,return是直接停止执行函数

 

二.生成器函数

和普通函数没有区别,里面有yield的函数就是生成器函数.

生成器函数在执行的时候,默认不会执行函数体,返回生成器. 通过生成器的__next__()分段执行这个函数. send()给上一个yield传值,不能在开头(没有上一个yield),最后一个yield也不可以用send()

send 和__next__()区别:

1.send和next()都是让生成器向下走一次

2.send可以给上一个yield的位置传递值,不能给最后一个yield发送值,在第一次执行生成器代码的时候不能使用send()

生成器可以使用for循环获取内部元素.

三.推导式.

1.列表推导式[结果 for循环 条件筛选]

2.字典推导式 {k:v for循环 条件筛选}

3.集合推导式{k for 循环 条件}

四.生成器表达式

(结果 for 循环 条件) 特点: 1.惰性机制 2.只能向前 3,节省内存

生成器表达式和列表推导式的区别:

1.列表推导式比较耗内存,一次性加载,生成器表达式几乎不占内存,使用的时候才分配和使用内存.

2.得到的值不一样.列表推导式得到的是一个列表,生成器表达式获得的是一个生成器

转载于:https://www.cnblogs.com/liuqingyang/p/9468370.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
列表推导和生成器表达式都是用来创建可迭代对象的工具,但它们在实现和使用上有一些区别。 列表推导是一种创建列表的方法,它允许使用一种简洁的语法来生成一个新的列表。列表推导会立即生成并返回一个完整的列表对象。例如,你可以使用列表推导来将一个列表中的每个元素进行平方运算: ``` numbers = [1, 2, 3, 4, 5] squared_numbers = [x**2 for x in numbers] ``` 在这个例子中,`[x**2 for x in numbers]` 是一个列表推导式,它将 `numbers` 列表中的每个元素进行平方运算,并生成一个新的列表 `squared_numbers`。 生成器表达式也是一种创建可迭代对象的方法,但它返回的是一个生成器对象。生成器表达式使用圆括号而不是方括号,并且它不会立即生成完整的列表,而是按需逐个生成元素。这种延迟计算的特性使得生成器表达式在处理大量数据时更高效。例如,你可以使用生成器表达式来计算一个序列中所有数的平方和: ``` numbers = [1, 2, 3, 4, 5] squared_sum = sum(x**2 for x in numbers) ``` 在这个例子中,`(x**2 for x in numbers)` 是一个生成器表达式,它会逐个生成 `numbers` 列表中的每个元素的平方,并传递给 `sum()` 函数进行求和。 总结来说,列表推导生成一个完整的列表对象,适用于需要一次性处理所有元素的情况;而生成器表达式返回一个生成器对象,适用于需要逐个处理元素或处理大量数据的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值