2016-03-21 12 views
0

Pythonのnoobのに失敗した...私のPythonのリスト内包が原因バージョン3.2.3を使用して、構文エラー

class Card: 
    def __init__(self, suitID, rank): 
      self.suits = ("Spades", "Hearts", "Diamonds","Clubs") 
      self.rank = rank 
      self.suit = self.suits[suitID] 

    def __str__(self): 
      return (str("%s of %s" % (self.rank, self.suit))) 


class Deck: 
    def __init__(self): 
      self.cards = [Card(i//13, i%13) for i in range(52)] 

上記は私が設定のものを持っているかで、私には罰金です。

def __str__(self): 
    print (self.cards [i for i in range (52) ]) 
    return("") 

出力:

File "cardgame.py", line 21 
print (self.cards[i for i in range(52)]) 
        ^
SyntaxError: invalid syntax 
混乱は、以下の(これが唯一のテストのためにあるよう リターン( "")文を無視してください)

ケース1であります

なぜエラーですか?私はそれを使用したかのLCのだと思った...


ケース2:

def __str__(self): 
    print (myCards for myCards in self.cards) 
return ("") 

出力:再び

<generator object <genexpr> at 0x2256fa0> 

、それが何を意味し、そしてなぜそれはデータを出力しないのですか?


ケース3:

def __str__(self): 
    for myCard in self.cards: 
      print (myCard) 
    return ("") 

出力:

0 of Spades 
1 of Spades 
2 of Spades 
3 of Spades 
4 of Spades 
... 
.. 
. 

は、今これは私が欲しいものを正確に出力し、それは私にこれまで以上に混乱します。私は3つのケースすべてが同等であり、明らかにそうではないという印象を受けました。違いは何ですか?

ありがとうございます。

+0

は私のようなアドレスの膨大なリストを提供します:<。__メイン__ 0x1d0c310のカードオブジェクト> [を、<__メイン__カードオブジェクト0x1d0c350で。>、<__メイン__カードオブジェクト0x1d0c390で。>、<0x1d0c3d0で__メイン__カードオブジェクト。 >、<__ main __。Car .............. – DDauS

+0

質問ごとに1つ質問してください。 – TigerhawkT3

答えて

1

ケース1:

あなたは、リストのインデックスとして整数ではなくi for i in range (52)を渡す必要があります。試してくださいprint [self.cards[i] for i in range(52)]self.cardsに52枚しかない場合は、print self.cardsと書くことができます。

ケース2 &ケース3:

(myCards for myCards in self.cards)は、Pythonでgeneratorです。ケース3ではリストのように反復することができますが、最初はすべての要素を返すわけではありませんが、これはジェネレータの重要な機能です。

+0

私はあなたの最初の点を理解しましたが、発電機については理解していませんでした。また、 'print(self.cards)'は私に '' <<__ main __。カードオブジェクト0x1d0c310>、<__ main __。カードオブジェクト0x1d0c350>、<__ main __、カードオブジェクト0x1d0c390>、<__ main __。 0x1d0c3d0>、<__ main __。Cardオブジェクト0x1d0c410>、<__ main __。Ca .... ' – DDauS

+0

@Deedausジェネレータは、括弧で囲まれた' i for i in i(52) 'のような理解度がある場合にのみ得られます。ちょうど 'self.cards'です。 – YCFlame

1

リストの理解は、それが文法であることを学ぶことをお勧めします。

のLi = [1,2,3]

ラ= [I iについてのLiに]#LAは[1,2,3]

LB =(Iためのリストであります#lbはジェネレータオブジェクトであり、リスト(lb)は[1,2,3]

の場合には、print [self.cars[i] for i in range(52)]が動作します。

コード(self.cars[i for i in range(52)])の場合、[i for i in range(52)]はリストなので、self.cars[list objeject]は無効です。

+0

ああ私は少しそれを取得し始めています...おかげで仲間 – DDauS

1

print (self.cards[i for i in range(52)])

あなたは、リストへのインデックスリストを使用しようとしています。これは、次のようなものです。

>>> l = [4,5,6] 
>>> l[i for i in range (3)] 
    File "<stdin>", line 1 
    l[i for i in range (3)] 
0

初めての場合、これはPythonの構文を整理する方法ではありません。

print(self.cards[i for i in range (52)]) 

あなたは別のlistlistをインデックス化しています。それは意味をなさない。これはちょうど新しいlistを作成すること

print([self.cards[i] for i in range(52)]) 

注:あなたはおそらく行うことを意図することは、このでした。 5235要素でlistで動作する式[self.cards[i] for i in range(52)]は、self.cardsと同じ結果を示します。あなたは不要なものを追加し、サークルに入っています。 2番目のケースでは

、これ:

print(myCards for myCards in self.cards) 

はとして表されるジェネレータ式、印刷されている:そのオブジェクトに各項目を印刷し、あなたの第三の場合、について

<generator object <genexpr> at 0x2256fa0> 

オブジェクト自体を印刷するのではなく、上記のジェネレータの式を*で解凍し、カスタムセパレータを指定することができます。

print(*(myCards for myCards in self.cards), sep='\n') 

もちろん、何も理由なくそのlistを再度コピーしています。ただ新しいものを作る時間と努力(あなたとコンピュータの両方)を費やすのではなく、元のものを使用してください。

print(*myCards, sep='\n') 
関連する問題