Python生成器对象和.join

eaz*_*001 13 python string pointers list generator

关于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)),
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

如果我的问题不清楚,我道歉,但我基本上想问问python退伍军人,如果我的扣除是正确的.我的问题不是关于可观察的结果,而是更多关于python的内部工作原理.我感谢你的所有帮助.

Bre*_*arn 30

join是一种字符串的方法.该方法采用任何迭代并迭代它并将内容连接在一起.(内容必须是字符串,否则会引发异常.)

如果您尝试将生成器对象直接写入文件,您将只获取生成器对象本身,而不是其内容. join"展开"发电机的内容.

你可以看到一个简单的显式生成器会发生什么:

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

>>> g = gen()
>>> print g
<generator object gen at 0x0000000004BB9090>
>>> print ''.join(g)
ABC
Run Code Online (Sandbox Code Playgroud)

发电机一次发出一个内容.如果您试图查看生成器本身,它不会发生任何事情,您只是将其视为"生成器对象".要获取其内容,您需要迭代它们.您可以使用for循环,next函数或任何其他迭代事物的函数/方法(str.join其中)来完成此操作.

当你说结果"是一个字符串列表"时,你就会接近这个想法.生成器(或可迭代的)有点像"潜在列表".取而代之的居然其所有内容的列表中的所有一次,它可以让您一次剥离各项目之一.

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

  • 有趣的事实:给'''.join()`一个生成器*比给'.'.join()`生成器上调用`list()`的结果慢*.`''.join(list(result))`比`''.join(result)`快. (9认同)
  • 请注意,`join`假定iterable包含/仅产生字符串.如果不是这样,它会抱怨...... (2认同)