2017-08-12 18 views
0

は(後述)私を混乱させるコードの一部です:なぜこのPythonコードはジェネレータオブジェクトを返しますか?ここ

class Node: 
    def __init__(self, start, end): 
     self.start = start 
     self.end = end 

intervals = [Node(1, 2), Node(3, 4), Node(5, 6)] 

starts = sorted(i.start for i in intervals) 
ends = sorted(i.end for i in intervals) 

なぜ(i.start for i in intervals)ジェネレータオブジェクトを返すと、なぜそうi.start for i in intervalsのように括弧を削除することはない無効な構文エラーを返すのですか?

+1

あなたの質問がありますか? '(i.start for i)'は[gen-expの構文です](https://www.python.org/dev/peps/pep-0289/)ですので、ジェネレータと 'iを返します。インターバルでiを開始する 'は有効な構文ではありません。 –

+0

あなたのコードで何が発電機ですか? '開始'または '終了'の値は?あるいは(私は間隔を置いて私のために出発する)? – Quelklef

答えて

2

(x for x in y)は、Pythonジェネレータを作成するための簡潔な方法です。 リストを反復処理したい場合は、括弧はPythonは、それはあなたが発電機を作成しようとしている知ることができますつのトークンとして、式を解析しましょう

for x in y: 
    # do stuff 

を使用しています。かっこがなければ、Pythonは最初にi.startを見るので、式が必要です。 forキーワードは新しいステートメントを開始するので、オフにします。括弧は、インタープリタがそれを読むときにすべて1つのトークンにまとめているので、Pythonはそれをジェネレータ構文として認識できます。

+3

'sorted()'はリスト自体を返します。 –

+0

あなたは正しいです、私は何らかの理由で「逆転」することを考えていました。 – ChristianFigueroa

関連する問題