与f字符串相比,%格式化程序有什么好处?

时间:2019-06-29 16:03:24

标签: python f-string

遇到以下代码时,我正在读一口流利的python书

RX

由于这本书是在f弦之前介绍的,所以我认为我可以进行以下替换

def tag(name, *content, cls=None, **attrs):
    """Generate one or more HTML tags"""
    if cls is not None:
        attrs['class'] = cls
    if attrs:
        attr_str = ''.join(' %s="%s"' % (attr, value)
    for attr, value
        in sorted(attrs.items()))
    else:
        attr_str = ''
    if content:
        return '\n'.join('<%s%s>%s</%s>' %
                         (name, attr_str, c, name) for c in content)
    else:
        return f'<{name}{attr_str} />'

这将在新行上返回每个字符。而不是所需的输出: if content: return '\n'.join(f'<{name}{attr_str}>{[c for c in content]}<{name}>')

这里是否需要%格式化程序?可以使用列表理解来实现此输出吗?

1 个答案:

答案 0 :(得分:3)

代替

'<%s%s>%s</%s>' % (name, attr_str, c, name)

您可以使用

f'<{name}{attr_str}>{c}</{name}>'

所以最终您将拥有生成器

f'<{name}{attr_str}>{c}<{name}>' for c in content

代替

'<%s%s>%s</%s>' % (name, attr_str, c, name) for c in content

return '\n'.join( f'<{name}{attr_str}>{c}<{name}>' for c in content )

您还可以使用[]创建列表推导,并使用print()查看所有创建的元素,然后再在join()中使用它们

data = [ f'<{name}{attr_str}>{c}<{name}>' for c in content ]
print(data)
return "\n".join( data )