码迷,mamicode.com
首页 > 编程语言 > 详细

【Python】【fromxieyiToChouxiangjilei】

时间:2017-10-13 19:15:00      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:语言   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!