[Python-checkins] CVS: python/nondist/peps pep-0202.txt,1.2,1.3

Skip Montanaro python-dev@python.org
Tue, 25 Jul 2000 08:07:31 -0700


Update of /cvsroot/python/python/nondist/peps
In directory slayer.i.sourceforge.net:/tmp/cvs-serv24082

Modified Files:
	pep-0202.txt 
Log Message:
some content to start things off (maybe someone else will add to it...)


Index: pep-0202.txt
===================================================================
RCS file: /cvsroot/python/python/nondist/peps/pep-0202.txt,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** pep-0202.txt	2000/07/14 03:29:52	1.2
--- pep-0202.txt	2000/07/25 15:07:28	1.3
***************
*** 7,10 ****
--- 7,118 ----
  
  
+ Introduction
+ 
+     This PEP describes a proposed syntactical extension to Python, list
+     comprehensions. 
+ 
+ 
+ 
+ The Proposed Solution
+ 
+     It is proposed to allow conditional construction of list literals using
+     for and if clauses.  They would nest in the same way for loops and if
+     statements nest now.
+     
+ 
+ 
+ Rationale
+ 
+     List comprehensions provide a more concise way to create lists in
+     situations where map() and filter() and/or nested loops would currently
+     be used.
+ 
+ 
+ Examples
+ 
+     >>> print [i for i in range(10)]
+     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+ 
+     >>> print [i for i in range(20) if i%2 == 0]
+     [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
+ 
+     >>> nums = [1,2,3,4]
+     >>> fruit = ["Apples", "Peaches", "Pears", "Bananas"]
+     >>> print [i,f for i in nums for f in fruit]
+     [(1, 'Apples'), (1, 'Peaches'), (1, 'Pears'), (1, 'Bananas'),
+      (2, 'Apples'), (2, 'Peaches'), (2, 'Pears'), (2, 'Bananas'),
+      (3, 'Apples'), (3, 'Peaches'), (3, 'Pears'), (3, 'Bananas'),
+      (4, 'Apples'), (4, 'Peaches'), (4, 'Pears'), (4, 'Bananas')]
+     >>> print [i,f for i in nums for f in fruit if f[0] == "P"]
+     [(1, 'Peaches'), (1, 'Pears'),
+      (2, 'Peaches'), (2, 'Pears'),
+      (3, 'Peaches'), (3, 'Pears'),
+      (4, 'Peaches'), (4, 'Pears')]
+     >>> print [i,f for i in nums for f in fruit if f[0] == "P" if i%2 == 1]
+     [(1, 'Peaches'), (1, 'Pears'), (3, 'Peaches'), (3, 'Pears')]
+     >>> def zip(*args):
+     ...    return apply(map, (None,)+args)
+     ... 
+     >>> print [i for i in zip(nums,fruit) if i[0]%2==0]
+     [(2, 'Peaches'), (4, 'Bananas')]
+ 
+ 
+ Reference Implementation
+ 
+     Please refer to 
+ 
+         https://sourceforge.net/patch/?func=detailpatch&patch_id=100654&group_id=5470
+ 
+     for a patch that adds list comprehensions to Python.
+ 
+ 
+ 
+ Open Issues
+ 
+     Syntax
+ 
+         Several people proposed connecting or separating syntax between the
+         various clauses, for example, requiring a semicolon between them to
+         set them apart:
+ 
+             [i,f; for i in nums; for f in fruit; if f[0]=="P"; if i%2==1]
+ 
+         To minimize strain on the Python parser, Guido has suggested
+         requiring parentheses around the initial tuple:
+ 
+             [(i,f) for i in nums for f in fruit if f[0]=="P" if i%2==1]
+ 
+     Semantics
+ 
+         The semantics of multiple for clauses is not obvious to many
+         people.  Currently, it nests, so that
+ 
+             [i,f for i in nums for f in fruit]
+ 
+         is functionally equivalent to
+ 
+             tmp = []
+             for i in nums:
+                 for f in fruit:
+                     tmp.append((i,f))
+ 
+         Other people would read it as if it executed
+ 
+             map(None, nums, fruit)
+ 
+         It's not clear that this is necessary.  The newly proposed zip()
+         builtin takes care of that case.
+ 
+     Stability of the Implementation
+ 
+         The current reference implementation is simply an adaptation of Greg
+         Ewing's original demonstration of the concept.  Other than tracking
+         changes to the source code to keep it a valid patch, reindenting the
+         code and switching to function prototypes, nothing has been done to
+         it.  This obviously raises some questions about how stable the code
+         is.  It has not had a lot of exercise, though the patch does include
+         a few test cases.
+ 
+ 
  Local Variables:
  mode: indented-text