使用元组切片的Python字符串插值?

使用元组切片的Python字符串插值?,python,tuples,string-interpolation,Python,Tuples,String Interpolation,我正在使用python2.7,我想知道pythons字符串插入元组背后的原因是什么。我在编写这一小段代码时遇到了类型错误: def show(self): self.score() print "Player has %s and total %d." % (self.player,self.player_total) print "Dealer has %s showing." % self.dealer[:2] 印刷品: Player has ('diamond',

我正在使用python2.7,我想知道pythons字符串插入元组背后的原因是什么。我在编写这一小段代码时遇到了
类型错误

def show(self):
    self.score()
    print "Player has %s and total %d." % (self.player,self.player_total)
    print "Dealer has %s showing." % self.dealer[:2]
印刷品:

Player has ('diamond', 'ten', 'diamond', 'eight') and total 18
Traceback (most recent call last):
File "trial.py", line 43, in <module>
    Blackjack().player_options()
  File "trial.py", line 30, in player_options
    self.show()
  File "trial.py", line 27, in show
    print "Dealer has %s showing." % (self.dealer[:2])
TypeError: not all arguments converted during string formatting
使用两个
%s
运算符,元组切片中的每个项一个。当我检查这一行的情况时,虽然我添加了一个
打印类型(self.dealer[:2])
,但会得到:

<type 'tuple'> 


正如我所料,为什么像
播放器这样的非切片元组有%s和总数%d.“%(self.Player,self.Player\u total)
格式很好,切片元组
self.dealer[:2]
not?它们都是同一类型,为什么不在不显式格式化切片中的每个项目的情况下传递切片?

您的错误源于这样一个事实,即在第二次格式化操作中,您传递的参数数量不正确


这与不使用元组文字无关。

切片没有问题。当传递元素数不正确的元组文字时,也会出现相同的错误

"Dealer has %s showing." % self.dealer[:2]
同:

"Dealer has %s showing." % (self.dealer[0], self.dealer[1])
这显然是一个错误

因此,如果您希望格式化
self.dealer[:2]
而不进行元组解包:

"Dealer has %s showing." % (self.dealer[:2],)

字符串插值要求元组参数的每个元素都有一个格式代码。您可以改为使用新的
.format
字符串方法:

>>> dealer = ('A','J','K')
>>> print 'Dealer has {} showing'.format(dealer[:2])
Dealer has ('A', 'J') showing
但请注意,使用一个参数可以打印元组的字符串表示形式,以及括号和逗号。可以使用元组解包来分别发送参数,但需要两个格式占位符

>>> print 'Dealer has {} {} showing'.format(*dealer[:2])
Dealer has A J showing
从Python 3.6开始,有f字符串。表达式可以放在大括号中:

>>> dealer = ('A','J','K')
>>> print(f'Dealer has {dealer[0]} {dealer[1]} showing')
Dealer has A J showing

这是有道理的,谢谢。我误解了发生的事情。我认为当传递元组切片时,它是一个更小的整元组,而不是传递两个单独的参数。这就是发生的事情,对吗?你从来不会传递“两个单独的参数”。语法上
“string”%(foo,bar)
是一个包含
%
二进制运算符的表达式,具有两个文字操作数-字符串和元组。即使在著名的pythonic
a,b=b,a
中,也可以使用元组进行操作。字符串插值只是字符串的一个
%
运算符重载。当您第一次发布时,
TypeError
关于参数的数量还有你的评论,我仍然不知道元组切片被分解为两个独立的参数,而不是一个“完整”的元组切片。当@Eldar Abusalimov发布时,我终于意识到我的错误。你所忍受的
.format
是Python3实现这一点的常用方法,对吗?是的,但它也被后移植到Python2.6及以上版本。早期版本(3.0和2.6,我相信}不支持
{}
,而是支持
{0}
来指示位置参数的位置。
.format
在新代码中是首选的。
"Dealer has %s showing." % (self.dealer[:2],)
>>> dealer = ('A','J','K')
>>> print 'Dealer has {} showing'.format(dealer[:2])
Dealer has ('A', 'J') showing
>>> print 'Dealer has {} {} showing'.format(*dealer[:2])
Dealer has A J showing
>>> dealer = ('A','J','K')
>>> print(f'Dealer has {dealer[0]} {dealer[1]} showing')
Dealer has A J showing