pagetitle |
---|
Programmering i Python |
Alexander Perry
Forståelig syntaks med lite støy:
>>> navn = "Teodor"
>>> navn
'Teodor'
>>> "Hei! Jeg heter " + navn
'Hei! Jeg heter Teodor'
- Støtter imperativ, objektorientert og funksjonell programmering
- Knallgodt standardbibliotek
Når vi utvikler Python, trenger vi to verktøy:
- Et skall
- En teksteditor
Når vi installerer programmeringsspråket Python, følger miljøet IDLE med. IDLE gir oss et skall og en teksteditor.
- Gå til python.org/downloads
- Last ned og installer nyeste Python (
3.x.x
)
Et skall lar oss skrive en linje og tolke den.
Tre piler (>>>
) dukker automatisk opp i skallet. Når vi skriver tre piler her:
>>> 4 + 4
8
skal du skrive 4 + 4
og trykke enter.
Vi åpner teksteditoren ved å lage en ny fil fra Python-skallet:
File
--> New file
(Ctrl+N
) gir oss en tom fil:
Først lagrer vi filen der vi vil ha den, og kaller den hello.py
...
... så kjører vi den for å se at alt er i orden ...
... og en tom fil gjør ... ingenting.
- Tilordner verdier til navn, for gjenbruk
>>> navn = "Alexander Perry"
>>> navn
'Alexander Perry'
>>> alder = 27
>>> alder
27
-
Lagre alderen til 3 familiemedlemmer i variabler
tim_age = 19 teodor_age = # ... # ... og så videre # Dette er en kommentar. Python ignorerer # alt som kommer etter en hash (#)
- ... og test at du får tilgang til variablene i skallet.
-
Lagre summen av alderene i en variabel
- ... og test at du får tilgang til summen i skallet.
-
Lagre gjenomsnittet av alderene i en variabel
- ... og test at du får tilgang til gjennomsnittet i skallet.
>>> navn1 = "Alexander"
>>> navn2 = "Teodor"
>>> navn1 + navn2
>>> navn1 = "Alexander"
>>> navn2 = "Teodor"
>>> navn1 + navn2
'AlexanderTeodor'
>>> navn1 = "Alexander"
>>> navn2 = "Teodor"
>>> navn1 + " " + navn2
'Alexander Teodor'
Fra XKCD.
Hvis x
, gjør y
.
Følgende i fil:
aar = 2001
print("Over if")
if aar > 2000:
print("Over 2000!")
print("Under if")
gir følgende ut:
Over if
Over 2000!
Under if
Dokumentasjonen til Python 2.7 eller Python 3.5 forklarer hvordan å bruke æøå i fil.
Hvis ikke x
, gjør ingenting.
Følgende i fil:
aar = 1999 # Bruker ikke norske bokstaver
print("Over if")
if aar > 2000:
print("Over 2000!")
print("Under if")
gir følgende ut:
Over if
Under if
Følgende i fil:
aar = 1999 # Bruker ikke norske bokstaver
print("Over if")
if aar > 2000:
print("Over 2000!")
else:
print("Under 2000!")
print("Under if")
gir følgende ut:
Over if
Under 2000
Under if
Lag et program som
- Lagrer en alder i en variabel
- Skriver ut "Du er ikke gammel nok" dersom alderen er under 18 år
Den viktigste byggeblokken i programmene vi skriver.
Definér hei()
i en fil:
def hei():
return "Hei!"
og test den i skallet:
>>> hei
<function hei at 0x7f8c0f5005f0>
>>> hei()
'Hei!'
fordi funksjoner er viktig.
Definerer i fil:
def tusen():
t = 10 * 1000
return t
Vi bruker variabler i funksjoner for å splitte arbeidet i mindre biter.
... og tester i skallet:
>>> tusen
<function tusen at 0x7f8c0f500668>
>>> tusen()
1000
Funksjoner må defineres før de brukes.
message = hei()
def hei():
return "Hei!"
gir
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "func_fail.py", line 1, in <module>
message = hei()
NameError: name 'hei' is not defined
Funksjoner må defineres før de brukes.
def hei():
return "Hei!"
message = hei()
er OK.
- En parameter er et navn som "sendes" inn i funksjonen:
- Funksjonen
f
if(x)
harx
som parameter - Funksjonen
g
ig(x,y)
harx
ogy
som parametre
- Funksjonen
def f(x):
return x + 1
def g(x,y):
return (x + 1) * y
- Å parametrisere er å endre kode til å bruke funksjoner og parametre.
# Ikke parametrisert kode
a = 3 * (10 + 1) * (10 + 2)
b = 3 * (11 + 1) * (11 + 2)
a = 3 * (12 + 1) * (12 + 2)
a = 3 * (14 + 1) * (14 + 2)
# Parametrisert kode
def f(x):
return 3 * (x + 1) * (x + 2)
a = f(10)
b = f(11)
a = f(12)
a = f(13)
def er_myndig(alder):
if alder > 17:
return "Du er myndig!"
else:
return "Du er ikke myndig :("
>>> er_myndig(18)
'Du er myndig!'
def addition(tall1, tall2):
return tall1 + tall2
>>> addition(2, 3)
5
- Lag en kalkulator som tar inn to tall og en operator, og som returnerer svaret
- Prøv med operatorene +, -, * og \
Tips: Bruk if-setninger!
>>> kalkulator("*", 3, 4)
12
- Kommunikasjon med verden uten å bruke IDLE
- ... Når andre enn du skal bruke programmet ditt!
navn = input("Hva heter du?")
print(navn)
- Funksjonen
input()
gir ut tekst - Funksjonen
int()
konverterer tekst til tall
age_text = input("How old are you? ")
age = int(age_text)
- Funksjonen
str()
konverterer tall til tekst
age_text = input("How old are you? ")
age = int(age_text)
# Obs: "in five " + "years" blir "in five years"!
print("In five years, you are " + str(age + 5) + " years old!")
Nå skal vi utvide oppgaven fra tidligere. I stedet for å lagre alderen til familiemedlemmer i programmet, spør brukeren! Skriv så ut gjennomsnitt og total alder.
Funksjoner vi har brukt:
input() # Spør brukeren
int() # Konverterer fra tekst til tall
str() # Konverterer fra tall til tekst
print() # Forteller brukeren noe
navn = input("Hva heter du?")
print(navn)
- Lister lar oss samle mange verdier
- Google gir oss en liste av søkeresultater
- Facebook har lister over e-postadresser
>>> mine_tall = [1,2,3,42,1337,-55]
>>> mine_tall
[1, 2, 3, 42, 1337, -55]
>>> mine_tall[0]
1
>>> mine_tall[-1]
-55
>>> mine_tall[-3]
42
>>> len(mine_tall)
6
>>> mine_tall[6-1]
-55
>>> mine_tall = [1,2,3,42,1337,-55] # Samme som før
>>> mine_tall[6]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> mine_tall
[1, 2, 3, 42, 1337, -55]
>>> mine_tall[2:]
[3, 42, 1337, -55]
>>> mine_tall[:2]
[1, 2]
>>> mine_tall[2]
3
>>> [1, 2, 3] + [10, 11, 12]
[1, 2, 3, 10, 11, 12]
Gjør følgende i Python-skallet:
- Lag en liste som inneholder 5 tall
- Hent første tall
- Hent nest siste tall
Tips: list[-3]
henter element 3 bakfra!
- Kjører en kodesnutt så lenge et gitt uttrykk er sant
- Kan kjøre evig, og avbrytes med break
print("Dette er en huskeliste-app")
huskeliste = []
while True:
svar = input("Legg til noe på huskelisten: ")
huskeliste.append(svar)
print(huskeliste)
Lag et multiplikasjonsspill!
- Be brukeren gange to tall
- Sjekk svaret!
- Gjør dette mange ganger ...
while
?
Tilfeldige tall:
from random import randint
x = randint(0, 6) # gir x = 0, x = 1, ..., eller x = 5
for
gjør noe med hvert element i en liste:
>>> numbers = [1,2,42]
>>> for number in numbers: print(number)
...
1
2
42
>>> for number in numbers: print(2*number)
...
2
4
84
For på én linje er fint i skallet:
>>> for number in numbers: print number
I kildekode legger vi for
over flere linjer:
mange_tall = [101,102,103]
for x in mange_tall:
print(x)
print("Hei!")
skriver ut
101
Hei!
102
Hei!
103
Hei!
mange_tall = [101,102,103]
for x in mange_tall:
print(x)
print("Hei!") # Fjernet indent --> * Ikke del av for
# * Kjøres én gang, _etter_ at
# for er ferdig!
skriver ut
101
102
103
Hei!
>>> range(4)
[0, 1, 2, 3]
>>> range(2,4)
[2, 3]
>>> for n in range(4): print n*n
...
0
1
4
9
- Bruk en
for
-løkke til å skrive ut 7-gangeren. - Ønsket output:
0
7
14
21
28
35
42
49
56
63
70
Løsningsforslag:
for n in range(0, 11):
print(7*n)
mange_tall = [1,2,3,4,5,6,7,8,9]
for tall in mange_tall
print("Sjekker om " + str(tall) + " er et partall")
if tall % 2:
print(str(tall) + " er et oddetall")
else:
print(str(tall) + " er et partall")
- Bruk mattespillet du allerede har laget
- I stedet for uendelig mange oppgaver, gi brukeren 5 oppgaver!
Spill og illustrasjon er hentet fra den strålende boka "Land of Lisp" av Conrad Barski, og tilpasset Python.
Musikkvideo:
<iframe width="560" height="315" src="https://www.youtube.com/embed/HM1Zb3xmvMc" frameborder="0" allowfullscreen></iframe>Slik kan det fungere ...
Sider under beskriver hvordan gjettespillet kan implementeres. Prøv først selv, og gå videre nedover om du trenger et tips!
Gitt at vi har en øvre og nedre grense, kan vi gjette at tallet ligger midt i mellom:
# Gjettespill!
low = 0
high = 100
def guess():
total = high + low # f.eks 75 + 50 = 125
average = total / 2 # 125/2 = 62.5
next_guess = int(average) # int(62.5) = 62
return next_guess
Hvordan fungerer denne? Vi kjører modulen i IDLE, så vi kan leke med verdiene.
>>> guess
<function guess at 0x7fee85ff9840>
Wops, guess var en funksjon. Vi trenger paranterser for å kalle en funksjon:
>>> guess()
50
>>> high
100
>>> low
0
... så low starter på 0, og high på 100. Hva om vi endrer på dette?
>>> low = 75
>>> guess()
87
>>> # Hemmelig tall er 42!
>>> guess()
50
>>> lower()
24
>>> higher()
37
>>> higher()
43
>>> lower()
40
>>> higher()
41
>>> higher()
42
Vi svarer datamaskinen ved å kalle funksjonen lower()
eller higher()
:
def lower():
# global lar oss endre en global variabel
# inne i en funksjon
global high
high = guess() - 1
return guess()
def bigger():
global low
low = guess() + 1
return guess()
>>> # Guessing 77
>>> guess()
50
>>> higher()
75
>>> higher()
88
>>> lower()
81
>>> lower()
78
>>> lower()
76
>>> higher()
77
>>> correct()
'Yippie!!!'
Gratulerer, dere har nå implementert et binærsøk! Binærsøk er en av grunnene til at Google-søk er raske.
-
På min maskin ligger Abaqus' Python på
C:\SIMULIA\CAE\2016\win_b64
\code\bin\python.exe
-
Store deler av Abaqus CAE er skrevet i Python, og kjører på en tilpasset Python-plattform.
-
Når vi kjører kode på Abaqus' Python-plattform, får vi tilgang til å lage bokser, endre en CAE-modell og hente ut data fra ODB-er.
Du har allerede en Python-tolker! >>>
tyder på at du kan skrive Python.
Lag en ny Python-fil på valgfri måte
Trykk Run Script
og og velg scriptet ditt:
Hva du skriver ut med print
dukker opp her:
og ting du definerer i filen blir tilgjengelig fra skallet:
Jeg bruker Github Atom. Denne er god.
Modeller fritt opplagt plate i Abaqus: plate.cae
- Størrelse: 4m x 6m x 200 mm.
- Dekke: 0.2 m betong, E=30e9 Pa, ν=0.2
- Dimensjonerende last: 10 kN/m2
Gjør om til script
Kopier journal (plate.jnl
) til generate_single_plate.py
.
Endre koden til å generere en annen modell:
- Modellnavn
plate_4_6_0.26_20000
- Tykkelse 260 mm
- Last 20 kN/m2
Parametriser over tykkelse og kraft
- Kopier
generate_single_plate.py
tilgenerate_multiple_plates.py
- Trekk ut tykkelse og kraft som variabler
- Generer 9 parts i samme modell:
- Tykkelse 150 mm, 200 mm eller 260 mm
- Kraft 7 kN/m2, 10 kN/m2 eller 20 kN/m2
- Lag navn fra parametre:
plate_4_6_160_7000
plate_4_6_160_10000
plate_4_6_160_10000
plate_4_6_200_7000
plate_4_6_200_10000
...
Len deg tilbake og nyt hva du har fått til.
Muligheter videre:
- Generer jobb for hver modell
- Kjør jobber
- Åpne ODB og sammenlikne!
"Scripting" er grunnleggende funksjonalitet. Nyttig til små og store prosjekter.
- Abaqus Scripting User's Guide går gjennom hvordan hvordan du gjør ting som å generere CAE-modeller og manipulere view i en ODB
- Abaqus Scripting Reference Guide lister opp alle funksjoner og klasser for programmering av CAE og ODB-modulene og definerer hva de gjør
"GUI" er grafikk til større programmer.
- Abaqus GUI Toolkit User's Guide går gjennom hvordan hvordan du kan lage grafiske grensesnitt som ANDIM og PROCESS-PLUGIN
- Abaqus GUI Toolkit Reference Guide lister opp alle funksjoner og klasser for programmering av grafikk
Dynamo bruker et bibliotek som heter IronPython. IronPython er en python-implementasjon som kjører på .NET. Det vil typisk si at Dynamo inneholder en fil som heter python.dll
, som kan tolke Python-script.
Script du skriver kjøres i et modifisert miljø, der variabelen IN
automagisk inneholder hva du kobler til scriptet ditt på venstre side og variabelen OUT
hva du vil sende ut på høyre side.
Python-script lagres inne i Dynamo-filer (.dyn
).
Fra høyreklikk:
Fra funksjonslisten:
Dobbeltklikk "nede" i boksen:
Hva kommer inn, hva går ut?
Kobler på en Number Slider
:
Jeg bruker Github Atom. Denne er god.
Definer en momentdiagrammet matematisk for en fritt opplagt bjelke med jevnt fordelt last.
- Bjelkelengde: L [m]
- Linjelast: q [N/m]
- Avstand fra venstre opplegg: x [m]
M(L,q,x) = ...
Hva er M(8,30000,3)?
Implementer M(L,q,x)
i en python-fil
def M(L,q,x):
# Regn ut moment!
moment = # ... unngår å bruke navnet på funksjonen (M)
return moment
- Hva beregner funksjonen din for
M(8,30000,3)
? Test i IDLE. - Kopier funksjonen din inn i en
Python Script
-node i Dynamo. - Deifinér q, L og x med slidere, og koble på. Får du samme svar i IDLE og Dyanmo?
Endre Python-koden til å ta inn en liste av x-verdier
Oppgaven kan løses med funksjonen map
. Gjør først oppgaven i fil, og test i IDLE.
>>> def addone(x): return x + 1
...
>>> addone(5)
6
>>> addone(6)
7
>>> addone(7)
8
>>> map(addone, [5,6,7])
[6, 7, 8]
Behandle liste av x-verdier i Dynamo
-
Generer liste av gyldige x-verdier (0 <= x <= L).
Bruk
Number
til å definere 0 og steg, ogRange
til å generere liste. -
Endre Python-koden til å ta inn en liste av x-verdier i stedet for en enkelt x-verdi.
-
Får du fremdeles samme verdi av
M(8,30000,3)
?
Vis momentdiagrammet med streker.
- Bruk
Point.ByCoordinates
for å lage punkter - Bruk
PolyCurve.ByPoints
for å lage streker
Velg passe skala. 50 000 meter er litt mye. 50 kNm <--> 1 m OK?
Nå skal vi velge høyde på bjelken. Dette gjør vi enkelt:
- Regner ut nødvendig indre momentarm
d
- Legger på
100 mm
for å få ca nødvendig høyde
Vi neglisjerer effekt fra skjærkrefter.
Definer en matematisk funksjon for berening av nødvendig høyde.
- Armeringsmengde As [m2]
h(L,q,As,x) = ...
- Hva er h(8,30000,3,0.00164)?
- Implementer
h(L,q,As,x)
i Python:
def h(L,q,As,x):
moment = M(L,q,x)
height = # ... unngår å bruke navnet på funksjonen (h)
return height
-
Hva beregner funksjonen din for
h(8,30000,3,0.00164)
? -
Test i IDLE, og implementer i Dynamo.
- Tegn faktiske tverrsnitt i stedet for konturer
- Visualiser i Revit i stedet for direkte i Dynamo
- Spis elefanten én bit av gangen
- Du må selv skrive kode om du skal lære programmering
- Disse sidene ligger på
http://teodorlu.github.io/python-intro/
, og blir her. - Kodeklubbens nettsider har mange gode oppgaver på norsk. To spennende spill:
- Learn Python the Hard Way er dyptgående, grundig og lærerik.
-
Github Atom er en meget god teksteditor til Python.
En teksteditor er et godt valg for å redigere én fil. Jeg bruker Atom til nesten alt jeg skriver av Python-kode.
-
PyCharm er et godt IDE til Python.
IDE-er er større og mer kompliserte enn teksteditorer. PyCharm kan være et godt valg til større prosjekter. Jeg bruker delvis PyCharm når jeg utvikler på ANDIM.