# Branching and Iteration
## String
Enclosed in quotation marks or single quotes, exp:
`hi = "hello there"`
notice `" "` is defined as space, exp:
```python
name = ABC
greeting = hi + " " + name
print(greeting)
```
Difference in printing , and + between objects:
```python
>>> print("hi","chong")
hi chong
>>> print("hi"+"chong")
hichong
```
## Input: `input("")`
prints whatever is in the quotes, the string user types next will be binded as a variable (input into memory), exp:
```
>>> text = input("type something down below")
type something down below
hello
>>> print(text)
hello
```
## Cast: Input For Numbers
binding numbers (only when ur working with numbers):
```
>>> num = int(input("type a number"))
type a number25
>>> print(5*num)
125
```
## Comparisons
Only variables, evaluate to a boolean:
```python
i > j
i >= j
i < j
i <= j
i == j #equality test, True if i is the same as j
i != j #inequality test, True if i not the same as j
```
Test:
```
>>> i = 5
>>> j = 6
>>> i<j
True
>>> i>j
False
```
## Logic Operators on `boolean`
Assume `a` and `b` are variable names with Boolean values:
| A | B | A and B | A or B |
| - | - | - | - |
| `True` | `True` | `True` | `True`
| `True` | `False` | `False` | `True`
| `False` | `True` | `False` | `True`
| `False` | `False` | `False` | `False`
Logic operators can be used in code to connect variables:
- `not a`
- `True` if `a` is `False`
- `False` if `a` is `True`
- `a and b`
- `True` if both are `True`
- `a or b`
- `True` if either one is `True` or both are `True`
```python
pset_time = 15
sleep_time = 8
print(sleep_time > pset_time)
derive = True
drink = False
both = drink and derive
print(both)
```
## if else vs elif else (Control Flow and Branching)
```python
if <condition>:
<expression>
<expression>
...
else:
<expression>
<expression>
```
Decision is made from the condition under if that is true or false, expressions is evaluated or executed when condition is true.
```python
if <condition>:
<expression>
<expression>
...
elif <condition>:
<expression>
<expression>
...
else:
<expression>
<expression>
```
`elif` is made for a separate condition if the first condition is not `True`. If all are `False`, the last expression under `else` is executed
*see how multiple conditions can have shorter strings of code using elif vs if*
### `if else`
```python
x = float(input("type a number to compare"))
y = float(input("type another number to compare"))
if x > y:
print("x is bigger")
print("y is smaller")
if y > x:
print("y is bigger")
print("x is smaller")
if x == y:
print("they're the same!")
```
### `elif`
```python
x = float(input("type a number to compare"))
y = float(input("type another number to compare"))
if x > y:
print("x is bigger")
print("y is smaller")
elif y > x:
print("y is bigger")
print("x is smaller")
else:
print("they're the same!")
```
# `while` loops
`if else` infinite loops can be turned into `while` loops:
```
while <condition>:
<expression>
<expression>
```
`<condition>` evaluates to a Boolean. If <condition> is `True`, do all the steps inside the `while` code block. Check `<condition>` again, repeat until <condition> it's `False`.
# `for` loops
Acts as a $n = n+1$ loop shortcut, `while` vs `for` below:
```python
n = 0
while n < 5:
print(n)
n = n+1
```
`for` loop shortcut:
```python
for n in range(5):
print(n)
```
Each time through the loop, `<variable>` takes a value, first time, `<variable>` starts at the smallest value, next time, `<variable>` gets the prev value + 1
etc. `range()` **creates a sequence from 0 to whatever number u set, in this case it's 0-5**
## Controlling `range()`
`range(start, stop, step)`, default: start = 0, step = 1:
```python
mysum = 0
for i in range(7, 10):
mysum += i
print(mysum)
mysum = 0
for i in range(5, 11, 2):
mysum += i
print(mysum)
```
*note: doesn't include stop values*
## `break`
`break` acts as an immediate exit from the `while` loop when a condition is met and skips the remaining expressions after, but only exits it's innermost loop:
```python
while <condition_1>:
while <condition_2>:
<expression_a>
break
<expression_b>
<expression_c>
```
Example:
```python
mysum = 0
for i in range(5, 11, 2):
mysum += i
if mysum == 5:
break
mysum += 1
print(mysum)
```
Since `i` is 5 inside the for loop, when `mysum += i` occurs `mysum` will equal to 5 as well.
Notice that because `mysum` is 5 so it fits the if block's condition, hence the for loop will break.
## `for` vs `while` loops
| `for` | `while` |
| - | - |
| **know** number of iterations | iterations are **unbounded**
| end early via `break` | end early via `break`
| uses a **counter** | **uses a counter but must initialize before loop and increment it inside loop**
| can rewrite a `for` loop using a `while` loop | may not be able to rewrite a `while` loop using a `for` loop