Python生成器对象和.join
只是关于python和.join()方法的一个基本问题: 上面的代码片段生成了一个很好的输出,以字符串格式存储在一个名为“results”的文件中,逐行显示两个文件之间的差异。但是我注意到,如果我只打印“result”而不使用.join(),编译器将返回一条包含内存地址的消息。在尝试在不使用.join()的情况下将结果写入文件后,编译器通知我,.join()方法中只能使用字符串和字符缓冲区,而不能使用生成器对象。因此,根据我引用的所有证据,如果我错了,请纠正我:Python生成器对象和.join,python,string,list,pointers,generator,Python,String,List,Pointers,Generator,只是关于python和.join()方法的一个基本问题: 上面的代码片段生成了一个很好的输出,以字符串格式存储在一个名为“results”的文件中,逐行显示两个文件之间的差异。但是我注意到,如果我只打印“result”而不使用.join(),编译器将返回一条包含内存地址的消息。在尝试在不使用.join()的情况下将结果写入文件后,编译器通知我,.join()方法中只能使用字符串和字符缓冲区,而不能使用生成器对象。因此,根据我引用的所有证据,如果我错了,请纠正我: result=diff.comp
result=diff.compare(file1.read(),file2.read())
join
是字符串的一种方法。该方法接受任何iterable并对其进行迭代,然后将内容连接在一起。(内容必须是字符串,否则将引发异常。)
如果尝试将生成器对象直接写入文件,则只会获取生成器对象本身,而不是其内容<代码>加入“展开”生成器的内容
您可以看到一个简单的显式生成器的运行情况:
def gen():
yield 'A'
yield 'B'
yield 'C'
>>> g = gen()
>>> print g
<generator object gen at 0x0000000004BB9090>
>>> print ''.join(g)
ABC
def gen():
产生‘A’
收益率“B”
收益率'C'
>>>g=根()
>>>打印g
>>>打印“”。加入(g)
基础知识
发电机一次发出一个内容物。如果你试着看生成器本身,它不会给出任何东西,你只会把它看作“生成器对象”。要获取其内容,需要对其进行迭代。您可以使用for
循环、使用next
函数,或者使用迭代对象的任何其他函数/方法(str.join
)
当你说结果“是一个字符串列表”时,你就接近这个想法了。生成器(或iterable)有点像“潜在列表”。实际上,它不是一次列出所有内容的列表,而是让您一次剥离一个项目
所有对象都不是“内存地址”。生成器对象的字符串表示形式(与许多其他对象的字符串表示形式一样)包含一个内存地址,因此,如果您打印它(如上所述)或将其写入文件,您将看到该地址。但这并不意味着对象“就是”那个内存地址,地址本身也不是真正可用的。它只是一个方便的识别标签,如果你有多个对象,你可以将它们区分开来。你没有内存地址;python为您提供了对象的表示,自定义对象的默认值是显示对象的类型和内存地址。这里仍然有一个对象。请注意,
join
假设iterable只包含/生成字符串。如果不是这样的话,它会抱怨……有趣的事实是:给'.join()
生成器的速度比给'.join()
生成器调用list()
的结果慢<代码>''。join(list(result))比''快。join(result)
@Marcin:消息是:@BrenBarn,太好了,所以。join()基本上是设置一个指针,在生成器上迭代,访问内容并将其邻接。这让我想起了在C中访问字符数组的一种更简单的形式。再次感谢@福比看。检查基准测试,您可能在第一次运行时耗尽了生成器。
def gen():
yield 'A'
yield 'B'
yield 'C'
>>> g = gen()
>>> print g
<generator object gen at 0x0000000004BB9090>
>>> print ''.join(g)
ABC