朝闻道

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 字符串格式化调用方法 —— format 通过创建字符串模板,利用format函数,替代相应的值。 可以通过绝对位...
    plutoese阅读 1,552评论 0 47
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 19,084评论 17 410
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,814评论 0 9
  • 朋友圈里看到同学的现状,不禁有些自卑,因为她们实在是太优秀。拿奇奇来说,不仅家境好,还是一个美女学霸,每年拿奖学金...
    沐清小寨阅读 339评论 0 0
  • 跟服装学院的学生一起上课十分有趣 在这个艺术院校 纪律好像并不存在 每节课都会有好几个同学翘课 迟到也在半数以上 ...
    梁绛阅读 370评论 0 1