2017-10-01 1 views
-1

私は['jelly%s'% x*x for x in range(1,11)]が私にjellyx * xのリストを与えると期待していましたが、以下の値を返しました。リスト内包表記のこの繰り返しで私のロジックに何が問題になっていますか?

['jelly1', 'jelly2jelly2', 'jelly3jelly3jelly3', 'jelly4jelly4jelly4jelly4', 'jelly5jelly5jelly5jelly5jelly5', 'jelly6jelly6jelly6jelly6jelly6jelly6', 'jelly7jelly7jelly7jelly7jelly7jelly7jelly7', 'jelly8jelly8jelly8jelly8jelly8jelly8jelly8jelly8', 'jelly9jelly9jelly9jelly9jelly9jelly9jelly9jelly9jelly9', 'jelly10jelly10jelly10jelly10jelly10jelly10jelly10jelly10jelly10jelly10'] 

コードには何が問題なのですか?

答えて

3

問題は式である:%*オペレーターがsame precedenceを持っているので

('jelly%s'%x)*x 

'jelly%s'% x*x 

これは同等です。

優先順位は、演算子が式で最初に評価されることを意味します。より高い優先順位を持つ演算子は、より低い優先順位を持つ演算子の前に "バインド"し、等しい優先順位を持つ演算子は左から右に評価されます。

>>> 1 + 10 * 10 # * has higher precedence 
101 
>>> (1 + 10) * 10 # we can force + to happen first 
110 

算術演算子は、数学の算術演算子に特有の優先順位があります。

そして最後に、あなたは知らないかもしれないが、strを含ん配列タイプ(、listtupleで、*オペレータはそう、 "repitition操作を" 原因:

>>> 'juan'*1 
'juan' 
>>> 'juan'*2 
'juanjuan' 
>>> 'juan'*3 
'juanjuanjuan' 

だから、何を取得するには

['jelly%s'% (x*x) for x in range(1,11)] 

また、あなたは、文字列に.formatメソッドを使用することができます:あなたがしよう、したいです0

>>> ['jelly{}'.format(x*x) for x in range(1,11)] 
['jelly1', 'jelly4', 'jelly9', 'jelly16', 'jelly25', 'jelly36', 'jelly49', 'jelly64', 'jelly81', 'jelly100'] 

またはそれ以上であっても、Pythonの3.6で、F-文字列を使用します。

>>> [f'jelly{x*x}' for x in range(1,11)] 
['jelly1', 'jelly4', 'jelly9', 'jelly16', 'jelly25', 'jelly36', 'jelly49', 'jelly64', 'jelly81', 'jelly100'] 
+0

ねえ、それは本当です!それでも私はあなたが '同じ優先順位を持っている'ということを理解していません。私は論理的な順序が私の表現で間違っていたが、それはなぜそのような結果になったのですか?ありがとう! – XYlaven

+0

@XYlavenああはい、私はさらに説明を追加します。 –

+0

@XYlaven詳細を追加しました –

2

をまた行うことができます。

['jelly%s' % num for num in [x*x for x in range(1,11)]] 

が得られます:ここで

OUT : ['jelly1', 'jelly4', 'jelly9', 'jelly16', 'jelly25', 'jelly36', 'jelly49', 'jelly64', 'jelly81', 'jelly100'] 

[x*x for x in range(1,11)]]あなたの文字列に使用する[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]を与えます。

オペレータコード(オペレータ*および%precedenceのため)の動作の詳細については、Juanpa's answerを参照してください。

+0

thxはたくさんありますが、なぜ私のコードがそのように機能するのか説明できますか? – XYlaven

+0

これは[Juanpa](https://stackoverflow.com/a/46509568/7550472)の説明です。'precedence'のために –

+0

ok私はこのコンセプトをチェックします; thx;) – XYlaven

関連する問題