Python生成器对象和.join

2024-09-29 02:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

关于python和.join()方法的一个基本问题是:

file1 = open(f1,"r")
file2 = open(f2,"r")
file3 = open("results","w")

diff = difflib.Differ()
result = diff.compare(file1.read(),file2.read())
file3.write("".join(result)),

上面的代码片段产生一个很好的输出,以字符串格式存储在一个名为“results”的文件中,逐行显示两个文件之间的差异。但是我注意到,如果我只打印“result”而不使用.join(),编译器将返回包含内存地址的消息。在尝试在不使用.join()的情况下将结果写入文件后,编译器通知我.join()方法中只能使用字符串和字符缓冲区,而不能使用生成器对象。因此,根据我提出的所有证据,如果我错了,请纠正我:

  1. result = diff.compare(file1.read(),file2.read())<;----结果是生成器对象?

  2. result是字符串列表,其中result本身是对第一个字符串的引用?

  3. .join()获取一个内存地址并指向第一个,然后遍历该结构中字符串的其余地址?

  4. 生成器对象是返回指针的对象?

如果我的问题不清楚,我很抱歉,但我基本上想问python老兵我的推断是否正确。我的问题不是关于可观察的结果,而是关于python的内部工作。谢谢你的帮助。


Tags: 文件对象方法字符串read编译器diffresult
1条回答
网友
1楼 · 发布于 2024-09-29 02:22:23

join是一种字符串方法。该方法接受任何iterable并对其进行迭代,然后将内容连接在一起。(内容必须是字符串,否则将引发异常。)

如果尝试将生成器对象直接写入文件,则只会获取生成器对象本身,而不是其内容。join“展开”生成器的内容。

您可以看到一个简单的显式生成器的情况:

def gen():
    yield 'A'
    yield 'B'
    yield 'C'

>>> g = gen()
>>> print g
<generator object gen at 0x0000000004BB9090>
>>> print ''.join(g)
ABC

发电机一次一个地放出里面的东西。如果你试着观察生成器本身,它不会释放任何东西,你只是把它看作“生成器对象”。要了解它的内容,需要对其进行迭代。你可以通过一个for循环、一个next函数或者任何其他迭代事物的函数/方法(其中有str.join)来实现。

当你说结果“是一个字符串列表”时,你就接近了这个想法。生成器(或iterable)有点像“潜在列表”。它不是一次把所有的内容都列成一个列表,而是让你一次一个地把每一个项目剥离。

没有一个对象是“内存地址”。生成器对象(与许多其他对象一样)的字符串表示形式包含一个内存地址,因此,如果您将其打印(如上所述)或将其写入文件,您将看到该地址。但这并不意味着对象“就是”那个内存地址,而地址本身也不是真正可用的。这只是一个方便的识别标签,如果你有多个对象,你可以把它们分开。

相关问题 更多 >