Programmering i Python

Norconsult - Sandvika 2016

Hva ser jeg nå?

Nettleseren Chromium som viser nettsiden http://teodorlu.github.io/python-intro/ i fullskjerm.

Gå inn her på egen maskin! Da kan du se tidligere lysbilder, og er ikke avhengig av hvor vi er.

Hva gjør jeg nå?

Du er på Python-kurs! Kurs med fartstid:

Intensjon for presentasjon

  • Ryddig første vei inn i Python-programmering

  • Referanse til videre bruk.

Hvem er vi?

Teodor Heggelund

Alexander Perry

Hvorfor Python?

For begynnere

Forståelig syntaks med lite støy:

>>> navn = "Teodor"
>>> navn
'Teodor'
>>> "Hei! Jeg heter " + navn
'Hei! Jeg heter Teodor'

og viderekommende

  • Støtter imperativ, objektorientert og funksjonell programmering
  • Knallgodt standardbibliotek

Driver New York Times

Brukes av NASA

Brukes av Google

Verktøy

Hva trenger vi?

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.

Last ned Python

  1. Gå til python.org/downloads
  2. Last ned og installer nyeste Python (3.x.x)

Python-skallet i IDLE

Et skall lar oss skrive en linje og tolke den.

Python-skallet i IDLE

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.

Teksteditoren i IDLE

Teksteditoren i IDLE

Vi åpner teksteditoren ved å lage en ny fil fra Python-skallet:

File --> New file (Ctrl+N) gir oss en tom fil:

Teksteditoren i IDLE

Først lagrer vi filen der vi vil ha den, og kaller den hello.py ...

Teksteditoren i IDLE

... så kjører vi den for å se at alt er i orden ...

Teksteditoren i IDLE

... og en tom fil gjør ... ingenting.

Variabler

Hva er en variabel?

  • Tilordner verdier til navn, for gjenbruk

Variabler i Python

>>> navn = "Alexander Perry"
>>> navn
'Alexander Perry'
>>> alder = 27
>>> alder
27

Oppgave: familiens alder

  • 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.

Tekstmanipulering

>>> navn1 = "Alexander"
>>> navn2 = "Teodor"
>>> navn1 + navn2

Tekstmanipulering

>>> navn1 = "Alexander"
>>> navn2 = "Teodor"
>>> navn1 + navn2
'AlexanderTeodor'

Tekstmanipulering

>>> navn1 = "Alexander"
>>> navn2 = "Teodor"
>>> navn1 + " " + navn2
'Alexander Teodor'

Stemningen i Python

Fra XKCD.

If

Hvis sant, ...

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 usant, ...

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

... ellers

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

Oppgave: Gammel nok?

Lag et program som

  • Lagrer en alder i en variabel
  • Skriver ut "Du er ikke gammel nok" dersom alderen er under 18 år

Funksjoner

En Python-funksjon

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!'

En funksjon til

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

Bruke funksjoner

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

Bruke funksjoner.

Funksjoner må defineres før de brukes.

def hei():
    return "Hei!"
message = hei()

er OK.

Parameter

  • En parameter er et navn som "sendes" inn i funksjonen:
    • Funksjonen f i f(x) har x som parameter
    • Funksjonen g i g(x,y) har x og y som parametre
def f(x):
  return x + 1

def g(x,y):
  return (x + 1) * y

Parametrisering

  • Å 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)

Myndig

def er_myndig(alder):
    if alder > 17:
        return "Du er myndig!"
    else:
        return "Du er ikke myndig :("

Myndig

>>> er_myndig(18)
'Du er myndig!'

Kalkulator

def addition(tall1, tall2):
    return tall1 + tall2

Kalkulator

>>> addition(2, 3)
5

Oppgave

  • 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

Input / output

Hva er input / output?

  • Kommunikasjon med verden uten å bruke IDLE
  • ... Når andre enn du skal bruke programmet ditt!

Input / output i Python

navn = input("Hva heter du?")
print(navn)

Å lese inn tall

  • Funksjonen input() gir ut tekst
  • Funksjonen int() konverterer tekst til tall
age_text = input("How old are you? ")
age = int(age_text)

Å skrive ut tall

  • 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!")

Oppgave: familiens alder 2

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

Hva er lister?

  • Lister lar oss samle mange verdier
  • Google gir oss en liste av søkeresultater
  • Facebook har lister over e-postadresser

Lister i Python

>>> 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

Lister i Python 2

>>> 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]

Oppgave: elementer fra liste

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!

While

Hva er while-løkker?

  • Kjører en kodesnutt så lenge et gitt uttrykk er sant
  • Kan kjøre evig, og avbrytes med break

While-løkker i Python

print("Dette er en huskeliste-app")
huskeliste = []

while True:
    svar = input("Legg til noe på huskelisten: ")
    huskeliste.append(svar)
    print(huskeliste)

Oppgave: mattespill!

Lag et multiplikasjonsspill!

  1. Be brukeren gange to tall
  2. Sjekk svaret!
  3. 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

