我能在string.format方法中使用for循环吗?

3
我将尝试将列表写入文件。当我使用以下代码时,它会给我一个错误:
    with open('list.txt', 'w') as fref :
        fref.writelines('{}\n'.format(item for item in item_list))

但是,当我修改这段代码为:

    with open('list.txt', 'w') as fref :
        for item in item_list :
            fref.writelines('{}\n'.format(item))

当我使用%格式化字符串时:

    with open('list.txt', 'w') as fref :
        fref.writelines('%s\n' % item for item in item_list)

它正常工作。我不明白为什么format方法内部的for循环失败了?


3
{}是一种基于位置的格式。您不能为一个位置提供多个字符串。如果您检查第三个位置,它与第二个位置相同,您只是向writelines函数传递多行字符串。 - thuva4
后两者的等效格式表达式为'{}\n'.format(item) for item in item_list。请注意,应用格式化的方式是在生成器表达式内部,而不是反过来。 - MisterMiyagi
1个回答

4
    with open('list.txt', 'w') as fref :
        fref.writelines('%s\n' % item for item in item_list)

可以这样理解(注意括号):

    with open('list.txt', 'w') as fref :
        fref.writelines(('%s\n' % item) for item in item_list)

要通过 file.writelines 方法传递一个生成器表达式,其中每个项都是一个格式化字符串。

但是:

    with open('list.txt', 'w') as fref :
        fref.writelines('{}\n'.format(item for item in item_list))

创建一个参数的生成器表达式,将被发送1次到str.format方法。

相反,创建一个生成器表达式,在item_list中每个项上调用str.format

    with open('list.txt', 'w') as fref :
        fref.writelines('{}\n'.format(item) for item in item_list)

现在,file.writelines 接收字符串生成器表达式作为参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接