O'Reilly的学习Python强大的面向对象编程由Mark Lutz教授不同的格式化字符串的方法。
以下代码让我感到困惑。我将'ham'解释为在索引零处填充格式位置标记,但它仍然在输出字符串的索引1处弹出。请帮助我了解实际情况。
以下是代码:
template = '{motto}, {0} and {food}'
template.format('ham', motto='spam', food='eggs')
这是输出:
'spam, ham and eggs'
我期待:
'ham, spam and eggs'
答案 0 :(得分:2)
您唯一需要了解的是{0}
是指发送给format()
的第一个(零)未命名的参数。我们可以通过删除所有未命名的引用并尝试使用线性填充来看到这种情况:
>>> "{motto}".format("boom")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'motto'
如果这是它的工作原理,你会期望'繁荣'会填补'座右铭'。但是,相反,format()
会查找名为'座右铭'的参数。这里的关键提示是KeyError
。同样,如果只是将参数序列传递给format()
,那么这也不会出错:
>>> "{0} {1}".format('ham', motto='eggs')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
这里,format()
正在查找参数列表中的第二个未命名参数 - 但这不存在,因此它会得到'元组索引超出范围'错误。这只是在Python中传递的未命名(位置敏感)和命名参数之间的区别。