簡體   English   中英

我的python列表理解由於語法錯誤而失敗

[英]My python list comprehension fails due to a syntax error

使用3.2.3版的Python noob ...

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)]

以上是我的設置方法,對我來說似乎不錯。 以下是混淆(請忽略return(“”)語句,因為這僅用於測試)

情況1:

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

為什么會出錯? 我以為那是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
...
..
.

現在,這恰好輸出了我想要的東西,但這使我更加困惑。 我的印象是,這三種情況都是等效的,而顯然不是。 有什么區別?

提前致謝。

情況1:

您應該將整數(而不是i for i in range (52)傳遞i for i in range (52)中的i for i in range (52)作為列表的索引。 嘗試print [self.cards[i] for i in range(52)] 如果print self.cards中只有52張卡,則可以寫出print self.cards self.cards

情況2和情況3:

(myCards for myCards in self.cards)是Python中的生成器 您可以像案例3中的列表一樣對其進行迭代,但是一開始它不會返回其所有元素,這是生成器的重要功能。

是列表理解,您最好學習它的語法。

li = [1,2,3]

la = [i for i in li]#la是一個列表[1,2,3]

lb =(i對i in li)#lb是一個生成器對象,list(lb)是[1,2,3]

在情況1中,可以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[i for i in range(52)])[i for i in range(52)]是一個列表,因此self.cars[list objeject]無效。

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)]

對於第一種情況,這不是安排Python語法的方式。

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

你是一個索引list與另一個list 這沒有任何意義。 您可能打算做的是:

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

請注意,這只是創建一個新list 在具有52個元素的list上運行的表達式[self.cards[i] for i in range(52)]具有與self.cards相同的結果。 您正在添加不必要的內容並轉圈。

對於第二種情況,這是:

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM