回答編集履歴
5
追記
test
CHANGED
@@ -86,9 +86,15 @@
|
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
+
ただ、「裏でyieldが自動定義されているのでしょうか。」という疑問に直接答えるのは難しくて、というか処理系の実装を読んでみないとわからない領域だと思います。そもそもジェネレータがどんな内部表現で実現されているかという話なので。
|
89
90
|
|
90
91
|
|
91
92
|
|
93
|
+
「過程はともかく、結果としてジェネレータ関数で定義した場合と同様に振る舞う」くらいに思っておいた方が平和的です・・・。
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
92
98
|
|
93
99
|
参考情報:
|
94
100
|
|
4
修正
test
CHANGED
@@ -14,11 +14,11 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
結論としては、ジェネレータ関数とジェネレータ式はともにジェネレータイテレータを生成します。
|
17
|
+
結論としては、ジェネレータ関数とジェネレータ式はともにジェネレータイテレータを生成します。動作としてはそういうもの、で説明終わりです。
|
18
18
|
|
19
19
|
|
20
20
|
|
21
|
-
ただ、ジェネレータ式についてはドキュメントを読んだ限りでは位置づけがよくわからないというのが率直な
|
21
|
+
ただ、ジェネレータ式についてはドキュメントを読んだ限りでは位置づけがよくわからないというのが私の率直な感想でした。
|
22
22
|
|
23
23
|
|
24
24
|
|
3
最初ちょっと勘違いした回答をつけていたので、修正して正しい内容にしました
test
CHANGED
@@ -1,36 +1,96 @@
|
|
1
|
-
|
1
|
+
pythonにおいてジェネレータに関連する用語としては、
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
+
- ジェネレータ関数
|
6
|
+
|
5
|
-
-
|
7
|
+
- ジェネレータ式
|
8
|
+
|
9
|
+
- ジェネレータイテレータ
|
6
10
|
|
7
11
|
|
8
12
|
|
9
|
-
|
13
|
+
の3つがあります。
|
10
14
|
|
11
15
|
|
12
16
|
|
13
|
-
|
17
|
+
結論としては、ジェネレータ関数とジェネレータ式はともにジェネレータイテレータを生成します。
|
14
18
|
|
15
19
|
|
16
20
|
|
17
|
-
|
21
|
+
ただ、ジェネレータ式についてはドキュメントを読んだ限りでは位置づけがよくわからないというのが率直な完走でした。
|
18
22
|
|
19
23
|
|
20
24
|
|
21
|
-
|
25
|
+
ジェネレータの定義
|
22
26
|
|
23
27
|
|
24
28
|
|
25
|
-
|
29
|
+
> (ジェネレータ) generator iterator を返す関数です。 通常の関数に似ていますが、 yield 式を持つ点で異なります。 yield 式は for ループで使用出来る一連の値や、next() 関数で一度に 1 つの値を取り出すのに使用されます。
|
26
30
|
|
27
31
|
|
28
32
|
|
29
|
-
|
33
|
+
> [用語集 — Python 3.5.3 ドキュメント ジェネレータ](https://docs.python.jp/3.5/glossary.html#term-generator)
|
30
34
|
|
31
35
|
|
32
36
|
|
33
|
-
|
37
|
+
|
38
|
+
|
39
|
+
> Python における generator (ジェネレータ) は、イテレータプロトコルを実装する便利な方法を提供します。コンテナオブジェクトの __iter__() メソッドがジェネレータとして実装されていれば、そのメソッドは __iter__() および __next__() メソッドを提供するイテレータオブジェクト (厳密にはジェネレータオブジェクト) を自動的に返します。ジェネレータに関する詳細な情報は、 yield 式のドキュメント にあります。
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
> [4. 組み込み型 — Python 3.5.3 ドキュメント 4.5.1. ジェネレータ型](https://docs.python.jp/3.5/library/stdtypes.html?highlight=%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF#generator-types)
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
ジェネレータ式の定義
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
> ジェネレータ式 (generator expression) とは、丸括弧を使ったコンパクトなジェネレータ表記法です
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
> [6. 式 (expression) — Python 3.5.3 ドキュメント 6.2.8. ジェネレータ式](https://docs.python.jp/3.5/reference/expressions.html#generator-expressions)
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
ジェネレータはyield式によって実現されるもの、という説明しかないので、ジェネレータ式が思いっきり浮いてるんですよね・・・。
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
ドキュメントですらそういう説明になっている以上、質問の疑問はごく真っ当なものだと思います。
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
仕方ないのでPEPを見に行くと、
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
> The semantics of a generator expression are equivalent to creating an anonymous generator function and calling it.
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
> [PEP 289 -- Generator Expressions | Python.org](https://www.python.org/dev/peps/pep-0289/)
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
無名のジェネレータ関数を作って呼び出すことと等価、とあり、とりあえず安心はできました。
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
そうか、無名関数なのか。見た目は内包表記だけど、本当はlambdaの仲間だったんですねぇ(?)。
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
参考情報:
|
34
94
|
|
35
95
|
[Python のイテレータ生成クラスの使い方 - Life with Python](https://www.lifewithpython.com/2015/11/python-create-iterator-protocol-class.html)
|
36
96
|
|
2
修正
test
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
以下の回答はあまり用語の選択が厳密でない気がしてきたので、ちょっと結論を留保しておきます。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
---
|
6
|
+
|
7
|
+
|
8
|
+
|
1
9
|
> 以上の理由で、yieldがジェネレータをジェネレータたらしめていると認識しているのですが、
|
2
10
|
|
3
11
|
|
1
参考ページ追加
test
CHANGED
@@ -31,3 +31,5 @@
|
|
31
31
|
[Pythonのイテレータとジェネレータ](https://qiita.com/tomotaka_ito/items/35f3eb108f587022fa09)
|
32
32
|
|
33
33
|
[Pythonのイテレータ、ジェネレータまわりの言語仕様について復習してみる](https://qiita.com/gyu-don/items/0f38dfb48fc7dabbb2ae)
|
34
|
+
|
35
|
+
[Python: ジェネレータをイテレータから理解する - CUBE SUGAR CONTAINER](https://blog.amedama.jp/entry/2017/11/23/213233)
|