from IPython.core.display import HTML
HTML(open("custom.html", "r").read())
Python has while:
while is False from the beginning, skip the associated code blockwhile.i = 11
while i % 5 != 0:
print(i)
i = 2 * i + 1
11 23 47
and continue and break:
continue skips the end of the while code block and "jumps back" to while immediatelybreak stops looping and program execution continues after the while blockx = 9
while x > 0:
x = x - 1
if x % 2 == 0:
continue # skips rest of body of while
print(x)
if x % 3 == 0:
break # quit body of while
print("done")
7 5 3 done
do until (or similar). Use while True: + break instead.¶# draw random number in 0...1000 divisible by 7
import random
while True:
# generate random integer in 0..1000 (limits included)
number = random.randrange(0, 1001)
if number % 7 == 0:
break
print("discard", number)
print("got", number)
discard 857 discard 831 discard 471 discard 981 discard 633 discard 16 discard 74 got 91
Python has some container types for collecting values. list is one such a type. We quickly introduce lists for the introduction of for-loops. More about lists later.
A list is an "expandable array", thus has no limited size (except you run out of memory).
li = [1, 2, 4, 8]
print(li)
[1, 2, 4, 8]
length of a list:
print(len(li))
4
print(type(li))
<class 'list'>
The empty list is []:
print(type([]))
print(len([]))
<class 'list'> 0
List of strings:
li = ["hi", "ho"]
Mixed types:
li = [1, 2.0, True, "hi"]
print(li)
[1, 2.0, True, 'hi']
for loops¶for has the general form
for <variable> in <iterable>:
<codeblock>
An example for such an iterable are lists:
for name in ["urs", "uwe", "guido"]:
print("I say hi to", name)
print("I also say hi to everybody I forgot")
I say hi to urs I say hi to uwe I say hi to guido I also say hi to everybody I forgot
Here name is a variable which you can name as you like.
In the first iteration name is urs, in the second iteration name is uwe, in the third iteration name is guido. Then the list is exhausted and iteration stops.
Here we iterate over a list of numbers to sum them up:
def sumup(numbers):
# "sum" is a built-in Python function, so we append "_" to avoid
# overlap:
sum_ = 0.0
for number in numbers:
sum_ = sum_ + number
return sum_
print(sumup([1, 2, 3]))
6.0
In the previous example number takes values 1, 2, and 3. And sum_ starts with 0 and then is updated to 1, 3 and 6.
"Classic" countint loops are not so often required in Python. But if you need them you can use the range function which returns an so-called "iterable":
for i in range(4):
print(i, "squared is", i * i)
0 squared is 0 1 squared is 1 2 squared is 4 3 squared is 9
Now with different starting value:
for i in range(1, 4):
print(i, "squared is", i * i)
1 squared is 1 2 squared is 4 3 squared is 9
And with a step size:
for i in range(1, 4, 2):
print(i, "squared is", i * i)
1 squared is 1 3 squared is 9
Antipattern (C style)
This is correct code, and correlates to the way you iterate in some other languages like C:
numbers = [1, 3, 5]
for i in range(len(numbers)):
print(numbers[i])
1 3 5
The more "pythonic" and thus more readable version is:
for number in numbers:
print(number)
1 3 5
The range function returns an iterable:
print(range(1, 4))
range(1, 4)
To see what an iterable produces (and thus how it behaves when used in a for loop), you can pass it to the list funtion which converts an iterable to the list of the values the iterable produces:
print(list(range(1, 4)))
[1, 2, 3]
Comment: Python also has some INFINITE iterators, so be prepared!
sumup example.for over a string? What is the result if you pass a string to list()? Try it out.Use pen and paper to determine the final value of z in the following program:
x = list(range(5))
z = 0
for i in x:
z += i
while z > 0:
if z % 5 == 0:
z = 3
continue
z //= 2
Can you write shorter expressions for range(0, 3) and range(1, 4, 1) ?
Write a function average which takes a list of numbers and computes their average (extend the example for summing up numbers).
Make sure that the program returns None if the list of numbers is empty.
Write a function which takes a list of strings and appends them all. E.g.
append(["a", "bc", "def"]) == "abcdef"
import random, lookup function random.random and implement https://academo.org/demos/estimating-pi-monte-carlo/average function to compute the average of all even numbers in the list. You also have to count the even numbers for this(!).The collatz-conjecture (https://en.wikipedia.org/wiki/Collatz_conjecture) is based on the following scheme:
n.n is even replace n by n/2n by 3n + 1.n is not 1 continue with step B.Write a function collatz(n) which prints the values of n during this iteration scheme.