4

私はpython2.7を使用していますが、タプルによるpythonの文字列補間の背後にある理由が何であるか疑問に思っていました。TypeErrorsこの小さなコードを実行するときに、私は追いついていました:

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

そのため、エラーの発生元である 4 行目を次のように変更する必要があることがわかりました。

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

%sタプル スライスの各項目に 1 つずつ、2 つの演算子を使用します。この行で何が起こっているのかを調べていたときに、 a を追加したところ、次のprint type(self.dealer[:2])ようになりました。

<type 'tuple'> 

私が予想したように、スライスされていないタプルのようなPlayer has %s and total %d." % (self.player,self.player_total)形式はうまくいき、スライスされたタプルself.dealer[:2]はうまくいかないのはなぜですか? それらは両方とも同じ型ですが、スライス内のすべての項目を明示的にフォーマットせずにスライスを渡さないのはなぜですか?

4

3 に答える 3

6

文字列補間には、タプル引数の各要素のフォーマット コードが必要です。代わりに、文字列の新しい.formatメソッドを使用できます。

>>> dealer = ('A','J','K')
>>> print 'Dealer has {} showing'.format(dealer[:2])
Dealer has ('A', 'J') showing

ただし、1 つの引数を使用すると、タプルの文字列表現が括弧とコンマと共に出力されることに注意してください。タプルのアンパックを使用して引数を個別に送信できますが、その場合は 2 つのフォーマット プレースホルダーが必要になります。

>>> print 'Dealer has {} {} showing'.format(*dealer[:2])
Dealer has A J showing

Python 3.6 の時点で、f-strings があります。中括弧内に式を配置できます。

>>> dealer = ('A','J','K')
>>> print(f'Dealer has {dealer[0]} {dealer[1]} showing')
Dealer has A J showing
于 2012-08-24T01:45:51.083 に答える
5

スライスに問題はありません。要素数が正しくないタプル リテラルを渡すと、同じエラーが発生します。

"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],)
于 2012-08-24T01:44:24.053 に答える
3

あなたのエラーは、2 番目のフォーマット操作で、間違った数の引数を渡しているという事実に起因しています。

行う

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

また

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

また

"dealer has %s showing" % self.dealer[0] #or self.dealer[1]

タプルリテラルを使用しないこととは関係ありません。

于 2012-08-24T01:39:28.220 に答える