Conditional iteration
Duncan Booth
duncan.booth at invalid.invalid
Thu Dec 14 03:56:33 EST 2006
at <at at tuko.nl> wrote:
> By the way,
>
> I think by approving
>
> a = b if condition else c
>
> used to avloind
>
> if condition:
> a = b
> else:
> a = c
Neither of those is much of an improvement over the other, and in fact if
b or c are complex expressions I would definitely favour the longhand form.
The benefit of having a conditional expression though is that in some
situations it can make the code clearer by allowing you to avoid creating a
name at all. e.g. if 'a' was then used as a parameter in a function call:
d = fn(b if condition else c)
and a has disappeared entirely.
>
> which is dealing with same psychological problem, Guido also
> recognizes some need...
>
> Is it redundant according to your criteria, yes I would say:
>
> a = {True: a, False: c}[condition]
>
> or
>
> a = [c, a][condition]
>
> would yield exactly the same even in one sentence....
You do realise, I hope, that neither of these last two gives the same
results as the inline 'if'?
>>> x = 0
>>> print 3/x if x != 0 else -1
-1
>>> print {True: 3/x, False: -1}[x != 0]
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
print {True: 3/x, False: -1}[x != 0]
ZeroDivisionError: integer division or modulo by zero
>>> print [-1, 3/x][x != 0]
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
print [-1, 3/x][x != 0]
ZeroDivisionError: integer division or modulo by zero
>>>
and before you suggest the good old standby and/or technique, that fails
for other values:
>>> print x != 0 and 3/x or -1
-1
>>> x=5
>>> print x != 0 and 3/x or -1
-1
>>>
You need to use the messy:
>>> print (x != 0 and (3/x,) or (-1,))[0]
0
to get exactly the same effect as the inline if with loss of both
readability and performance.
More information about the Python-list
mailing list