疯狂Python讲义第八章练习

爱⌒轻易说出口 提交于 2020-01-31 04:43:54
# -*- coding: utf-8 -*-
'''
Created on 2020年1月29日

@author: insisted_search
1. 自定义 一个序列,该序列按顺序包含 52 张扑克牌,分别是黑桃、红心、草花、方块的 2~A 。
要求:提供序列的各种操作方法 。
'''
def check_key(key):
    if not isinstance(key, int):raise TypeError("索引值必须是整数")
    if key < 0:raise IndexError('索引值必须是非负数')
    if key >= 52:raise IndexError('索引值不能超过%d'%52)
class PokerSeq:
    def __init__(self):
        self.__changed = {}
        self.__deleted = []
    def __len__(self):
        return 52
    def __getitem__(self,key):
        check_key(key)
        if key in self.__changed:
            return self.__changed[key]
        if key in self.__deleted:
            return None
        ret = ''
        t_i = key//13
        if t_i == 0:
            ret = '黑桃';
        elif t_i == 1:
            ret = '红心'
        elif t_i == 2:
            ret = '草花'
        else:
            ret = '方块'
        t_i = key%13
        if t_i<9:
            ret = ret+str(t_i+2)
        elif t_i == 9:
            ret = ret+'J'
        elif t_i == 10:
            ret = ret+'Q'
        elif t_i == 11:
            ret = ret+'K'
        else:
            ret = ret+'A'
        return ret
    def __setitem__(self,key,value):
        check_key(key)
        self.__changed[key] = value
    def __delitem__(self,key):
        check_key(key)
        if key not in self.__deleted : self.__deleted.append(key)
        if key in self.__changed : del self.__changed[key]

if __name__ == '__main__':
    sq = PokerSeq()
    print(len(sq))
    for i in sq:
        print(i,end=' ')
    sq[1]='大王'
    print(sq[1])
    del sq[1]
    print(sq[1])
    sq[1]='小王'
    print(sq[1])
    pass
# -*- coding: utf-8 -*-
'''
Created on 2020年1月29日

@author: insisted_search
2. 自定义一个序列,该序列按顺序包含所有三位数(如 100 101 102 … ) 。要求 : 提供序列的
各种操作方法。
'''
def check_key(key):
    if not isinstance(key, int):raise TypeError("索引值必须是整数")
    if key < 0:raise IndexError('索引值必须是非负数')
    if key >= 1000-100:raise IndexError('索引值不能超过%d'%52)
class ThreeSeq:
    def __init__(self):
        self.__changed = {}
        self.__deleted = []
    def __len__(self):
        return 1000-100
    def __getitem__(self,key):
        check_key(key)
        if key in self.__changed:
            return self.__changed[key]
        if key in self.__deleted:
            return None
        return key+100
    def __setitem__(self,key,value):
        check_key(key)
        self.__changed[key] = value
    def __delitem__(self,key):
        check_key(key)
        if key not in self.__deleted : self.__deleted.append(key)
        if key in self.__changed : del self.__changed[key]

if __name__ == '__main__':
    sq = ThreeSeq()
    print(len(sq))
    for i in sq:
        print(i,end=' ')
    print('')
    sq[1]='1000'
    print(sq[1])
    del sq[1]
    print(sq[1])
    sq[1]='1100'
    print(sq[1])
    pass
# -*- coding: utf-8 -*-
'''
Created on 2020年1月29日

@author: insisted_search
3. 自定义一个迭代器,该迭代器分别返回 1 , 1+2, 1+2+3 …的累积和 。
'''
class AndIter:
    def __init__(self,end_num):
        if end_num < 1:
            raise ValueError('异常:初始化值不能小于1')
        self.__end_num = end_num
        self.__and_value = 0
        self.__init_num = 1
    def __next__(self):
        if self.__init_num>self.__end_num:
            raise StopIteration("异常:停止迭代")
        self.__and_value += self.__init_num
        self.__init_num = self.__init_num +1
        return self.__and_value
    def __iter__(self):
        return self

if __name__ == '__main__':
    iter = AndIter(10)
    for ie in iter:
        print(ie,end=' ')
    print("")
    try:
        iter = AndIter(2)
        print(next(iter))
        print(next(iter))
        print(next(iter))
    except Exception as e:
        print(e)
    try:
        iter = AndIter(0)
    except Exception as e:
        print(e)
    pass