Hvorfor?

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 i skallet

For på én linje er fint i skallet:

>>> for number in numbers: print number

For i kildekode 1

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!

For i kildekode 2

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!

Gjør noe n ganger

>>> range(4)
[0, 1, 2, 3]
>>> range(2,4)
[2, 3]
>>> for n in range(4): print n*n
...
0
1
4
9

Oppgave: 7-gangeren

  • Bruk en for-løkke til å skrive ut 7-gangeren.
  • Ønsket output:
0
7
14
21
28
35
42
49
56
63
70

Oppgave: 7-gangeren

Løsningsforslag:

for n in range(0, 11):
  print(7*n)

Flere for-løkker i Python

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")

Oppgave: mattespill 2!

  • Bruk mattespillet du allerede har laget
  • I stedet for uendelig mange oppgaver, gi brukeren 5 oppgaver!

Programmer ditt eget gjettespill!

Hø?

Takk til Barski

Spill og illustrasjon er hentet fra den strålende boka "Land of Lisp" av Conrad Barski, og tilpasset Python.

Musikkvideo:

Demo

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!

Gjettefunksjon

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

Prøve gjettefunksjon

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

Prøve gjettefunksjon

>>> high
100
>>> low
0

... så low starter på 0, og high på 100. Hva om vi endrer på dette?

>>> low = 75
>>> guess()
87

Lavere? Høyere?

>>> # Hemmelig tall er 42!
>>> guess()
50
>>> lower()
24
>>> higher()
37
>>> higher()
43
>>> lower()
40
>>> higher()
41
>>> higher()
42

Lavere? Høyere?

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()

Hva når vi vinner?

>>> # Guessing 77
>>> guess()
50
>>> higher()
75
>>> higher()
88
>>> lower()
81
>>> lower()
78
>>> lower()
76
>>> higher()
77
>>> correct()
'Yippie!!!'

"Binærsøk"

Gratulerer, dere har nå implementert et binærsøk! Binærsøk er en av grunnene til at Google-søk er raske.

Python og Abaqus

Arkitektur 1

Arkitektur 2

  • 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.

Abaqus Python i CAE

Du har allerede en Python-tolker! >>> tyder på at du kan skrive Python.

Abaqus Python i CMD

Kjøre filer i Abaqus 1

Lag en ny Python-fil på valgfri måte

Kjøre filer i Abaqus 2

Trykk Run Script

Kjøre filer i Abaqus 3

og og velg scriptet ditt:

Kjøre filer i Abaqus 4

Hva du skriver ut med print dukker opp her:

Kjøre filer i Abaqus 5

og ting du definerer i filen blir tilgjengelig fra skallet:

Alternativ Python-editor

Jeg bruker Github Atom. Denne er god.

Oppgave A: Abaqus

Oppgave del A1

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

Oppgave del A2

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

Oppgave del A3

Parametriser over tykkelse og kraft

  • Kopier generate_single_plate.py til generate_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
...

Ferdig alt?

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!

Ressurser for Python og Abaqus

Ressurser for Python og Abaqus

"Scripting" er grunnleggende funksjonalitet. Nyttig til små og store prosjekter.

Ressurser for Python og Abaqus

"GUI" er grafikk til større programmer.

Python og Dynamo

Arkitektur

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).

Starte Dynamo

Python-noden

Fra høyreklikk:

Python-noden

Fra funksjonslisten:

Redigere script

Dobbeltklikk "nede" i boksen:

IN og OUT

Hva kommer inn, hva går ut?

Teste script

Kobler på en Number Slider:

Alternativ Python-editor

Jeg bruker Github Atom. Denne er god.

Oppgave D: Dynamo

Oppgave del D1

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)?

Oppgave del D2

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
  1. Hva beregner funksjonen din for M(8,30000,3)? Test i IDLE.
  2. Kopier funksjonen din inn i en Python Script-node i Dynamo.
  3. Deifinér q, L og x med slidere, og koble på. Får du samme svar i IDLE og Dyanmo?

Oppgave del D3

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]

Oppgave del D4

Behandle liste av x-verdier i Dynamo

  1. Generer liste av gyldige x-verdier (0 <= x <= L).

    Bruk Number til å definere 0 og steg, og Range til å generere liste.

  2. Endre Python-koden til å ta inn en liste av x-verdier i stedet for en enkelt x-verdi.

  3. Får du fremdeles samme verdi av M(8,30000,3)?

Oppgave del D5

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?

Oppgave del D6

Nå skal vi velge høyde på bjelken. Dette gjør vi enkelt:

  1. Regner ut nødvendig indre momentarm d
  2. 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)?

Oppgave del D7

  • 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.

Dynamo: Muligheter videre

  • Tegn faktiske tverrsnitt i stedet for konturer
  • Visualiser i Revit i stedet for direkte i Dynamo

Tegn bjelke!

Veien videre

Lykke til!

  • Spis elefanten én bit av gangen
  • Du må selv skrive kode om du skal lære programmering

Videre ressursser

Videre verktøy

  • 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.