朝闻道

将两个嵌套for循环写成一个列表生成式
如,有一个嵌套列表,a=[[1,2],[3,4],[5,6]],要提取列表里的每一个元素

用for循环处理:

for i in a:  
    for j in i:  
        print(j)  
b=[j for i in a for j in i]#注意两个for的顺序  
print(b)
>>> b  
[1, 2, 3, 4, 5, 6]  

然后在看下面这一段来自流畅的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 suit in self.suits
                                for rank in self.ranks]
    def __len__(self):
        return len(self._cards)
    def __getitem__(self, position):
        return self._cards[position]
>>> beer_card = Card('7', 'diamonds')
>>> beer_card
Card(rank='7', suit='diamonds')

里面生成构造函数生成self._cards时候巧妙使用列表生成器,并且重写了这个类的len方法,和getitem方法.

要是想完成随机抽牌的功能,这里就不用重复造轮子了,random模块给了我们choice方法。

card = FrenchDeck()
print(choice(card))

但是笔者在这里有一个疑问,为什么choice可以对类使用,如果类里面有多个数组那随机的是那一个呢?
于是我做了一个实验

    def __getitem__(self, position):
        print('getitem called')
        return self._cards[position]

不出所料,其实choice方法就是给这个函数的position形式参数传递了一个随机数获得返回值。

你可能感兴趣的:(朝闻道)