# -*- coding: utf-8 -*-
'''
Created on 2020年1月29日

@author: insisted_search
4. 自定义一个生成器,该生成器可按顺序返回 52张扑克牌 , 分别是黑桃、红心、草花、方块
的 2~A 。
'''
def PokerCreate():
    hs = ['黑桃','红心','草花','方块']
    sz = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
    for h in hs:
        for s in sz:
            yield h+s
if __name__ == '__main__':
    pc = PokerCreate()
    for p in pc:
        print(p)
    pass
'''
Created on 2020年1月29日

@author: insisted_search
5. 自定义一个生成器,可依次返回 l , 2, 3, 4 …的阶乘 。
'''
def FactorialCreate(value):
    fac = 1
    for i in range(1,value+1):
        fac = fac*i
        yield fac
if __name__ == '__main__':
    fc = FactorialCreate(10)
    for f in fc:
        print(f)
    pass
# -*- coding: utf-8 -*-
'''
Created on 2020年1月29日

@author: insisted_search
6. 自定义一个生成器,可依次访问前面目录下的所有 Python 源文件(以 .py 为后缀的文件〉 。
'''
import os
import fnmatch
def search_files():
    for root, dirs, files in os.walk('.'):
        for filename in fnmatch.filter(files, '*.py'):
            yield os.path.join(root, filename)
if __name__ == '__main__':
    sf = search_files()
    for s in sf:
        print(s)
    pass
# -*- coding: utf-8 -*-
'''
Created on 2020年1月29日

@author: insisted_search
7. 自定义 一个代表 二维坐标系上某个点的 Point 类(包括 x 、 y 两个属性),为 Point 类提供自
定义的减法运算符支持,计算结果返回两点之间的距离 。
'''
import math
class Point:
    def __init__(self,x,y):
        self.__x = x
        self.__y = y
    def __sub__(self,other):
        if not isinstance(other, Point):
            raise TypeError('减法要求目标为Point')
        return math.sqrt((self.__x-other.__x)**2+(self.__y-other.__y)**2)
if __name__ == '__main__':
    a = Point(0,0)
    b = Point(3,4)
    print(b-a)
    pass
# -*- coding: utf-8 -*-
'''
Created on 2020年1月29日

@author: insisted_search
8. 自定义代表扑克牌的 Card 类(包括花色和牌面值),为 Card 类提供自定义的比较大小的运
算符支持 , 大小比较标准是先比较牌面值,如果牌面值相等则比较花色,花色大小规则为 : 黑桃>
红心>草花>方块 。
'''
class Card:
    def __init__(self,hs,sz):
        if hs == '黑桃':
            self.__hs = 4
        elif hs == '红心':
            self.__hs = 3
        elif hs == '草花':
            self.__hs = 2
        elif hs == '方块':
            self.__hs = 3
        else:
            raise ValueError("花色不正确")
        t_v = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
        self.__sz = t_v.index(sz)
    def __lt__(self,other):
        if not isinstance(other, Card):
            raise TypeError('比较要求目标为Card')
        if self.__sz == other.__sz:
            if self.__hs < other.__hs:
                return True
            else:
                return False
        elif self.__sz < other.__sz:
            return True
        else:
            return False
    def __le__(self,other):
        if not isinstance(other, Card):
            raise TypeError('比较要求目标为Card')
        if self.__sz == other.__sz:
            if self.__hs <= other.__hs:
                return True
            else:
                return False
        elif self.__sz <= other.__sz:
            return True
        else:
            return False
    def __eq__(self,other):
        if not isinstance(other, Card):
            raise TypeError('比较要求目标为Card')
        if self.__sz == other.__sz and self.__hs == other.__hs:
            return True
        else:
            return False
    def __ne__(self,other):
        if not isinstance(other, Card):
            raise TypeError('比较要求目标为Card')
        if self.__sz == other.__sz and self.__hs == other.__hs:
            return False
        else:
            return True
    def __gt__(self,other):
        if not isinstance(other, Card):
            raise TypeError('比较要求目标为Card')
        if self.__sz == other.__sz:
            if self.__hs > other.__hs:
                return True
            else:
                return False
        elif self.__sz > other.__sz:
            return True
        else:
            return False
    def __ge__(self,other):
        if not isinstance(other, Card):
            raise TypeError('比较要求目标为Card')
        if self.__sz == other.__sz:
            if self.__hs >= other.__hs:
                return True
            else:
                return False
        elif self.__sz >= other.__sz:
            return True
        else:
            return False
if __name__ == '__main__':
    a = Card('黑桃','4')
    b = Card('红心','4')
    print(a<b)
    print(a<=b)
    print(a==b)
    print(a!=b)
    print(a>b)
    print(a>=b)
    pass

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!