Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python生成器对象和.join_Python_String_List_Pointers_Generator - Fatal编程技术网

Python生成器对象和.join

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

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

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


  • 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