Download Programming Python on the Raspberry Pi

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Programming
Python
on the Raspberry Pi
Michael Weigend
Universität Münster
Holzkamp-Gesamtschule Witten
Vilnius 2014
Outline
Presentation 1 “Introduction to Python” (30 min)
Application domains, basic features, functions, data structures, OOP, logical correctness
(assertions)
Hands On Exercise 1 (60 min)
Presentation 2 “Raspberry Pi and Python Projects in the Classroom”
(30 min)
Python Projects in the Classroom (XP), Python on the Raspberry Pi
Coffee Break
Hands on Exercise 2 (50 min)
advanced tasks: GUI programming and programming the Raspberry Pi
Final discussion (10 min)
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Application Domains
Created With Python
Creator: Stani Michiels
A Minimalist Version
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
20 Lines of Code
Visualization of the Mandelbrot Set
from tkinter import *
RADIUS = 2.0
ZOOM = 50.0
class Mandelbrot:
def __init__(self):
self.window = Tk()
self.image = PhotoImage(width=200, height=200)
self.image_label = Label(master=self.window,
image=self.image)
self.image_label.pack()
self.draw()
self.window.mainloop()
def draw(self):
interval = [x/ZOOM for x in range(-100, 100)]
mandelbrot = [(x, y) for x in interval
for y in interval
if self.test(x, y)]
for x, y in mandelbrot:
self.image.put("#0000ff", (int(ZOOM*x+100), int(ZOOM*y+100)))
def test (self, x, y):
c = x + 1j * y
# j is the imaginary number i
z = 0
for i in range(20):
if abs (z)< RADIUS:
z = z*z - c
else: return False # not in the Mandelbrot set
return True # element of the Mandelbrot set
m = Mandelbrot()
Image Processing and Steganographie
# stegano.pyw
from tkinter import *
class App:
def __init__(self):
self.filename="manchester_6.ppm"
self.window = Tk()
self.pic = PhotoImage(file= self.filename)
self.c = Canvas(self.window, width=self.pic.width(),
height=self.pic.height())
self.c.pack()
self.c.create_image(0, 0, anchor=NW, image=self.pic)
self.ExtractButton = Button(master=self.window,
text="Find Words",
command=self.extract)
self.ExtractButton.pack()
self.window.mainloop()
def extract(self):
w = self.pic.width()
h = self.pic.height()
colors = [self.pic.get(i,0) for i in [0, 1, 2, 3]]
pixels = [(x, y) for x in range(w) for y in range(h)]
for (x, y) in pixels:
if self.pic.get(x, y) not in colors:
self.pic.put("white", to=(x, y))
else:
self.pic.put("{black black} {black black}", to=(x, y))
App() App()
Application Domains
• creative projects Disney VR Studio, Industrial Light & Magic
• science American Space Telescope Institute, Deutsche Gesellschaft für
Luft- und Raumfahrt
• web services Google, BSCW, Dropbox
• security sensible systems governments, airlines, banking
• Education universities (MIT), schools
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Advantages of Python
•
•
•
•
•
•
simple (minimalist)
consistent
short programs
platform independent
open source
many programming paradigms
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Computer Programs
are Written for Humans
Donald Knuth (1984):
„I believe that the time is ripe for
significantly better documentation of
programs, and that we can best
achieve this by considering
programs to be works of
literature.”
Knuth, D. E.: Literate Programming. In:
The Computer Journal 27/2, 1984, S.
97-111.
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Dynamic Typing
Python
int
a = 3
s = [1.1, 2, 3]
Ducktyping
float
Java
int a;
double[3] s;
a = 3;
s = [1.1, 2, 3]
Name
Object
Type
Name
Object
Type
Intuitive Models
Python
Java
int a;
a = 3;
a = 3;
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Verbosity: Minimal Code
Python
Java
if a > b:
a = b
b = c
if ( a > b )
{
a = b;
b = c;
}
no semicolons
indentation for defining blocks of code
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Associated Boolean Values
None () {} [] 0
False
“Empty “ objects
s = [1, 3, 5]
while s:
print s[0]
del s[0]
1
3
5
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Using Common Mathematical Notation
Python
if 14 < age < 60:
print ("Welcome!")
Java
if((14 < age) && (age < 60))
{
System.out.println("Welcome!")
}
which program text is easier to
understand?
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
(Implicit) Tuples
a, b = 12, 14
Compact assignments
a, b = b, a
Simple swapping
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Functions
Live Presentation 1
• position parameters
• keyword parameters
• docstring
• default values and multiple number of parameters
def area
(…)
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Type
Hierarchy
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Operations for Collections
in
>>> "e" in "Delft"
True
>>> numbers = [2, 3, 56, 12]
>>> 1 in numbers
False
Iteration
>>> for c in "Delft" :
print (c)
>>> for i in numbers:
print (i)
D
e
l
f
t
2
3
56
12
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Operations for Sequences
concatenation
>>> w = "Delft"
>>> 'Tiles from ' + w
'Tiles from Delft'
>>> 2*w
'DelftDelft'
>>> numbers = [2, 3, 56, 12]
>>> 2*numbers
[2, 3, 56, 12, 2, 3, 56, 12]
indexing and slicing
>>> w[0]
'D'
>>> w[0:2]
'De'
>>>
>>> w[2:]
'lft'
>>> numbers = [2, 3, 56, 12]
>>> numbers[0]
2
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
List
mutable sequence
list items may be all kinds of objects
[1, 2, 3]
[1, "a", [1, 2], len]
[]
[[], [], []]
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
List Comprehension
[n*n for n in [1, 2, 3]]
Which items are in this list?
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
List Comprehension
[n*n for n in [1, 2, 3]]
[1, 4, 9]
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Set Builder Notation
s = {2*x for x in {1, 2, 3, 4, 5} if x**2 > 3}
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Modeling with Lists
Stack
last in – first out
>>>
>>>
>>>
>>>
[3,
>>>
7
>>>
[3,
stack = [3, 4, 5]
stack.append(6)
stack.append(7)
stack
4, 5, 6, 7]
stack.pop()
stack
4, 5, 6]
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Modeling with Dictionaries
Mapping key  value
create a dictionary
>>> tel = {'jack': 4098, 'tom': 4139}
add an item
>>> tel['guido'] = 4127
>>> tel
{‘tom': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel[‘tome']
>>> tel
{'guido': 4127, 'jack': 4098}
find a value using a key
delete an item
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Object Oriented Programming
Everything is an object!
>>> a=1
>>> type(a)
<class 'int'>
>>> id(a)
9786792
>>> a + 2
3
>>> a.__add__(2)
3
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Object Oriented Programming
Live Presentation 2
• Class definition
• Class attributes, object attributes
• Methods
• Polymorphism (overloading)
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Modeling Volume
1.0 L
0.05 mL
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
How to find a bug?
Simple
condition
Complex program
Simple
condition
Simple
condition
Quicksort
def qsort (sequence):
s = sequence[:]
# s is a copy of sequence
if s == []:
result = s
# end of recursion
else:
x = s[0]
# take first element
del s[0]
s1 = []
# split remaining list
s2 = []
for i in s:
if i <= x:
s1.append(i)
else:
s2.append(i)
result = qsort(s1) + [x] + qsort(s2) # recursive calls
return result
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Quicksort
checking postconditions
def qsort (sequence):
s = sequence[:]
# s is a copy of sequence
if s == []:
result = s
# end of recursion
else:
x = s[0]
# take first element
del s[0]
s1 = []
# split remaining list
s2 = []
for i in s:
if i <= x:
s1.append(i)
else:
s2.append(i)
result = qsort(s1) + [x] + qsort(s2) # recursive calls
assert len(result) == len (sequence)
return result
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Hands-on Exercise 1
Presentation 1 “Introduction to Python” (30 min)
Application domains, basic features, functions, data structures, OOP, logical correctness
(assertions)
Hands On Exercise 1 (60 min)
Presentation 2 “Raspberry Pi and Python Projects in the Classroom”
(30 min)
Python Projects in the Classroom (XP), Python on the Raspberry Pi
Coffee Break
Hands on Exercise 2 (50 min)
advanced tasks: GUI programming and programming the Raspberry Pi
Final discussion (10 min)
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Part 2
Python Projects in the
Classroom –
Raspberry Pi Projects
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Agile Classroom Projects
Extreme Programming (Kent Beck)
Invent a project metaphor
write stories
Start with an architectural spike solution
Implement stories in short iterations
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
The Letter Fairy
A text editor that helps young children writing
letters in a foreign language.
Stories
User can insert phrases ( “Dear friend!”)
User can choose a font
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Start with an Architectural Spike
from tkinter import *
class Editor:
def __init__ (self):
# widgets
self.window = Tk()
self.window.title("Text Editor 1")
self.text = Text(master=self.window)
self.text.pack()
# window
self.window.mainloop()
Editor()
9 lines of code
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
At the End of the First Iteration
---------------------------------------------------# file name: editor3.pyw
# A simple text editor with menu for open and save
# Michael Weigend 2009
#---------------------------------------------------from tkinter import *
class Editor:
def __init__ (self):
# Textfeld
self.window = Tk()
self.text= Text(master=self.window,
wrap=WORD, font=('Arial', 10))
self.text.pack()
# Menu Bar
self.menuBar=Menu(master=self.window)
self.window.config(menu=self.menuBar)
# file menu
self.fileMenu=Menu(self.menuBar)
self.fileMenu.add_command(label="Open",
command = self.load)
self.fileMenu.add_command(label="Save as",
command = self.save)
self.fileMenu.add_separator()
self.fileMenu.add_command(label='Quit',
command=self.quit)
self.menuBar.add_cascade(label="file",
menu=self.fileMenu)
self.window.mainloop()
# methods
def load (self):
self.file = filedialog.askopenfile()
self.text.delete(1.0, END)
# delete all text in text area
if self.file:
self.text.insert(1.0, self.file.read()) # read text from file and insert it
approx. 50 lines of code
def save (self):
self.file = filedialog.asksaveasfile()
if self.file:
self.file.write(self.text.get(1.0, END) )
self.file.close()
def quit(self):
if messagebox.askyesno('Finish',
'Do you really want to quit?'):
self.window.destroy()
Editor()
Programming the Raspberry Pi
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Computer = Black Box
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Open The Black Box
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Mail From All Over The World
Michael Weigend: Programming
Python on the Raspberry Pi, Vilnius
Project: Collecting and Processing
Temperature Data
digital
analog
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Direct-to-Digital
physical
phenomenon
Information
data package
ID
temperature
Sensor
temperature
(-55 to +125 °C)
crc
Computer
1-Wire-Bus
temperaturesensitive oscillator
DS1820
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Hardware Configuration
GPIO
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Wiring Diagram
…
R=4,7kΩ
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Reading data with modprobe
ID of the sensor
28 = DS18B20
sudo modprobe wire
sudo modprobe w1-gpio
sudo modprobe w1-therm
Temperature
information
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Temperature Data Logger
os.system("modprobe wire")
os.system("modprobe w1-gpio")
os.system("modprobe w1-therm")
for d in os.listdir("/sys/bus/w1/devices"):
if d.startswith("10") or d.startswith("28"):
deviceFile = "/sys/bus/w1/devices/" + d + "/w1_slave"
def readTemp():
ok = False
while not ok:
f = open(deviceFile, "r")
firstLine, secondLine = f.readlines()
f.close()
if firstLine.find("YES") != -1:
ok = True
tempString = secondLine.split("=")[1]
return int(tempString)/1000
while True:
print(readTemp())
time.sleep(1)
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Output:
22.937
22.312
22.312
Hands-on Exercise 2
Presentation 1 “Introduction to Python” (30 min)
Application domains, basic features, functions, data structures, OOP, logical correctness
(assertions)
Hands On Exercise 1 (60 min)
Presentation 2 “Raspberry Pi and Python Projects in the Classroom”
(30 min)
Python Projects in the Classroom (XP), Python on the Raspberry Pi
Coffee Break
Hands on Exercise 2 (50 min)
advanced tasks: GUI programming and programming the Raspberry Pi
Final discussion (10 min)
Michael Weigend: Programming Python on the Raspberry Pi, Vilnius 2014
Related documents