在 class 中使用 namedtuple

Using namedtuple in class

我正在练习 O'Reily 书中的一段代码 Fluent Python.

这段代码如下:

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 rank in self.ranks
                                            for suit in self.suits]
        def __len__(self):
            return len(self._cards)

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

我可以看到如何使用 namedtuple 的功能将等级中的每个值分配给所有花色。

作为我自己的实践之一,想请教一下这个范式中的赋值问题。具体来说,在这个片段中,不是给一个学生四个等级,而是使用 namedtuple 功能为一个学生分配他们各自唯一的等级的方法是什么? (例如 John-89、Jay-98、Joe-87、Joseph-91)。我从书中示例中反省的方式仍然会将所有成绩分配给每个学生。非常感谢您的关注和帮助!

Student= collections.namedtuple('Student',['name','grade'])

studentname=["John","Jay","Joe","Joseph"]

class grade: 
    names= studentname
    grades=[89,98,87,91]

    def __init__(self):
        self._stud=[
        Student(name,grade) for name in self.names 
                            for grade in self.grades ]  

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

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

这与命名元组没有任何关系。使用卡片,您使用 rankssuits.

product 的每个元素创建了一个新的 Card 实例

对于 grade,您想使用 zipping names 和 [= 的结果中的每个元素创建一个新的 Student 实例17=]在一起。

def __init__(self):
    self._stud=[Student(name,grade) 
                for name, grade in zip(self.names, self.grades)]

在书中的代码中,每套西装都有每一种价值——它是西装和价值的笛卡尔乘积。在您的代码中,您只需要从学生到成绩的一对一映射。这通常使用 zip() 完成。您可以使用 zip(self.names, self.grades) ,这将为您提供相应的对。然后,您可以使用

获得 Students 的列表
self._stud=[Student(n, g) for n, g in zip(self.names, self.grades)]

您也可以制作 class,这样它就不会依赖于全局变量,而是采用类似以下内容的学生和成绩列表:

import collections

Student = collections.namedtuple('Student',['name','grade'])

studentname = ["John","Jay","Joe","Joseph"]
grades = [89,98,87,91]

class Grades: 
    def __init__(self, names, grades):
        self._stud = [Student(n, g) for n, g in zip(names, grades)]

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

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

g = Grades(studentname, grades)

g._stud 将是:

[
  Student(name='John', grade=89),
  Student(name='Jay', grade=98),
  Student(name='Joe', grade=87),
  Student(name='Joseph', grade=91)
]