質問するログイン新規登録

回答編集履歴

5

追記

2018/09/23 11:26

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -42,8 +42,11 @@
42
42
 
43
43
  そうか、無名関数なのか。見た目は内包表記だけど、本当はlambdaの仲間だったんですねぇ(?)。
44
44
 
45
+ ただ、「裏でyieldが自動定義されているのでしょうか。」という疑問に直接答えるのは難しくて、というか処理系の実装を読んでみないとわからない領域だと思います。そもそもジェネレータがどんな内部表現で実現されているかという話なので。
45
46
 
46
-
47
+ 「過程はともかく、結果としてジェネレータ関数で定義した場合と同様に振る舞う」くらいに思っておいた方が平和的です・・・。
48
+   
49
+   
47
50
  参考情報:
48
51
  [Python のイテレータ生成クラスの使い方 - Life with Python](https://www.lifewithpython.com/2015/11/python-create-iterator-protocol-class.html)
49
52
  [6. 式 (expression) — Python 3.6.5 ドキュメント | 6.2.8. ジェネレータ式](https://docs.python.jp/3/reference/expressions.html#generator-expressions)

4

修正

2018/09/23 11:26

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -6,9 +6,9 @@
6
6
 
7
7
  の3つがあります。
8
8
 
9
- 結論としては、ジェネレータ関数とジェネレータ式はともにジェネレータイテレータを生成します。
9
+ 結論としては、ジェネレータ関数とジェネレータ式はともにジェネレータイテレータを生成します。動作としてはそういうもの、で説明終わりです。
10
10
 
11
- ただ、ジェネレータ式についてはドキュメントを読んだ限りでは位置づけがよくわからないというのが率直な完走でした。
11
+ ただ、ジェネレータ式についてはドキュメントを読んだ限りでは位置づけがよくわからないというのが私の率直な感想でした。
12
12
 
13
13
  ジェネレータの定義
14
14
 

3

最初ちょっと勘違いした回答をつけていたので、修正して正しい内容にしました

2018/09/23 11:23

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -1,20 +1,50 @@
1
- 以下の回答はあまり用語の選択が厳密でな気がしきたので、ちょっ結論を留保しておきます。
1
+ pythonにおいてジェネレータに関連する用語としては、
2
2
 
3
+ - ジェネレータ関数
3
- ---
4
+ - ジェネレータ式
5
+ - ジェネレータイテレータ
4
6
 
5
- > 以上理由で、yieldジェネレータをジェネレータたらしめていると認識しているのでが、
7
+ 3つありま
6
8
 
7
- `yield`にジェネレータ式にしろ一種の糖衣構文、と認識した方が良いと思います。
9
+ 結論とては、ジェネレータ関数とジェネレータはともジェネレータイテレータを生成します。
8
10
 
9
- 本当にジェネレータをジェネレータたしめてるのは、`__iter__()``__next__()`という二種類メソッドす(python3の場合)
11
+ ただ、ジェネレータ式についてはドキュメント読んだ限りでは位置づけがよくわかいというのが率直な完走した
10
12
 
11
- 自作クラスを定義してこの2つのメソッドを適切に書けば、それでジェネレータになる(というかジェネレータとして機能する。`generator`型にはなりませんが・・・)、ということになります。
13
+ ジェネレータの定義
12
14
 
13
- 逆に、`yield`を使ったジェネレータ関数にしろジェネレータにしろ、そういうメソッドを持つオブジェクトに変換されている、と捉えることがます。
15
+ > (ジェネレータ) generator iterator を返す関数です。 通常の関数似ていますが yield 式を持つ点で異なります。 yield 式は for ループで使用出来一連の値やnext() 関数一度に 1 つの値を取り出すのに使用されます。
14
16
 
15
- 詳細については以下の参考リクを参照してください。
17
+ > [用語集 — Python 3.5.3 ドキュメト ジェネレータ](https://docs.python.jp/3.5/glossary.html#term-generator)
16
18
 
17
- 参考:
19
+  
20
+ > Python における generator (ジェネレータ) は、イテレータプロトコルを実装する便利な方法を提供します。コンテナオブジェクトの __iter__() メソッドがジェネレータとして実装されていれば、そのメソッドは __iter__() および __next__() メソッドを提供するイテレータオブジェクト (厳密にはジェネレータオブジェクト) を自動的に返します。ジェネレータに関する詳細な情報は、 yield 式のドキュメント にあります。
21
+
22
+ > [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)
23
+
24
+ ジェネレータ式の定義
25
+
26
+ > ジェネレータ式 (generator expression) とは、丸括弧を使ったコンパクトなジェネレータ表記法です
27
+
28
+ > [6. 式 (expression) — Python 3.5.3 ドキュメント 6.2.8. ジェネレータ式](https://docs.python.jp/3.5/reference/expressions.html#generator-expressions)
29
+
30
+
31
+ ジェネレータはyield式によって実現されるもの、という説明しかないので、ジェネレータ式が思いっきり浮いてるんですよね・・・。
32
+
33
+ ドキュメントですらそういう説明になっている以上、質問の疑問はごく真っ当なものだと思います。
34
+
35
+ 仕方ないのでPEPを見に行くと、
36
+
37
+ > The semantics of a generator expression are equivalent to creating an anonymous generator function and calling it.
38
+
39
+ > [PEP 289 -- Generator Expressions | Python.org](https://www.python.org/dev/peps/pep-0289/)
40
+
41
+ 無名のジェネレータ関数を作って呼び出すことと等価、とあり、とりあえず安心はできました。
42
+
43
+ そうか、無名関数なのか。見た目は内包表記だけど、本当はlambdaの仲間だったんですねぇ(?)。
44
+
45
+
46
+
47
+ 参考情報:
18
48
  [Python のイテレータ生成クラスの使い方 - Life with Python](https://www.lifewithpython.com/2015/11/python-create-iterator-protocol-class.html)
19
49
  [6. 式 (expression) — Python 3.6.5 ドキュメント | 6.2.8. ジェネレータ式](https://docs.python.jp/3/reference/expressions.html#generator-expressions)
20
50
  [Pythonのイテレータとジェネレータ](https://qiita.com/tomotaka_ito/items/35f3eb108f587022fa09)

2

修正

2018/09/23 11:22

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -1,3 +1,7 @@
1
+ 以下の回答はあまり用語の選択が厳密でない気がしてきたので、ちょっと結論を留保しておきます。
2
+
3
+ ---
4
+
1
5
  > 以上の理由で、yieldがジェネレータをジェネレータたらしめていると認識しているのですが、
2
6
 
3
7
  `yield`にしろジェネレータ式にしろ一種の糖衣構文、と認識した方が良いと思います。

1

参考ページ追加

2018/09/23 08:14

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -14,4 +14,5 @@
14
14
  [Python のイテレータ生成クラスの使い方 - Life with Python](https://www.lifewithpython.com/2015/11/python-create-iterator-protocol-class.html)
15
15
  [6. 式 (expression) — Python 3.6.5 ドキュメント | 6.2.8. ジェネレータ式](https://docs.python.jp/3/reference/expressions.html#generator-expressions)
16
16
  [Pythonのイテレータとジェネレータ](https://qiita.com/tomotaka_ito/items/35f3eb108f587022fa09)
17
- [Pythonのイテレータ、ジェネレータまわりの言語仕様について復習してみる](https://qiita.com/gyu-don/items/0f38dfb48fc7dabbb2ae)
17
+ [Pythonのイテレータ、ジェネレータまわりの言語仕様について復習してみる](https://qiita.com/gyu-don/items/0f38dfb48fc7dabbb2ae)
18
+ [Python: ジェネレータをイテレータから理解する - CUBE SUGAR CONTAINER](https://blog.amedama.jp/entry/2017/11/23/213233)