forked from python/peps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpep-0202.txt
137 lines (92 loc) · 3.92 KB
/
pep-0202.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
PEP: 202
Title: List Comprehensions
Version: $Revision$
Author: tim@digicool.com (Tim Peters)
Status: Draft
Type: Standards Track
Python-Version: 2.0
Created: 13-Jul-2000
Post-History:
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
SourceForge contains a patch that adds list comprehensions to Python[1].
BDFL Pronouncements
Note: the BDFL refers to Guido van Rossum, Python's Benevolent
Dictator For Life.
- The syntax proposed above is the Right One.
- The form [x, y for ...] should be disallowed; one should be
required to write [(x, y) for ...].
- The form [... for x... for y...] nests, with the last index
varying fastest, just like nested for loops.
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[2] 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.
References
[1] https://sourceforge.net/patch/?func=detailpatch&patch_id=100654&group_id=5470
[2] Lockstep Iteration, pep-0201.txt
Local Variables:
mode: indented-text
indent-tabs-mode: nil
End: