Skip to content

Commit

Permalink
序列、迭代器、生成器
Browse files Browse the repository at this point in the history
  • Loading branch information
Amore-e committed May 10, 2020
1 parent c7a6d42 commit 6d6e6fd
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 0 deletions.
63 changes: 63 additions & 0 deletions 容器/序列.py
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=' ')

33 changes: 33 additions & 0 deletions 容器/生成器2.py
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=' ')
38 changes: 38 additions & 0 deletions 容器/迭代器.py
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=' ')

0 comments on commit 6d6e6fd

Please sign in to comment.