• Source
    1. # -*- coding: utf-8 -*-
    2.  
    3. # 使用した Python のバージョン:
    4. # ・Python(Python 2.7.x)/Python3(Python 3.x) ←どちらか選んでください。どちらでも動作する場合は両方書いてください。
    5. # 工夫した点・苦労した点・感想等(ご自由にお書きください):
    6. # ・
    7. # ・
    8.  
    9. # 必要に応じてここに import 文を挿入してもOKです。
    10. # 例:import itertools
    11.  
    12. class IteratorCloner:
    13. def __init__(self, it):
    14. self._it = iter(it)
    15. # ↑この行は変更しないでください!
    16. # ↓必要に応じてコードを追加するのはOK。
    17.  
    18. def get_clone(self):
    19. # ここを適切に実装しなおしてテストが通るようにしてください。
    20. # ただし、以下の条件を満たすこと:
    21. # ・self._it を何らかの形で利用すること。
    22. # ・yield 式を必ず利用すること。
    23. return self._it
    24. # 桜先生からのワンポイントアドバイス:
    25. # ・オリジナルの Iterator self._it から、どうやって生成値を引き継いで yield 式に渡すか。
    26. #  その方法にたどり着ければ、問題の半分は解決よ♪
    27. # ・第2のキーワードは『遅延』。この意味が分かれば全て解決♪
    28.  
    29. # ※これ以降は変更しないこと。
    30. if __name__ == '__main__':
    31. import unittest
    32. import random
    33. from itertools import islice, takewhile
    34.  
    35. def rand_enum():
    36. while True:
    37. # 1〜20の整数値をランダムに列挙
    38. yield random.randint(1, 20)
    39.  
    40. def fib():
    41. a, b = 0, 1
    42. while True:
    43. yield b
    44. a, b = b, a + b
    45.  
    46. def take_10(it):
    47. return list(islice(it, 10))
    48.  
    49. def take_under_100(it):
    50. return list(takewhile(lambda n: n < 100, it))
    51.  
    52. class IteratorClonerTest(unittest.TestCase):
    53. def setUp(self):
    54. self.cloner = IteratorCloner(fib())
    55.  
    56. def test_fib_clone1(self):
    57. fib = self.cloner.get_clone()
    58. expected = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    59. result = take_under_100(fib)
    60. self.assertEqual(result, expected)
    61.  
    62. def test_fib_clone2(self):
    63. fib1 = self.cloner.get_clone()
    64. fib2 = self.cloner.get_clone()
    65. expected = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    66. result1 = take_10(fib1) # dispose
    67. result2 = take_under_100(fib2)
    68. self.assertEqual(result2, expected)
    69.  
    70. def test_fib_cloneN(self):
    71. expected = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    72. result = None
    73. # 3回以上10回以下のランダム回数繰り返す
    74. for i in range(random.randint(3, 10)):
    75. result = take_under_100(self.cloner.get_clone())
    76. self.assertEqual(result, expected)
    77.  
    78. def test_rand_enum(self):
    79. cloner = IteratorCloner(rand_enum())
    80. expected = take_10(cloner.get_clone())
    81. result = take_10(cloner.get_clone())
    82. self.assertEqual(result, expected)
    83.  
    84. # run tests
    85. unittest.main()
    86.