【python高级编程】namedtuple用法--给元组中的每个元素命名

为什么要给元组中的每个元素命名

给每个元组中的元素命名,我们就可以使用名字去访问对应元素,相对于索引访问,这样可以大大提高程序的可读性。


使用元组赋值法

在c语言中,我们可以定义常量来命令,或者使用枚举变量来完成,而在python中,可以使用元组赋值法进行。
假设我们有一个元组,从0-2的索引分别对饮与,NAME,AGE,GRADE,我们可以用以下方式去完成:

NAME, AGE, GRADE = range(0, 3

使用namedtuple

namedtuplecollections模块中的一个工厂函数,使用此函数可以创建一个可读性更强的元组。
调用该函数后,它会返回一个tuple类型的子类(python的基本数据类型都是类),这个子类的中文名称为具名元组

在使用普通的元组时,我们只能通过索引下标去访问对应元素,而namedtuple,我们既可以使用索引下标去访问,也可以通过名字去访问,增加了代码的可读性。

另外,我们也不用去考虑性能问题,因为具名元组和普通元组所需要的内存空间相同

下面我们来看namedtuple方法的参数。
下面是2个必传参数,typenamefield_names,一般我们只会用到这两个参数。

typename: 参数类型为字符串,具名元组返回一个元组子对象,我们要为这个对象命名,传入typename参数即为子对象的名称。

field_names: 参数类型为字符串序列,用于为创建的元组的每个元素命名,可以传入像[‘a’, ‘b’]这样的序列,也可以传入'a b''a, b'这种被分割字符分割的单字符串,但必须是合法标识符。

from collections import namedtuple

Student = namedtuple("Student", ['name', 'age', 'grade'])
d1 = Student("小明", 18, 100)
d2 = Student(name="小王", grade=99, age=18) # 函数的指定具体参数名传参
print(d1)
print(d2)
print(d1[0]) # 可通过索引访问
print(d2.name)  # 可通过属性名访问

注:具名元组在存储csv或者sqlite3返回数据的时候特别有用。


使用具名元组创建一副纸牌

import collections
# 将纸牌定义为具名元组,每个纸牌都有等级和花色
Card = collections.namedtuple('Card', 'rank suit')

class FrenchDeck:
    # 等级2-A
    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 __getitem__(self, position):
        return self._cards[position]

>>> french_deck = FrenchDeck()
>>> french_deck[0]
Card(rank='2', suit='spades')
>>> french_deck[0].rank
'2'
>>> french_deck[0].suit
'spades'

你可能感兴趣的:(python高级编程)