详解Python中的生成器表达式(generator expression)

  

  介绍

    1、生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列表推导式所使用的方括号(square brackets)。

    2、与列表推导式最大的不同是,生成器推导式的结果是一个生成器对象。生成器对象类似于迭代器对象,具有惰性求值的特点,只在需要时生成新元素,比列表推导式具有更高的效率,空间占用非常少,尤其适合大数据处理的场合。

    3、使用生成器对象的元素时,可以根据需要将其转化为列表或元组,也可以使用生成器对象的next()方法或者内置函数next()进行遍历,或者直接使用for循环来遍历其中的元素。但是不管用哪种方法访问其元素,

      只能从前往后正向访问每个元素,不能再次访问

    4、已访问过的元素,也不支持使用下标访问其中的元素。当所有元素访问结束以后,如果需要重新访问其中的元素,必须重新创建该生成器对象,enumerate、filter、map、zip等其他迭代器对象也具有同样的特点。

  

  

#1、创建生成器对象
g = ((i+2)**2 for i in range(10))
print g
#<generator object <genexpr> at 0x0000000003517798>

#2、将生成器对象转换为元组
a = tuple(g)
print a
#(4, 9, 16, 25, 36, 49, 64, 81, 100, 121)

#3、生成器对象已遍历结束,没有元素了
print list(g)
#[]

#4、重新创建生成器对象
g = ((i+2)**2 for i in range(10))

#5、使用生成器对象的next()方法获取元素
print g.next()
# 4
print g.next()
# 9

# 6、使用函数next()获取生成器对象中的元素
print next(g)
# 16

g = ((i+2)**2 for i in range(10))

#7、使用循环直接遍历生成器对象中的元素
for item in g:
    print item

#8、 filter对象也具有类似的特点
x = filter(None, range(20))
print x
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

#9、map对象也具有类似的特点
x = map(str, range(20))
print x
# [‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘10‘, ‘11‘, ‘12‘, ‘13‘, ‘14‘, ‘15‘, ‘16‘, ‘17‘, ‘18‘, ‘19‘]
时间: 2024-10-25 17:06:18

详解Python中的生成器表达式(generator expression)的相关文章

详解Python中yield生成器的用法

yield是生成的意思,但是在python中则是作为生成器理解,生成器的用处主要可以迭代,这样简化了很多运算模型(还不是很了解是如何简化的). yield是一个表达式,是有返回值的. 当一个函数中含有yield时,它不再是一个普通的函数,而是一个生成器.当该函数被调用时不会自动执行,而是暂停, 参考:http://www.aichengxu.com/view/64610  见第一个例子: 例1: >>> def mygenerator(): ... print 'start...' ..

详解Python中re.sub--转载

[背景] Python中的正则表达式方面的功能,很强大. 其中就包括re.sub,实现正则的替换. 功能很强大,所以导致用法稍微有点复杂. 所以当遇到稍微复杂的用法时候,就容易犯错. 所以此处,总结一下,在使用re.sub的时候,需要注意的一些事情. 解释具体的注意事项之前,先把其具体的解释贴出来: re.sub re.sub(pattern, repl, string, count=0, flags=0) Return the string obtained by replacing the

举例详解Python中的split()函数的使用方法

这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)os.path.split():按照路径将文件名和路径分割开 一.函数说明1.split()函数语法:str.

python中的生成器(generator)总结

1.实现generator的两种方式 python中的generator保存的是算法,真正需要计算出值的时候才会去往下计算出值.它是一种惰性计算(lazy evaluation). 要创建一个generator有两种方式. 第一种方法:把一个列表生成式的[]改成(),就创建了一个generator: >>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>

详解 Python 中的下划线命名规则

在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单下划线(_)会在以下3种场景中使用: 1.1 在解释器中: 在这种情况下,“_”代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准CPython解释器采用,然后其他类型的解释器也先后采用. >>> _ Traceback (most recent call last): Fil

详解Python中的join()函数的用法

函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下:     join():    连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串     os.path.join():  将多个路径组合后返回 一.函数说明 1.join()函数 语法:  'sep'.join(seq) 参数说明 sep:分隔符.可以为空 seq:要连接的元素序列.字符串.元组.字典 上面的语法即:以sep作为分隔符,将s

详解Python中的相对导入和绝对导入

Python 相对导入与绝对导入,这两个概念是相对于包内导入而言的.包内导入即是包内的模块导入包内部的模块. Python import 的搜索路径 在当前目录下搜索该模块 在环境变量 PYTHONPATH 中指定的路径列表中依次搜索 在 Python 安装路径的 lib 库中搜索 Python import 的步骤 python 所有加载的模块信息都存放在 sys.modules 结构中,当 import 一个模块时,会按如下步骤来进行 如果是 import A,检查 sys.modules 

详解定时任务中的 cron 表达式

1.前言 我们经常使用 cron 表达式来定义定时任务的执行策略,今天我们就总结一下 cron 表达式的一些相关知识. 2. cron 表达式的定义 cron 表达式是一个字符串,该字符串由 6 个空格分为 7 个域,每一个域代表一个时间含义. 格式如下: [秒] [分] [时] [日] [月] [周] [年] 通常定义 "年" 的部分可以省略,实际常用的由 前六部分组成 2.1 cron各部定义 关于 cron 的各个域的定义如下表格所示: 域 是否必填 值以及范围 通配符 秒 是

python中的生成器

python中的生成器其实就是一个特殊的迭代器,相比于每次迭代获取数据获得(通过next()函数)时生成元素,迭代的位置,数值返回等都需要我们设计.我们可以采用更加简洁的语法即生成器(generator). 通过列表生成式,我们可以直接创建一个列表.但是,如果我们说我们可能会通过算法根据前面的999999个数推出100w个数,但是我们此时只需要使用到前几个数,那么通过列表保存100w个数来备用就会用到巨大的空间.而我们却不一定会用到第100w个数,白白浪费了庞大的空间.因此我们就需要用到了生成器