forked from liukai234/python_course_record
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
134 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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=' ') | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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=' ') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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=' ') |