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