From 5c8d29cb134be7d67d24c172da870c9e062e6ab7 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 15 Aug 2004 23:28:10 +0000 Subject: SF patch #872326: generator expression implementation (Contributed by Jiwon Seo.) Add genexps to the reference manual. --- Doc/ref/ref5.tex | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/Doc/ref/ref5.tex b/Doc/ref/ref5.tex index 0931920..45e0f7b 100644 --- a/Doc/ref/ref5.tex +++ b/Doc/ref/ref5.tex @@ -55,7 +55,8 @@ categorized syntactically as atoms. The syntax for atoms is: {\token{identifier} | \token{literal} | \token{enclosure}} \production{enclosure} {\token{parenth_form} | \token{list_display}} - \productioncont{| \token{dict_display} | \token{string_conversion}} + \productioncont{| \token{generator_expression | \token{dict_display}}} + \productioncont{| \token{string_conversion}} \end{productionlist} @@ -193,6 +194,48 @@ bug is fixed in a future release}. \indexii{empty}{list} +\subsection{Generator expressions\label{genexpr}} +\indexii{generator}{expression} + +A generator expression is a compact generator notation in parentheses: + +\begin{productionlist} + \production{generator_expression} + {"(" \token{test} \token{genexpr_for} ")"} + \production{genexpr_for} + {"for" \token{expression_list} "in" \token{test} + [\token{genexpr_iter}]} + \production{genexpr_iter} + {\token{genexpr_for} | \token{genexpr_if}} + \production{genexpr_if} + {"if" \token{test} [\token{genexpr_iter}]} +\end{productionlist} + +A generator expression yields a new generator object. +\obindex{generator} +\obindex{generator expression} +It consists of a single expression followed by at least one +\keyword{for} clause and zero or more \keyword{for} or \keyword{if} +clauses. The iterating values of the new generator are those that +would be produced by considering each of the \keyword{for} or +\keyword{if} clauses a block, nesting from left to right, and +evaluating the expression to yield a value that is reached the +innermost block for each iteration. + +Variables used in the generator expression are evaluated lazily +when the \method{next()} method is called for generator object +(in the same fashion as normal generators). However, the leftmost +\keyword{for} clause is immediately evaluated so that error produced +by it can be seen before any other possible error in the code that +handles the generator expression. +Subsequent \keyword{for} clauses cannot be evaluated immediately since +they may depend on the previous \keyword{for} loop. +For example: \samp{(x*y for x in range(10) for y in bar(x))}. + +The parentheses can be omitted on calls with only one argument. +See section \ref{calls} for the detail. + + \subsection{Dictionary displays\label{dict}} \indexii{dictionary}{display} @@ -432,6 +475,8 @@ series of arguments: \begin{productionlist} \production{call} {\token{primary} "(" [\token{argument_list} [","]] ")"} + {\token{primary} "(" [\token{argument_list} [","] | + \token{test} \token{genexpr_for} ] ")"} \production{argument_list} {\token{positional_arguments} ["," \token{keyword_arguments}]} \productioncont{ ["," "*" \token{expression}]} -- cgit v0.12