回答編集履歴

1

追記

2019/05/20 23:40

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -9,3 +9,69 @@
9
9
 
10
10
 
11
11
  xsがイテレータになることもあるのなら、itertools.isliceの利用を検討します。
12
+
13
+
14
+
15
+ コメントを受けて
16
+
17
+ ---
18
+
19
+ > 第1 引数で与えられた要素数まで、第2 引数に与えられたコレクション/イテレータを走査するイ
20
+
21
+ テレータを返す関数take()を定義せよ。
22
+
23
+ take()の結果のイテレータが走査しない残りの部分をイテレータで返すdrop()を定義せよ。
24
+
25
+
26
+
27
+ なるほど。第二引数はイテレータを取る場合があるのですね。
28
+
29
+ とりあえず、ざっくりイテレータの扱い方を紹介します。
30
+
31
+ ```Python
32
+
33
+ >>> lst = [1, 2, 3]
34
+
35
+ >>> it = iter(lst)
36
+
37
+ >>> next(it)
38
+
39
+ 1
40
+
41
+ >>> next(it)
42
+
43
+ 2
44
+
45
+ >>> list(it)
46
+
47
+ [3]
48
+
49
+ >>>
50
+
51
+ ```
52
+
53
+
54
+
55
+ iterを使えば、任意のコレクションからイテレータを取得することができます。
56
+
57
+ イテレータは状態を記憶するので、一度取り出した箇所の値を再度送出することはありません。
58
+
59
+
60
+
61
+ 依って、drop関数は次のように簡単に実装できます。
62
+
63
+ 0. 第二引数xsのイテレータitを取る
64
+
65
+ 0. 第一引数n回分だけitをnextに放り込む
66
+
67
+ 0. itを返す
68
+
69
+
70
+
71
+ これだけです。
72
+
73
+ ただし、nがxsの要素数より多い場合はStopIterationを捌いてやる必要があります。
74
+
75
+
76
+
77
+ スマートに解きたいなら前述のスライスやitertoolsを活用してみても良いでしょう。