Programmeringssprog som Python er samlinger af kommandoer, som vi kan give en mobil eller computer.
En kommando kan f.eks. være "tænd lyset", "sluk lyset" eller "tæl til 1000". Sat sammen kan de give "tænd og sluk lyset 1000 gange".
Som programmør lærer man de forskellige kommandoer, og sætter dem sammen i forskellige rækkefølger.
Programmører bruger f.eks. Google eller ChatGPT til at finde ud af hvilke kommandoer der findes.
(eksempel på en google-søgning)
Normalt når en programmør skriver kode, er det i en eller flere filer, hvor hver linje er en kommando. Når filen gemmes, viser endelsen på filnavnet (filformatet), hvilket programmeringssprog der skrives i.
F.eks. kan et python script gemmes som myscript.py
.py viser at der er skrevet i Python.
Her er en liste med forklaringer og opgaver til de vigtigste kommandoer i Python:
print('Hello World!')
I python bruges print( ) til at skrive information til terminalen.
Det du putter ind i (parentesen) vil blive spyttet ud i terminalen 🖳.
Prøv at bruge print( ) her:
TIP: Hvis du vil printe tekst, skal du huske at sætte "gåseøjne" eller 'apostroffer' omkring.
Som ny programmør er print( ) et nemt værktøj til at finde frem til fejl i sin kode. Det kan gøres ved at indsætte prints som "checkpoints" i koden, så man kan se hvornår koden går i stå.
Kod et script der kan printe:
o
/|\
/ \
# ↓ navn
name = 'Python'
# ↑ værdi
En variabel består af et navn og en værdi.
Vi laver en variabel med et lighedst=gn. Til venstre for lighedstegnet er navnet, og til højre er værdien. Navnet forbliver det samme, men værdien kan vi ændre senere.
I eksemplet har variablen navnet name og værdien 'Python'.
Nu kan vi henvise til variablen name i vores print().
name = 'Python'
print(name)
Hvad tror du bliver printet til terminalen?
Hvad printer scriptet her?
name = 'Python'
print(name)
name = 'Hugorm'
print(name)
Kod 2 forskellige variable, og print dem
Indtil videre har vi kun arbejdet med 'strings'
"Hello World" # string
'Hello World' # also string
I programmering er typen af data vigtig.
De mest normale typer er:
"I am text" # string
25 # integer
7.5 # float
True # boolean
name = "Python Expert"
age = 25
shoesize = 7.5
awake = True
faults = None
( None er vores datatype for ingenting i Python. )
1. Lav et script med 4 variable med forskellige navne
2. Sæt hver variabel til en datatype (mindst én af hver type)
3. Lav følgende regnestykker med forskellige datatyper:
batman = "Na" # str
gotham = 11 # int
print( batman * gotham ) # str * int
Skriv ned hvad du får af svar og fejlbeskeder.
Kan du finde på flere kombinationer af regnstykker med datatyper?
(Gruppediskussion):
Sammenlign jeres resultater. Hvordan giver de mening?
Det er rart at kunne træffe beslutninger på baggrund af information, f.eks.:
Hvis 🌧️ → husk ☂️
Hvis ☀️ → husk 🕶️
I programmering gør vi dette med if-else-statements til ting som
Hvis 0 liv → Game Over
if condition:
# do thing
else:
# do other thing
condition skal udskiftes med et udtryk der giver enten True eller False (sand/falsk). Det vi tidligere lærte hed en boolean.
En simpel condition kan være en sammenligning af to værdier, f.eks.
5 > 3 (er 5 større end 3)
3 > 10 (er 3 større end 10)
5 == 3 (er 5 lig med 3)
'this' == 'this' (er 'this' lig med 'this')
'this' == 'that' (er 'this' lig med 'that')
Sammenligninger på den måde er smart til at kontrollere variable:
age = 20
if age > 15:
print('🍺')
else:
print('🧃')
Andre eksempler på conditions der giver True eller False:
'myname'.startswith('my')
'hi' in 'this'
type('mystring') is int
type('mystring') is str
Kan du regne ud hvorfor?
day = input('What day is it?')
if day == 'monday':
print('☕')
highscore = 0
score = 5
if score > highscore:
highscore = score
answer = input("What's up?")
if 'fuck' in answer:
print('Hov hov, ikke bande!')
Hack scriptet ved at ændre variable og conditions indtil alle 7 if-statements bliver True
import random
roll = random.randint(1, 6)
print(roll)
Tilfældigheder gør livet sjovere.
Vi kan lave tilfældige tal ved at importere random biblioteket. Derefter kan vi bruge forskellige funktioner fra biblioteket, alt efter hvilke tilfældige tal vi vil have:
( tip: du kan give dine imports "kælenavne" som her )
import random as r
# float mellem 0.0 og 0.999...
r.random()
# integer mellem 1 og 6
r.randint(1, 6)
# terningekast
import random
dice = random.randint(1,6)
if dice == 6:
print('Winner!')
# møntkast
import random
coin = random.randint(0,1)
if coin == 0:
print('plat')
elif coin == 1:
print('krone')
# weapon attack
import random as r
min_dmg = 1
max_dmg = 415
def attack():
damage = r.randint(min_dmg, max_dmg)
return damage
import time
print('instant')
time.sleep(5) # pause for 5 seconds
print('a bit later')
Tilføj pauser i din kode med sleep().
from time import sleep
# print tallene 0-10 med 1 sekunds mellemrum
for i in range(10):
print(i)
sleep(1)
answer = input('Who are you?')
print(answer)
Hvordan taler vi med et script?
Der er mange måder at lave input til et Python script. Den første vi kigger på er direkte fra terminalen via input( ) funktionen:
name = input('What is your name?')
print('Hello ' + name)
Vi kan kombinere input med if-else for at lave et simpelt gættespil:
import random
guess = input('Guess a number between 1 and 10:')
correct = random.randint(1,10)
if int(guess) == correct:
print("Correct!")
else:
print("Wrong!")
int(guess) konverterer vores input fra en string til en integer
# keyboard
import keyboard
def on_key_event(e):
if e.name == 'a':
print("A pressed")
elif e.name == 'q':
print("Q pressed")
keyboard.on_press(on_key_event)
# Keep the script running
keyboard.wait("esc")
# PS5 controller
from pydualsense import pydualsense, TriggerModes
def cross_pressed(state):
print(state)
ds = pydualsense() # open controller
ds.init() # initialize controller
ds.cross_pressed += cross_pressed
# for-loop
for i in range(5):
print(i)
# while-loop
i = 10
while i > 0:
i -= 1
print(i)
Loops gør livet lettere.
I Python er der mange måder at lave loops. Det alle loops har til fælles, er at være måder vi nemt kan gentage kode.
F.eks. kan vi i stedet for at printe alle tal fra 0 til 6 som her:
print(0)
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
gøre det samme flot og kort med et loop:
for i in range(7):
print(i)
range(7) betyder "alle tal fra 0 til 7 (uden 7)".
Ved at ændre på 7-tallet i range kan vi ændre hvor mange gange loopet gentages.
Vi kan udvide gættespillet fra input()-eksemplet ved at putte noget af koden ind i et loop
import random
correct = random.randint(1,10)
while True:
guess = input('Guess a number between 1 and 10:')
if int(guess) == correct:
print("Correct!")
break
else:
print("Wrong!")
Ved at putte input( ) ind i et while-loop kan vi gentagende gange spørge efter et nyt gæt, indtil spilleren gætter korrekt.
Ordet break stopper et loop
box = {
"height" : 5,
"width" : 15,
"length" : 7,
"name" : "Boxy McBoxface"
}
Dicts er objekter der kan indholde mere end én variabel.
Vi kan trække variable ud af en dict sådan her:
v = box['height'] * box['width'] * box['length']
Hvad bliver v i eksemplet?
Lav dig selv til en dict med så meget data som du kan komme på (mindst 8 ting)
Eksempel:
myself = {
"name" : "Obama",
"age" : 62,
"height" : 187,
"osv.osv.osv." : ...
}
En "function" kan godt lyde som noget svært og matematisk, men i programmering er det bare en måde at give et navn til et stykke kode, så det er nemt at genbruge.
def stickman():
print(' o ')
print(' /|\ ')
print(' / \ ')
Du har faktisk allerede brugt flere functions. Både print(), input() og range() er functions.
Vi laver en function med nøgleordet def, efterfulgt af navnet på din function og et sæt parenteser() og et kolon :
# ↓ navn
def stickman():
# ↑ print(' o ')
# nøgleord print(' /|\ ')
# print(' / \ ')
Når en function er defineret, kan den kaldes:
stickman()
Sæt kaldet af stickman() ind i et loop
Definér en function med navnet ego, der printer dit navn 5 gange. Kald bagefter dit ego() 10 gange, evt. i et loop
import random
def coinFlip():
coin = random.randint(0,1)
if coin == 0:
return 'plat'
elif coin == 1:
return 'krone'
for i in range(10):
print(coinFlip())
Lists eller "Data Structures" er en kasse hvor vi kan opbevare objekter og datatyper, og tilføje/fjerne dem som vi får brug for det.
Det er f.eks. smart til at lave et inventory i et spil, hvor en spiller kan tilføje/fjerne ting.
Eksempelvis starter vi en liste med navne (som strings) sådan her:
mylist = ['Peter', 'Abacus', 'Bobby']
Vi kan også starte listen tom, og bagefter tilføje med .append()
mylist = []
mylist.append('myself')
Andre indbyggede funktioner i lists er bl.a.:
mylist = []
mylist.append('myself') # add to list
mylist.append('you')
mylist.append('stranger')
len(mylist) # get amount of things in list
mylist.index('myself') # get position of thing in list
mylist.remove('stranger') # remove specific thing from list
mylist.clear() # remove everything from list
if 'myself' in mylist: # check if thing is in list
print('I am there')
else:
print('I am gone')
Start en tom liste med navnet mytable og append strings med navnene på dem du sidder ved bord med.
Fjern dig selv fra mytable med .remove og print bagefter mytable.
En class er en slags skabelon for et objekt.
Det kan hjælpe at forestille sig et fysisk objekt, f.eks. en kaffekande.
Vi vil lave en masse kaffekander, og ens for dem alle er at de kan indeholde 1.5 liter. Det skriver vi i Python sådan her:
class CoffeePot:
max_volume = 1.5
Forskelligt for hver kande er hvad vi fylder den med. Det skriver vi sådan her:
class CoffeePot:
max_volume = 1.5
def __init__(self, stuff, amount):
self.content = stuff
self.current_volume = amount
def __init__(self): er en funktion der bliver kaldt når vi "starter" (initialisere) et objekt ud fra vores skabelon.
self er en reference til den kopi af skabelonen vi starter, og den skal startes med et amount af noget stuff.
Det ser sådan her ud når vi vil starte en kaffekande og fylde den med 1.5 liter kaffe:
class CoffeePot:
max_volume = 1.5
def __init__(self, stuff, amount):
self.content = stuff
self.current_volume = amount
my_pot = CoffeePot('coffee', 1.5)
print(f'Contains: {my_pot.current_volume} liter {my_pot.content}')
Vi kan også lave 2 kander, og fylde den ene med kaffe og den anden med te:
class CoffeePot:
max_volume = 1.5
def __init__(self, stuff, amount):
self.content = stuff
self.current_volume = amount
pot1 = CoffeePot('coffee', 1.5)
pot2 = CoffeePot('tea', 1.0)
Vi kan også tilføje funktioner til et objekt. Til en kaffekande kunne det f.eks. være en funktion som tømmer kanden:
class CoffeePot:
max_volume = 1.5
def __init__(self, stuff, amount):
self.content = stuff
self.current_volume = amount
def empty(self):
self.content = None
self.current_volume = 0
( None er vores datatype for ingenting i Python. )
Nu kan vi starte, fylde og efterfølgende tømme en kande:
class CoffeePot:
max_volume = 1.5
def __init__(self, stuff, amount):
self.content = stuff
self.current_volume = amount
def empty(self):
self.content = None
self.current_volume = 0
pot = CoffeePot('coffee', 1.5)
print(pot.current_volume)
pot.empty()
print(pot.current_volume)
Lav en class for en hund eller kat. Hvilke variable er ens for alle kæledyr, og hvad er specielt for dem hver især?
Lav en class der beskriver
Indtil videre har vi kun importeret indbyggede packages.
Vi kan hente og installere ekstra packages med pip.
Start med at åbne en Terminal:
For at hente f.eks art-package skal man skrive:
pip install art
og køre kommandoen ved at trykke [ enter ] .
Når en package er installeret, kan den importeres og bruges i et python script:
import art
udskift art med den package du vil installere og importere.
_ ____ ____ ___ ___ _ ____ _____
/ \ / ___| / ___||_ _||_ _| / \ | _ \ |_ _|
/ _ \ \___ \ | | | | | | / _ \ | |_) | | |
/ ___ \ ___) || |___ | | | | / ___ \ | _ < | |
/_/ \_\|____/ \____||___||___| /_/ \_\|_| \_\ |_|
Text Art
import art
art.tprint("coolname")
art.tprint("coolname", "rnd-xlarge")
Andre metoder
import art
art.aprint("butterfly") # print butterfly art
art.aprint("happy") # print happy art
art.aprint("random") # print random art
Find flere funktioner på GitHub ↘
GitHub I/OInput : text (str)
Output : terminal print , str
import pypokedex
pokemon1 = pypokedex.get(dex=25) # dex is a pokémon id number
pokemon2 = pypokedex.get(name='Bulbasaur') # name is the name of a pokemon
print(pokemon1.name)
print(pokemon2.dex)
Hent Pokémon ud fra navn (name) eller id (dex)
import pypokedex
import webbrowser
pokemon = pypokedex.get(dex=25)
sprite = pokemon.sprites.front['default']
webbrowser.open(sprite)
Hent Pokémon og åben dens sprite (billede) med webbrowser
Kod et script der:
Find flere funktioner på GitHub ↘
GitHub I/OInput : name (str) , dex (int)
Output : info (dict)
pokemon.name # str
pokemon.dex # int
pokemon.weight # int
pokemon.height # int
pokemon.types # [str, str]
pokemon.sprites.front['default'] # image url str
from phue import Bridge
bridge_ip = "your_bridge_ip_here"
lamp = "your_lamp_name"
b = Bridge(bridge_ip)
b.connect()
b.set_light(lamp, 'on', True) # True / False
b.set_light(lamp, 'bri', 254) # 0-254
b.set_light(lamp, 'hue', 100) # 0-65535
b.set_light(lamp, 'sat', 200) # 0-254
Brug ovenstående script til at forbinde til Philips Hue lamper.
Er du i vores Makerspace skal bridge_ip være:
192.168.8.187
Indstil lyset ved at skrue på:
from phue import Bridge
bridge_ip = "192.168.8.105"
lamp = "orange-table-p"
b = Bridge(bridge_ip)
b.connect()
b.set_light(lamp, 'on', True) # True / False
b.set_light(lamp, 'bri', 254) # 0-254
b.set_light(lamp, 'hue', 8000) # 0-65535
b.set_light(lamp, 'sat', 254) # 0-254
Kod et script der får lys til at...
(Gruppediskussion): Giver jeres resultater mening?
Input : brightness (int), hue (int), saturation (int)
Output :
COLORS!
import pyautogui
screenimg = pyautogui.screenshot() # take screenshot
screenimg.save('my_screenshot.png') # save screenshot
pyautogui.click() # click mouse at its current location.
import pyautogui
currentMouseX, currentMouseY = pyautogui.position() # Returns two integers, the x and y of the mouse cursor's current position.
pyautogui.moveTo(100, 150) # Move the mouse to the x, y coordinates 100, 150.
pyautogui.click() # Click the mouse at its current location.
pyautogui.click(200, 220) # Click the mouse at the x, y coordinates 200, 220.
pyautogui.move(None, 10) # Move mouse 10 pixels down, that is, move the mouse relative to its current position.
pyautogui.doubleClick() # Double click the mouse at the
pyautogui.moveTo(500, 500, duration=2, tween=pyautogui.easeInOutQuad) # Use tweening/easing function to move mouse over 2 seconds.
pyautogui.write('Hello world!', interval=0.25) # Type with quarter-second pause in between each key.
pyautogui.press('esc') # Simulate pressing the Escape key.
pyautogui.keyDown('shift')
pyautogui.write(['left', 'left', 'left', 'left', 'left', 'left'])
pyautogui.keyUp('shift')
pyautogui.hotkey('ctrl', 'c')
Find flere funktioner på GitHub ↘
GitHub I/OInput : text (str), coordinates (int)
Output : Screenshot (image) , mouseclicks, mouse movement, keyboard typing
import wikipedia
chess = wikipedia.page("Chess")
print(chess.title)
print(chess.url)
print(chess.content)
Åben første billede fra wikipedia artikel
import wikipedia
import webbrowser
chess = wikipedia.page("Chess")
webbrowser.open(chess.images[0])
chess.images er en liste med alle billeder fra artiklen. Vi bruger [0] til at vælge første billede på listen.
Find flere funktioner på GitHub ↘
GitHub I/OInput : article (str)
wiki = wikipedia.page('article') # str input
Output : info (str)
wiki.title # str
wiki.images # list of image url str
wiki.images[0] # str url of first image
wiki.content # str
from AnilistPython import Anilist
anilist = Anilist()
info = anilist.get_anime("Owari no Seraph")
character = anilist.get_character("Pikachu")
print(info)
print(character)
Åben billede af character:
from AnilistPython import Anilist
import webbrowser
anilist = Anilist()
character = anilist.get_character("Pikachu")
webbrowser.open(character['image'])
Find flere funktioner på GitHub ↘
GitHub I/OInput : anime title (str) , character name (str)
Output : info (dict) , image (url str)
from animegifs import animegifs
gifs = animegifs.Animegifs()
category = 'wave' # find other valid categories on GitHub.
gif = gifs.get_gif(category)
print(gif)
Kombinér med åben-link biblioteket:
from animegifs import animegifs
import webbrowser
gifs = animegifs.Animegifs()
gif = gifs.get_gif('wave') # replace wave with a valid category. Check GitHub for other.
webbrowser.open(gif)
Find flere categories på GitHub ↘
GitHub I/OInput : category (str)
Output : image (url str)
from PIL import Image
im = Image.open("cat.gif")
Åben billede/gif (skal være i samme mappe som scriptet)
from PIL import Image
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
Kombinér to billeder
from urllib.request import urlopen
from PIL import Image
url = 'https://craftapp.dk/images/pikachu-cute.gif'
img = Image.open(urlopen(url))
Hent bilede fra link (url)
docs I/OInput : image (file)
Output : image (file), info (int)
from instagrapi import Client
cl = Client()
cl.login(ACCOUNT_USERNAME, ACCOUNT_PASSWORD)
user_id = cl.user_id_from_username(ACCOUNT_USERNAME)
medias = cl.user_medias(user_id, 20)
Find flere funktioner på GitHub ↘
GitHub
reddit = praw.Reddit('bot1') # follow tutorial to setup 'bot1'
subreddit = r.subreddit("learnpython")
for submission in subreddit.hot(limit=5):
print("Title: ", submission.title)
print("Text: ", submission.selftext)
print("Score: ", submission.score)
print("---------------------------------\n")
Følg tutorial for at sætte op ↘
Tutorial
import discord
from discord.ext import commands
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)
@bot.command()
async def ping(ctx):
await ctx.send('pong')
bot.run('token') # follow tutorial to get token
Følg tutorial for at sætte op ↘
Tutorial
import chess
board = chess.Board()
legalmoves = board.legal_moves
if chess.Move.from_uci('e2e4') in board.legal_moves:
Move.from_uci('e2e4')
print(board.is_checkmate())
Find flere funktioner på GitHub ↘
GitHub
import gamble
# create dice, defaults to 2 6-sided dice
dice = gamble.Dice()
r = dice.roll()
print(r)
deck = gamble.Deck()
card = deck.draw()
print(card)
Find flere funktioner på GitHub ↘
GitHubDet betyder kort sagt "der hvor 2 programmer mødes".
Vi bruger API'er til at styre andre programmer eller til at hente data.
https://cat-fact.herokuapp.com/facts
er et eksempel på det vi kalder et API-endpoint.
Prøv at åbne linket i din browser. Kan du finde hovede og hale i hjemmesiden?
Installér en JSON viewer extension til din browser og prøv igen.
Giver det bedre mening nu?
API'er giver information komprimeret og beregnet til at blive brugt i scripts.
Det kan vi f.eks. gøre med python sådan her:
import requests
api_url = 'https://cat-fact.herokuapp.com/facts'
response = requests.get(api_url)
if response.status_code == 200:
data = response.json()
print(data)
data vil være en liste af json objekter:
[
{
"status": {
"verified": true,
"sentCount": 1
},
"_id": "58e008780aac31001185ed05",
"user": "58e007480aac31001185ecef",
"text": "Owning a cat can reduce the risk of stroke and heart attack by a third.",
"__v": 0,
"source": "user",
"updatedAt": "2020-08-23T20:20:01.611Z",
"type": "cat",
"createdAt": "2018-03-29T20:20:03.844Z",
"deleted": false,
"used": false
}
]
Hvis vi vil hente det felt der indeholder dagens fact, kan vi gøre det med:
data[0]['text']
[0] for at vælge første json objekt i listen, og ['text'] for at hente værdien til feltet 'text'.
( Find MANGE andre åbne API'er her )
Bemærk at nogle API'er kræver en nøgle (API-key).
læs mereStyr Philips Hue
Lav en cryptovaluta
3 små øvelser
Lav en Discord bot
Hent vejrdata
3 øvelser om automatisering
click 🎲 to roll a random input/ouput combo
come up with an idea of how to combine them with code
I python bruges # til at indsætte kommentarer i koden.
Alt du skriver på en linje efter et # vil ikke blive læst som kode, når du kører dit script.
Brug #kommentarer til at beskrive dele af koden for dig selv eller andre fremtidige læsere.
#kommentarer er også gode til midlertidigt at fjerne en del af sin kode, uden at skulle slette det helt fra scriptet (smart til debugging).