From 6d6e6fd77ff741581fffd219f6145012de69ea2d Mon Sep 17 00:00:00 2001 From: Amore-e <3540433804@qq.com> Date: Sun, 10 May 2020 14:43:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=8F=E5=88=97=E3=80=81=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E5=99=A8=E3=80=81=E7=94=9F=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\272\217\345\210\227.py" | 63 +++++++++++++++++++ .../\347\224\237\346\210\220\345\231\2502.py" | 33 ++++++++++ .../\350\277\255\344\273\243\345\231\250.py" | 38 +++++++++++ 3 files changed, 134 insertions(+) create mode 100644 "\345\256\271\345\231\250/\345\272\217\345\210\227.py" create mode 100644 "\345\256\271\345\231\250/\347\224\237\346\210\220\345\231\2502.py" create mode 100644 "\345\256\271\345\231\250/\350\277\255\344\273\243\345\231\250.py" diff --git "a/\345\256\271\345\231\250/\345\272\217\345\210\227.py" "b/\345\256\271\345\231\250/\345\272\217\345\210\227.py" new file mode 100644 index 0000000..87aefeb --- /dev/null +++ "b/\345\256\271\345\231\250/\345\272\217\345\210\227.py" @@ -0,0 +1,63 @@ +''' + 序列相关方法 +__len__(self): +__getitem__(self, key): +__contains__(self, item): +__setitem__(self, key, value): +__delitem__(self, key): +''' + +''' +定义一个序列,该序列按顺序包含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 squeezer: + def __init__(self): + self.flowers = ('♠', '♥', '♣', '♦') + self.values = ('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A') + # 用于存储被修改的数据 + self.changed = {} + # 用于存储已删除的数据 + self.deleted = [] + + def __len__(self): + return 52 + + def __getitem__(self, item): + check_key(item) + # 如果在self.changed中找到,就返回修改后的值 + if item in self.changed: + return self.changed[item] + # 如果在self.deleted中找到,说明该元素被删除 + if item in self.deleted: + return None + # 否则根据推算返回序列元素 + flower = item // 13 # 取整获得花色0、1、2、3 + value = item % 13 # 取余获得点数 + return self.flowers[flower] + self.values[value] + + def __setitem__(self, key, value): + check_key(item) + self.changed[key] = value + + def __delitem__(self, key): + check_key(item) + if key not in self.deleted: + self.deleted.append(key) + if key in self.changed: + del self.changed[key] + + +if __name__ == '__main__': + # 创建实例 + s = squeezer() + print(len(s)) + for i in range(13): + print(s[i], end=' ') + diff --git "a/\345\256\271\345\231\250/\347\224\237\346\210\220\345\231\2502.py" "b/\345\256\271\345\231\250/\347\224\237\346\210\220\345\231\2502.py" new file mode 100644 index 0000000..2529bec --- /dev/null +++ "b/\345\256\271\345\231\250/\347\224\237\346\210\220\345\231\2502.py" @@ -0,0 +1,33 @@ +''' +生成器 + +特点: +1、因为自动创建了 iter()和 next()方法,生成器显得特别简洁。 +2、生成器是高效的。 +3、使用生成器表达式取代列表解析可以同时节省内存。 +4、会自动抛出 StopIteration 异常。 +5、生成器能实现迭代器所有的功能。 + +区别: +迭代器通常先定义一个迭代器类,然后通过创建实例来创建迭代器; +生成器则是先定义一个包含yield语句的函数,然后通过调用函数来创建生成器; +使用生成器会让程序变得很优雅。 +''' +''' +定义一个生成器,52张扑克牌,分别按顺序返回52张扑克牌,分别是黑桃、红心、梅花、方块的2-A。 +''' + + +def squeezer(): + values = ('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A') + flowers = ('♠', '♥', '♣', '♦') + for i in range(52): + yield flowers[i // 13] + values[i % 13] + + +if __name__ == '__main__': + sq = squeezer() + print(next(sq)) + print(next(sq)) + for j in sq: + print(j, end=' ') diff --git "a/\345\256\271\345\231\250/\350\277\255\344\273\243\345\231\250.py" "b/\345\256\271\345\231\250/\350\277\255\344\273\243\345\231\250.py" new file mode 100644 index 0000000..6ccb4cf --- /dev/null +++ "b/\345\256\271\345\231\250/\350\277\255\344\273\243\345\231\250.py" @@ -0,0 +1,38 @@ +''' +迭代器 +要实现迭代器,需要实现两个方法: +1、__iter__(self):该方法返回一个迭代器(iterator),迭代器必须包含__next__()方法, + 该方法返回迭代器的下一个元素。 +2、__reserved__(self):实现迭代器的反转。 +''' + + +# 定义一个斐波那契数列的迭代器 f(n+2) = f(n+1) + f(n) + +class Fibs: + def __init__(self, len): + self.first = 0 + self.sec = 1 + self.__len = len + + def __next__(self): + # 如果len为0,结束迭代 + if self.__len == 0: + raise StopIteration + # 完成数列计算 + self.first, self.sec = self.sec, self.first + self.sec + # 数列长度减1 + self.__len -= 1 + return self.first + + def __iter__(self): + return self + + +# 创建对象 +f = Fibs(20) +# 获取迭代器的下一个元素 +print(next(f)) +# 循环遍历迭代器 +for i in f: + print(i, end=' ') \ No newline at end of file