---
# System prepended metadata

title: 'Lesson 3: Loops'
tags: [Python Workshop 沈煒翔]

---

---
tags: Python Workshop 沈煒翔
---

# Lesson 3: Loops

## Recap (if-else statements)

### Giving grades

Given a score, print the grade for the student.


| Score | Grade |
| -------- | -------- |
| score > 90     | A     |
| 90 >= score > 80     | B     |
| 80 >= score > 60     | C     |
| score < 60     | D     |

```python
score = 77

if score > 90:
    print("A")
elif score <= 90 and score > 80:
    print("B")
elif score <= 80 and score > 60:
    print("C")
elif score < 60:
    print("D")
```

### Check military service 

Given the gender, height, weight of a person, determine whether this person needs to join the army.

We know that only boys whose BMI is in between 16.5 and 31.5 need to join the army. 

BMI  = weight (in kg) / height^2 (in m)
BMI = 體重(公斤) / 身高^2 (公尺)

```python
gender = 'boy'
weight = 100 # in kg
height = 170 # in cm

if gender == 'girl':
    print("Don't need to join the army")
else:
    # calculate BMI here
    BMI = weight / (height/100)**2
    
    if BMI <= 31.5 and BMI >= 16.5:
        print("Need to join the army")
    else:
        print("Don't need to join the army")
```

<!-- ### Calculate maximum discount
There's a pub running a promotion. The price of a bottle of beer is $10. 

1. If you buy more than (including) 10 bottles, you can get 1 bottle for free. 
2. If you buy more than (including) 20 bottles, you can get 2 bottles for free.
3. Either discount (1) and (2) can be used once.

Calculate the price you need to pay when you want to drink certain bottles of beer.

Sample inputs

```python
bottles = 22
cost = bottles * 10

if cost >= 220:
    print(cost - 20)
elif cost >= 110:
    print(cost - 10)
else:
    print(cost)
``` -->

## Loop

The best part of computer programs is that they can do repeated task quickly and accurately. Loop is a control flow statement that allows code to be executed repeatedly.


### While loop


When the condition is true, the looping block is executed repeatedly.

```python
i = 0 # i is what we commonly use for the looping index

while i < 5:
    i = i + 1
    print(i)
    
#>>> 1
#>>> 2
#>>> 3
#>>> 4
#>>> 5
```

### Terminate condition

When writing loops, you need to make sure that the condition becomes ```False``` in the future so that the loop can be terminated. (unless you intend to do so).

If the condition is always true, then your program be stuck in an infinite loop and would not stop.

```python
i = 0

while i >= 0:
    i = i + 1
    print(i)
    # program would not stop
```

### Exercise

Calculate arithmetic sequence 1 + 2 + 3 + ... + n

```python
n = 10

print(55)
```

### For loop

In addition to while loop, we can also use for loop to contruct a loop.

```python
for i in range(5): # range(5) is 0,1,2,3,4
    print(i)

#>>> 0
#>>> 1
#>>> 2
#>>> 3
#>>> 4
```

Compared with while loop, for loop is more widely used and easier for other people to understand your code.

### Exercise

Calculate the geometric series 1 * 2 * 3 * ... * n

```python
n = 5

print(120)
```

### Range

In addition to using ```range(n)``` which means 0, 1, 2, 3, ..., n-1, we can set the start, stop, step size of the range. The syntax is:

```python
range(<start>, <stop>, <step=1>)
```

For example:

```python
for i in range(5, 10):
    print(i)
#>>> 5, 6, 7, 8, 9

for i in range(10, 19, 3):
    print(i)
#>>> 10, 13, 16

for i in range(3, 0, -1):
    print(i)
#>>> 3, 2, 1

for i in reversed(range(3)):
    print(i)
#>>> 2, 1, 0
```

## Loop control

### Manually stop the loop

Sometimes, instead of using the looping condition to stop the loop, you want to stop the loop yourself. You can use ```break``` to stop the loop.

```python
i_day = 0 # conventionally, looping index is named i something to preserve readability
earning = 0

while i_day < 10:
    earning = earning + 200
    i_day = i_day + 1
    
    if earning > 1000:
        break

print(i_day)
print(earning)

#>>> 6
#>>> 1200
```

### Manually skip the loop

Sometimes, you want to skip a particular loop block.

```python
# print all even numbers smaller than 10

for i in range(10):
    if i%2 != 0: # "%" is mod (to get the remainder)
        continue
    
    print(i)
        
#>>> 2
#>>> 4
#>>> 6
#>>> 8
#>>> 10        
```

### Exercise

Assume x>0 and x is an integer, find the minimum x that statisfies ```x^2 - 27x + 170 = 0```

```python
print(10)
```

Assume x>0 and x is an integer, find the minimum x that statisfies ```x^2 - 27x + 171 = 0```

```python
print("No solution")
```

## Nested Loops

Just like if-else statements, we can nest many loops together. For example:

```python
for i in range(3):
    for j in range(2): # many people use i, j, k ...
        print(i, j)
        
#>>> 0 0
#>>> 0 1
#>>> 1 0
#>>> 1 1
#>>> 2 0
#>>> 2 1
```

## Exercise

### Multiplication Table

Print Nine-Nine Multiplication Table (九九乘法表)

```python
for num1 in range(1, 10):
    for num2 in range(1, 10):
        product = num1 * num2
        print('{}x{} = {}'.format(num1, num2, product))
```

### Prime numbers

Print all prime numbers smaller than 100.

Hint: prime numbers are integers with only two factors – themselves and 1. 

```python


print(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97)
```

### Polynomial Optimization

Assume ```x``` is an integer in the range of [-10, 10], find the ```x``` the minimize ```y = x^2 + 4x + 1```. Print the value of ```x``` and ```y```.

```python
optimal_x = -10 # intialize it to the beginning of the range
optimal_y = optimal_x**2 + 4*optimal_x + 1

for x in range(-10, 11):
    y = x**2 + 4*x + 1
    
    if y < optimal_y: # we find a more optimal point
        # update the optimal x and y
        optimal_x = x
        optimal_y = y

print('The optimal x is', optimal_x)
print('The optimal y is', optimal_y)
```
