example15.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. """
  2. 迭代器 - __iter__ / __next__
  3. itertools - 生成可迭代序列的工具模块
  4. """
  5. import itertools
  6. from math import sqrt
  7. def is_prime(num):
  8. """判断素数"""
  9. for factor in range(2, int(sqrt(num)) + 1):
  10. if num % factor == 0:
  11. return False
  12. return True
  13. class PrimeIter(object):
  14. """素数迭代器"""
  15. def __init__(self, min_value, max_value):
  16. assert 2 <= min_value <= max_value
  17. self.min_value = min_value - 1
  18. self.max_value = max_value
  19. def __iter__(self):
  20. return self
  21. def __next__(self):
  22. self.min_value += 1
  23. while self.min_value <= self.max_value:
  24. if is_prime(self.min_value):
  25. return self.min_value
  26. self.min_value += 1
  27. raise StopIteration()
  28. class FibIter(object):
  29. """斐波那契数迭代器"""
  30. def __init__(self, num):
  31. self.num = num
  32. self.a, self.b = 0, 1
  33. self.idx = 0
  34. def __iter__(self):
  35. return self
  36. def __next__(self):
  37. if self.idx < self.num:
  38. self.a, self.b = self.b, self.a + self.b
  39. self.idx += 1
  40. return self.a
  41. raise StopIteration()
  42. def main():
  43. # for val in itertools.permutations('ABCD'):
  44. # print(val)
  45. # for val in itertools.combinations('ABCDE', 3):
  46. # print(val)
  47. # for val in itertools.product('黑红梅方', range(1, 14)):
  48. # print(val)
  49. # fib_iter = FibIter(20)
  50. # print('===>', next(fib_iter))
  51. # print('===>', next(fib_iter))
  52. # for val in fib_iter:
  53. # print(val)
  54. prime_iter = PrimeIter(2, 100000)
  55. for val in prime_iter:
  56. print(val)
  57. if __name__ == '__main__':
  58. main()