## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

No credit card required

# 18.9. Simulating the Ternary Operator in Python

Credit: Jürgen Hermann, Alex Martelli, Oliver Steele, Chris Perkins, Brent Burley, Lloyd Goldwasser, Doug Hudgeon

## Problem

You want to express in Python the equivalent of C's so-called ternary operator `?`:—as in `condition` `?` `iftrue`:`iffalse`).

## Solution

There are many ways to skin a ternary operator. An explicit `if`/`else` is most Pythonic, although slightly verbose:

```for i in range(1, 3):
if i == 1:
plural = ''
else:
plural = 's'
print "The loop ran %d time%s" % (i, plural)```

Indexing is more compact, and therefore useful, if using the `iftrue` and `iffalse` expressions has no side effects:

```for i in range(1, 3):
print "The loop ran %d time%s" % (i, ('', 's')[i != 1])```

For the specific case of plurals, there's also a neat variant using slicing:

```for i in range(1, 3):
print "The loop ran %d time%s" % (i, "s"[i==1:])```

Short-circuited logical expressions can deal correctly with side effects:

```for i in range(1, 3):
print "The loop ran %d time%s" % (i, i != 1 and 's' or '')```

The output of each of these loops is:

```The loop ran 1 time
The loop ran 2 times```

However, beware: the short-circuit version (which is necessary when either or both of `iftrue` and `iffalse` have side effects) fails if "turned around":

```for i in range(1, 3):
print "The loop ran %d time%s" % (i, i == 1 and '' or 's')```

Since '' evaluates as false, the would-be-ternary expression always evaluates to '`s`', so that this latest snippet outputs:

```The loop ran 1 times
The loop ran 2 times```

Therefore, in general, when `iftrue ...`

## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

No credit card required