# 注意这是一个生成器,并且是一个无限序列 def_odd_iter(): n = 1 whileTrue: n = n + 2 yield n # 然后定义一个筛选函数 def_not_divisible(n): returnlambda x: x % n > 0 # 最后,定义一个生成器,不断返回下一个素数 # 这个生成器先返回第一个素数2,然后,利用filter()不断产生筛选后的新的序列 defprimes(): yield2 it = _odd_iter() # 初始序列 whileTrue: n = next(it) # 返回序列的第一个数 yield n it = filter(_not_divisible(n), it) # 构造新序列 # 由于primes()也是一个无限序列,所以调用时需要设置一个退出循环的条件: # 打印1000以内的素数: for n in primes(): if n < 1000: print(n) else: break
# 鸭子模型,类list用法,Fib()[1:3] def__getitem__(self, n): if isinstance(n, int): # n是索引 a, b = 0, 1 for x in range(n): a, b = b, a + b return a if isinstance(n, slice): # n是切片 start = n.start stop = n.stop if start isNone: start = 0 a, b = 0, 1 L = [] for x in range(stop): if x >= start: L.append(a) a, b = b, a + b return L
# 在没有找到属性的情况下调用该方法,默认返回None # 可以避免 AttributeError: 'Fib' object has no attribute 'xxx' # 可以返回本类对象,形成链式调用的形式 def__getattr__(self, attr): pass
@score.setter defscore(self, value): ifnot isinstance(value, int): raise ValueError('score must be an integer!') if value < 0or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value