朝闻道

作者: ChronosAeon | 来源:发表于2018-03-28 09:36 被阅读0次

    将两个嵌套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形式参数传递了一个随机数获得返回值。

    相关文章

      网友评论

        本文标题:朝闻道

        本文链接:https://www.haomeiwen.com/subject/tqfycftx.html