最近,我从一本python书中遇到了这段list comprehension
代码:
['%s="%s"' % item for item in attrs.items()]
在传递'attrs = {'size':'large', 'quantity':6}
时会产生['size="large"', 'quantity="6"']
作为输出。但是我对于哪个变量捕获键,哪个变量捕获值感到困惑。
我了解到attrs.items()
将产生包含2-tuples
和keys
的{{1}},但是只有一个变量(values
)可以捕获它,那怎么运作的呢?有人可以分开说明在这里发生了什么魔术吗?这更加复杂,因为这里同时还存在一些字符串格式。
答案 0 :(得分:3)
print "%s %s %s %s" % ("It","works","like","this")
输出:
It works like this
但是您可能应该在2.7+上切换到str.format()
语法:
https://docs.python.org/2/library/string.html#format-string-syntax
print ( "{} {} {} {}".format("It","works","like","this") )
以及在Python 3.6+中的f-strings
:
https://docs.python.org/3/tutorial/inputoutput.html#formatted-string-literals
print ( f"{'It'} {'works'} {'like'} {'this'}" # makes no sense - but for consistency sake
您可能还想访问https://pyformat.info/,以获取关于如何正确设置格式的信息。
答案 1 :(得分:3)
item
是一个由键和值组成的元组:
>>> for item in attrs.item():
... print item
('size', 'large')
('quantity', 6)
由于item
是一个元组,它可以直接用作%
的右侧参数,并且其元素按格式字符串顺序使用。
>>> "%s=%s" % item # equivalent to "%s=%s" % ('size', 'large'), for example
"size=large"
(这就是为什么如果您不确定参数不是元组,建议始终对%
使用 expitit 元组的原因。例如,如果foo=('a', 'b')
,则"%s" % foo
会产生错误,但是"%s" % (foo,)
会产生"('a', 'b')"
,这可能是预期的。)
答案 2 :(得分:1)
items()
返回key, value
的元组,然后该元组作为参数传递给%
运算符,因此它被用来替换字符串中的占位符。