标签:语言 ret print support line project collect file 动态语言
class Vector2d:
typecode = ‘d‘
def __init__(self,x,y):
self.__x = float(x)
self.__y = float(y)
@property
def x(self):
return self.__x
@property
def y(self):
return self.__y
def __iter__(self):
return (i for i in (self.x,self.y))
from random import shuffle
l = list(range(10))
shuffle(l)
print(l) #[1, 7, 0, 8, 5, 2, 9, 4, 6, 3]
tuple1 = (1,2)
#shuffle(tuple1)
‘‘‘
Traceback (most recent call last):
File "C:/Users/wangxue1/PycharmProjects/fluentPython/fromxieyiToChouxiangjilei/__init__22.py", line 21, in <module>
shuffle(tuple1)
File "C:\Python36\lib\random.py", line 274, in shuffle
x[i], x[j] = x[j], x[i]
TypeError: ‘tuple‘ object does not support item assignmen
‘‘‘
#这个错误信息相当明确。问题原因是,shuffle函数要调换集合中元素的位置,而tuple只实现了不尅版序列协议。可变的序列还必须提供__setitem__方法。
#Python是动态语言,因此我们可以在运行时修正这个问题,甚至还可以在交互式控制台中,
#栗子11-6 为FrenchDeck打猴子补丁(运行时修改,不改源码),把他变成可变的,让random.shuffle函数能处理
from random import shuffle
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 rank in self.ranks for suit in self.suits]
def __len__(self):
return len(self._cards)
def __getitem__(self, item):
return self._cards[item]
def set_card(deck,position,card):
deck._cards[position] = card
FrenchDeck.__setitem__ = set_card
deck = FrenchDeck()
shuffle(deck)
print(deck[:5])
【Python】【fromxieyiToChouxiangjilei】
标签:语言 ret print support line project collect file 动态语言
原文地址:http://www.cnblogs.com/suren2017/p/7662418.html