123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544 |
- ---
- redirect_from:
- - "/chapters/09/1/conditional-statements"
- interact_link: content/chapters/09/1/Conditional_Statements.ipynb
- kernel_name: python3
- has_widgets: false
- title: |-
- Conditional Statements
- prev_page:
- url: /chapters/09/Randomness.html
- title: |-
- Randomness
- next_page:
- url: /chapters/09/2/Iteration.html
- title: |-
- Iteration
- comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***"
- ---
- <div class="jb_cell tag_remove_input">
- <div class="cell border-box-sizing code_cell rendered">
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <h3 id="Conditional-Statements">Conditional Statements<a class="anchor-link" href="#Conditional-Statements"> </a></h3><p>In many situations, actions and results depends on a specific set of conditions being satisfied. For example, individuals in randomized controlled trials receive the treatment if they have been assigned to the treatment group. A gambler makes money if she wins her bet.</p>
- <p>In this section we will learn how to describe such situations using code. A <em>conditional statement</em> is a multi-line statement that allows Python to choose among different alternatives based on the truth value of an expression. While conditional statements can appear anywhere, they appear most often within the body of a function in order to express alternative behavior depending on argument values.</p>
- <p>A conditional statement always begins with an <code>if</code> header, which is a single line followed by an indented body. The body is only executed if the expression directly following <code>if</code> (called the <em>if expression</em>) evaluates to a true value. If the <em>if expression</em> evaluates to a false value, then the body of the <code>if</code> is skipped.</p>
- <p>Let us start defining a function that returns the sign of a number.</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
-
- <span class="k">if</span> <span class="n">x</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">'Positive'</span>
- </pre></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">sign</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
- </pre></div>
- </div>
- </div>
- </div>
- <div class="output_wrapper">
- <div class="output">
- <div class="jb_output_wrapper }}">
- <div class="output_area">
- <div class="output_text output_subarea output_execute_result">
- <pre>'Positive'</pre>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <p>This function returns the correct sign if the input is a positive number. But if the input is not a positive number, then the <em>if expression</em> evaluates to a false value, and so the <code>return</code> statement is skipped and the function call has no value.</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">sign</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">)</span>
- </pre></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <p>So let us refine our function to return <code>Negative</code> if the input is a negative number. We can do this by adding an <code>elif</code> clause, where <code>elif</code> if Python's shorthand for the phrase "else, if".</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
-
- <span class="k">if</span> <span class="n">x</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">'Positive'</span>
-
- <span class="k">elif</span> <span class="n">x</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">'Negative'</span>
- </pre></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <p>Now <code>sign</code> returns the correct answer when the input is -3:</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">sign</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">)</span>
- </pre></div>
- </div>
- </div>
- </div>
- <div class="output_wrapper">
- <div class="output">
- <div class="jb_output_wrapper }}">
- <div class="output_area">
- <div class="output_text output_subarea output_execute_result">
- <pre>'Negative'</pre>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <p>What if the input is 0? To deal with this case, we can add another <code>elif</code> clause:</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
-
- <span class="k">if</span> <span class="n">x</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">'Positive'</span>
-
- <span class="k">elif</span> <span class="n">x</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">'Negative'</span>
-
- <span class="k">elif</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">'Neither positive nor negative'</span>
- </pre></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">sign</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
- </pre></div>
- </div>
- </div>
- </div>
- <div class="output_wrapper">
- <div class="output">
- <div class="jb_output_wrapper }}">
- <div class="output_area">
- <div class="output_text output_subarea output_execute_result">
- <pre>'Neither positive nor negative'</pre>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <p>Equivalently, we can replaced the final <code>elif</code> clause by an <code>else</code> clause, whose body will be executed only if all the previous comparisons are false; that is, if the input value is equal to 0.</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
-
- <span class="k">if</span> <span class="n">x</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">'Positive'</span>
-
- <span class="k">elif</span> <span class="n">x</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">'Negative'</span>
-
- <span class="k">else</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">'Neither positive nor negative'</span>
- </pre></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">sign</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
- </pre></div>
- </div>
- </div>
- </div>
- <div class="output_wrapper">
- <div class="output">
- <div class="jb_output_wrapper }}">
- <div class="output_area">
- <div class="output_text output_subarea output_execute_result">
- <pre>'Neither positive nor negative'</pre>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <h3 id="The-General-Form">The General Form<a class="anchor-link" href="#The-General-Form"> </a></h3><p>A conditional statement can also have multiple clauses with multiple bodies, and only one of those bodies can ever be executed. The general format of a multi-clause conditional statement appears below.</p>
- <pre><code>if <if expression>:
- <if body>
- elif <elif expression 0>:
- <elif body 0>
- elif <elif expression 1>:
- <elif body 1>
- ...
- else:
- <else body>
- </code></pre>
- <p>There is always exactly one <code>if</code> clause, but there can be any number of <code>elif</code> clauses. Python will evaluate the <code>if</code> and <code>elif</code> expressions in the headers in order until one is found that is a true value, then execute the corresponding body. The <code>else</code> clause is optional. When an <code>else</code> header is provided, its <em>else body</em> is executed only if none of the header expressions of the previous clauses are true. The <code>else</code> clause must always come at the end (or not at all).</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <h3 id="Example:-Betting-on-a-Die">Example: Betting on a Die<a class="anchor-link" href="#Example:-Betting-on-a-Die"> </a></h3><p>Suppose I bet on a roll of a fair die. The rules of the game:</p>
- <ul>
- <li>If the die shows 1 spot or 2 spots, I lose a dollar.</li>
- <li>If the die shows 3 spots or 4 spots, I neither lose money nor gain money.</li>
- <li>If the die shows 5 spots or 6 spots, I gain a dollar.</li>
- </ul>
- <p>We will now use conditional statements to define a function <code>one_bet</code> that takes the number of spots on the roll and returns my net gain.</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">one_bet</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
- <span class="sd">"""Returns my net gain if the die shows x spots"""</span>
- <span class="k">if</span> <span class="n">x</span> <span class="o"><=</span> <span class="mi">2</span><span class="p">:</span>
- <span class="k">return</span> <span class="o">-</span><span class="mi">1</span>
- <span class="k">elif</span> <span class="n">x</span> <span class="o"><=</span> <span class="mi">4</span><span class="p">:</span>
- <span class="k">return</span> <span class="mi">0</span>
- <span class="k">elif</span> <span class="n">x</span> <span class="o"><=</span> <span class="mi">6</span><span class="p">:</span>
- <span class="k">return</span> <span class="mi">1</span>
- </pre></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <p>Let's check that the function does the right thing for each different number of spots.</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">one_bet</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="n">one_bet</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="n">one_bet</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span> <span class="n">one_bet</span> <span class="p">(</span><span class="mi">4</span><span class="p">),</span> <span class="n">one_bet</span><span class="p">(</span><span class="mi">5</span><span class="p">),</span> <span class="n">one_bet</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span>
- </pre></div>
- </div>
- </div>
- </div>
- <div class="output_wrapper">
- <div class="output">
- <div class="jb_output_wrapper }}">
- <div class="output_area">
- <div class="output_text output_subarea output_execute_result">
- <pre>(-1, -1, 0, 0, 1, 1)</pre>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <p>As a review of how conditional statements work, let's see what <code>one_bet</code> does when the input is 3.</p>
- <ul>
- <li>First it evaluates the <code>if</code> expression, which is <code>3 <= 2</code> which is <code>False</code>. So <code>one_bet</code> doesn't execute the <code>if</code> body.</li>
- <li>Then it evaluates the first <code>elif</code> expression, which is <code>3 <= 4</code>, which is <code>True</code>. So <code>one_bet</code> executes the first <code>elif</code> body and returns 0.</li>
- <li>Once the body has been executed, the process is complete. The next <code>elif</code> expression is not evaluated.</li>
- </ul>
- <p>If for some reason we use an input greater than 6, then the <code>if</code> expression evaluates to <code>False</code> as do both of the <code>elif</code> expressions. So <code>one_bet</code> does not execute the <code>if</code> body nor the two <code>elif</code> bodies, and there is no value when you make the call below.</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">one_bet</span><span class="p">(</span><span class="mi">17</span><span class="p">)</span>
- </pre></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <p>To play the game based on one roll of a die, you can use <code>np.random.choice</code> to generate the number of spots and then use that as the argument to <code>one_bet</code>. Run the cell a few times to see how the output changes.</p>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing code_cell rendered">
- <div class="input">
- <div class="inner_cell">
- <div class="input_area">
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">one_bet</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">)))</span>
- </pre></div>
- </div>
- </div>
- </div>
- <div class="output_wrapper">
- <div class="output">
- <div class="jb_output_wrapper }}">
- <div class="output_area">
- <div class="output_text output_subarea output_execute_result">
- <pre>-1</pre>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="jb_cell">
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
- <div class="text_cell_render border-box-sizing rendered_html">
- <p>At this point it is natural to want to collect the results of all the bets so that we can analyze them. In the next section we develop a way to do this without running the cell over and over again.</p>
- </div>
- </div>
- </div>
- </div>
-
|