由于语法错误

时间:2016-03-21 03:21:16

标签: python python-3.x list-comprehension

Python noob使用版本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)]

以上是我设置的方式,对我来说似乎很好。混淆如下(请忽略返回("")语句,因为这仅用于测试)

案例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
...
..
.

现在这正是我想要的输出,但这让我更加困惑。我的印象是所有三个案例都是等同的,而且显然不是。有什么区别?

提前致谢。

4 个答案:

答案 0 :(得分:1)

案例1:

您应该传递一个整数而不是i for i in range (52)作为列表的索引。试试print [self.cards[i] for i in range(52)]。如果print self.cards中只有52张卡,你可以写self.cards

案例2&amp;案例3:

(myCards for myCards in self.cards)是Python中的generator。您可以像案例3中的列表一样迭代它,但它最初不会返回其所有元素,这是生成器的一个重要特性。

答案 1 :(得分:1)

是列表理解,你最好学习它的gramar。

  

li = [1,2,3]

     

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

     

lb =(i代表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[list objeject]无效。

答案 2 :(得分: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)]

答案 3 :(得分:0)

对于你的第一个案例,那不是你如何安排Python语法。

<a href="http://www.example.com/news#post-1111">Go back</a>

您正在使用其他print(self.cards[i for i in range (52)]) list编制索引。它没有任何意义。你可能想要做的是:

list

请注意,这只会创建一个新的print([self.cards[i] for i in range(52)]) 。在具有52个元素的list上运行的表达式[self.cards[i] for i in range(52)]list具有相同的结果。你正在添加不必要的东西并进入圈子。

对于你的第二个案例,这个:

self.cards

正在打印一个生成器表达式,表示为:

print(myCards for myCards in self.cards)

对于第三种情况,打印该对象中的每个项目而不是打印对象本身,您可以使用<generator object <genexpr> at 0x2256fa0> 解压缩上面的生成器表达式并指定自定义分隔符:

*

当然,请注意您再次无缘无故地复制print(*(myCards for myCards in self.cards), sep='\n') 。只需使用原始版本,而不是花费时间和精力(包括你的和计算机)制作一个新的。

list