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