m0_56035801 2021-03-19 20:55 采纳率: 75%
浏览 29
已采纳

遍历时使用sorted排序并调用类的方法出现NameError

import collections
from random import choice

Card = collections.namedtuple('Card',['rank', 'suit'])


class FrenchDeck:
   ranks = [str(n) for n in range(2,11)] + list('JQKA')
   suits = 'spades diamonds clubs hearts'.split()

   def __init__(self):
      self._cards = [Card(rank, suit) for suit in self.suits
                              for rank in self.ranks]

   def __len__(self):
      return len(self._cards)

   def __getitem__(self, position):
      return self._cards[position]

   suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)


   def spades_high(card):
      rank_value = FrenchDeck.ranks.index(card.rank)
      return rank_value * len(suit_values) + suit_values[card.suit]


deck = FrenchDeck()


for card in sorted(deck, key=spades_high): #doctest: +ElLIPSIS
   print(card)

如图所示

输出错误

Traceback (most recent call last):
  File "C:/Users/86199/Desktop/wqe.py", line 32, in <module>
    for card in sorted(deck, key=spades_high): #doctest: +ElLIPSIS
NameError: name 'spades_high' is not defined

Process finished with exit code 1
  • 写回答

1条回答 默认 最新

  • herosunly Python领域优质创作者 2021-03-19 21:21
    关注

    suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)和spades_high应该是写到FrenchDeck外面,完全代码如下所示:

    import collections
    
    Card = collections.namedtuple('Card', ['rank', 'suit'])
    
    class FrenchDeck:
    
        ranks = [str(n) for n in range(2, 11)] + list('JQKA')
        suits = 'spades diamonds clubs hearts'.split()
    
        def __init__(self):
            self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
    
        def __len__(self):
            return len(self._cards)
    
        def __getitem__(self, position):
            return self._cards[position]
    
    suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)
    
    def spades_high(card):
        rank_value = FrenchDeck.ranks.index(card.rank)
        return rank_value * len(suit_values) + suit_values[card.suit]
    
    deck = FrenchDeck()
    for card in sorted(deck, key=spades_high): #doctest: +ElLIPSIS
        print(card)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错