Benutzer:Dirk Huenniger/python
Deprecated
[Bearbeiten]This version of this document is deprecated. The source-codes use an old syntax of the Python programming language. It is very dangerous to learn this syntax, since the code you write using this syntax will not run on new installations anymore. A new version of this document is available here Benutzer:Dirk Huenniger/python3.0.
This is my little introduction to Python
But before getting started I just want to add a links to some files of a turtle graphics course in python which is also quite suitable for beginners. So HERE it is.
Hello World
[Bearbeiten]Lets start with my slighly advanced version of the hello word program
print "Hello World"
#Functions
def funny_function(x):
print "I am a function called with parameter ",x
funny_function("Horsefly")
#conditionals
if 1==2:
print "One and Two are the same"
elif 1==1:
print "One and One are the same"
else:
print "One and One are different"
#the while loop
x=3
while x>1:
print "While",x
x-=1
#the for loop
for i in range(1,3):
print "For",i
Objects
[Bearbeiten]The next thing I would like to show you are the object oriented features of python.
#objects
class Animal:
#constuctor
def __init__(self):
self.legs=0
self.weight=0
#private variable
self.__answer=42
def getLegs(self):
return self.legs
def setLegs(self,l):
self.legs=l
def getAnswer(self):
return self.__answer
class Dog(Animal):
def __init__(self):
Animal.__init__(self)
self.setLegs(4)
def bark(self):
print "Wow!"
d=Dog()
d.bark()
print d.getLegs()
print d.weight
print d.getAnswer()
print d.__answer
Strings
[Bearbeiten]Of course there are a lot of functions dealing with strings in Python
#Printing a string
print "xyz"
#concatanating strings with the + operator
print "xyz"+"abc"
#multiplying a string
print 3*"xyz"
#getting the fifth character of a string
print "abcdefg"[4]
#printing the charactes 3 to 5 of a string
print "abcdefg"[2:5]
#printing the first 3 characters of a string
print "abcdefg"[:3]
#print the last chacters of a string starting from the fourth
print "abcdefg"[3:]
#print the second letter counting from the end of the sting
print "abcdefg"[-2]
List
[Bearbeiten]A very important structure in Python is the list.
#putting together apples and pears
print ["apples","pears"]
#bascially you can to the same things with lists as with stings so
#multiply
print 3*["apples","pears"]
#add
print ["apples","pears"]+["spam","eggs"]
#take the third element
print ["apples","pears","spam","eggs"][2]
#and so on.
#of course you can also do normal stack , list and queue operations
l=["a","b","c"]
print l
#appending
l.append("d")
print l
#inserting
l.insert(2,"new")
print l
#stack poping, pop the element at the end
print l.pop()
print l
#queue poping, pop the element at the beginnig
print l.pop(0)
print l
#sorting
l.sort()
print l
#remove element by name
l.remove("new")
print l
#remove by index
l=[1,2,3,1,2,3]
print l
del l[2]
print l
Containers
[Bearbeiten]But of course there are other useful container types too.
#the mapping type: dictionary, an associative array
d={"dirk":27,"arthur":24,"david":20,"linda":30}
print d
print d["dirk"]
print d.keys()
print d.values()
d.update({"dirk":28})
print d
d["david"]=21
print d
del d["arthur"]
print d
print d.has_key("linda")
print "dirk" in d
#the set type
l=[1,2,3,4,1,2]
print l
s=set(l)
print s
#"element of" realtionship
print 1 in s
print 5 in s
t=set([4,5])
#set difference
print s-t
#set union
print s|t
#set intersection
print s&t
#set symmetric difference
print s^t
Loops
[Bearbeiten]Here come a short introduction to the way you loop through sequences in Python
d={"john":23,"anna":30,"elis":26}
for k , v in d.items():
print "The key "+k+" has got the value "+str(v)
fruits=["apple","banana","orange"]
for i, f in enumerate(fruits):
print "The fruit",f,"is number",i
drinks=["juice","water","lemonade"]
for f,d in zip(fruits,drinks):
print d,f
for r in reversed(["a","b","c","d"]):
print r
Exercise
[Bearbeiten]Some Magic
[Bearbeiten]The following lines are magic, just store them to the file mathparser.py
import parser
import pprint
from types import ListType, TupleType
import symbol
import token
import types
d=symbol.sym_name
d.update( token.tok_name)
def do(x):
if type(x)==types.StringType:
return x
try:
l=len(x)
except:
l=1
if l>1:
try:
h=d[x[0]]
except:
h=x [0]
if h in ["arith_expr"]:
l=[h]
else:
l=[]
for e in x[1:]:
l+=[do(e)]
return l
else:
return x
def press(x):
if type(x)==types.StringType:
return x
if len(x)==1:
try:
return press(x[0])
except:
return x
try:
return [press(a) for a in x]
except:
return x
return x
def clean(x):
if type(x)==types.StringType:
return x
try:
return filter( lambda x : x not in ['arith_expr',"(",")",""] ,[clean(a) for a in x] )
except:
return x
return x
def consume(x):
if type(x)==types.StringType:
return x
if len(x)>2:
return [consume(x[1]) , consume(x[0]) , consume(x[2:])]
if len(x)==2:
return [consume(x[0]),consume(x[1])]
return consume(x[0])
def parse(x):
p=parser.expr(x).tolist()
u=press(clean(press(do(p))))
return press(clean(consume(u)))
Your Task
[Bearbeiten]This is the desciption the task you can do
import mathparser
from types import ListType, TupleType
import types
print mathparser.parse("x*x*x")
#Task 1:
#Write a program that generates something like this:
#(x * (x * x))
#from the given source list
#HINT
#You can check whether something is a string by writing:
#if type(x)==types.StringType:
#an so on.
#Task 2:
#Write a program that calculates the first derivative of the given input list.
#The output format shall be a list of the same kind.
#Task 3:
# Combine 1 and 2 to get the derivative in the usual notation.
Solution
[Bearbeiten]This is my solution to the problem
import mathparser
from types import ListType, TupleType
import types
def pri(x):
if type(x)==types.StringType:
return x
if x[0] in "+-*/":
return "(" + pri(x[1]) +" "+x[0]+" " + pri(x[2]) + ")"
if len(x)==2:
return x[0]+"("+pri(x[1])+")"
def mult(a,b):
if ((b=="0") or (a=="0")):
return "0"
elif a=="1":
return b
elif b=="1":
return a
else:
return ["*" ,a,b]
def add(a,b):
if a=="0":
return b
elif b=="0":
return a
else:
return ["+" ,a,b]
def derive(x):
TODO="I will not calculate this derivative because the guy who programmed me didn't want me to"
BADMATH="I will not calculate this derivative because, mathematicins can prove that it won't work all the time"
if x=="x":
return "1"
if type(x)==types.StringType:
return "0"
if x[0] == "+":
return add(derive(x[1]),derive(x[2]))
elif x[0] == "-":
return [x[0] ,derive(x[1]),derive(x[2])]
elif x[0] in "*/":
a=mult(derive(x[1]),x[2])
b=mult(x[1],derive(x[2]))
if x[0]=="*":
return add(a,b)
else:
return ["-" ,a,b]
elif x[0]=="sin":
return mult(["cos" ,x[1] ] , derive(x[1]))
elif x[0]=="cos":
return mult(mult("-1",["sin" ,x[1]]) , derive(x[1]))
elif x[0]=="log":
return mult(["/","1","x" ] , derive(x[1]))
elif x[0] in ["ln","ceil","fabs","floor","fmod","frexp"]:
raise BADMATH
elif x[0] in ["modf","ldexp"]:
raise TODO
elif x[0]=="exp":
return mult(["exp",x[1] ] , derive(x[1]))
elif x[0]=="log":
if len(x)==2:
return mult(["exp",x[1] ] , derive(x[1]))
else:
raise TODO
elif x[0]=="log10":
return derive(["log",x[1],"10.0"])
elif x[0]=="pow":
if not contains_x(x[2]):
return ["pow", x ]
else:
raise TODO
print pri(mathparser.parse("x*x*x"))
print derive(mathparser.parse("x*x*x"))
print pri(derive(mathparser.parse("x*x*x")))