Göm meny
Gäller för: HT23

Extramaterial om Python


Här hittar du trevliga Python-konstruktioner som inte nödvändigtvis finns i andra programmeringsspråk.

Läsa från textfil

Det finns många olika sätt att läsa data från en fil i Python. Vilket sätt som är “bäst” beror på kontexten.

I lektion 2 används följande som “standardsätt” att läsa och bearbeta rader från en fil:

file = open(path)
lines = file.readlines()
file.close()
for line in lines:
    # skriv din kod här
    pass

Loopa genom öppen fil

Vi kan också använda en for-loop direkt på en öppen textfil:

file = open(path)
for line in file:
    # skriv din kod här
    pass
# stäng filen efter när du är klar
file.close()

Det pythonska sättet

Ett mer pythonskt sätt är att använda kontexthanterare i Python (context manager):

with open(path) as file:
    for line in file:
        # skriv din kod här
        pass

Konstruktionen bygger på att objektet (den öppna filen i detta fall) implementerar metoderna __enter__() och __exit__(). Dessa metoder anropas när vi går in i with-blocket (__enter__()), samt när vi lämnar with-blocket (__exit__()).

Med hjälp av denna konstruktion kan den öppna filen stänga sig själv när vi går ut ur kontexten. Koden blir också mer lättläst och det blir tydligt var filen används.

Villkor på en rad

if x == y:
    z = 10
else:
    z = 0

kan skrivas som

z = 10 if x == y else 0

Mer generellt:

<uttryck A> if <sanningsvärde> else <uttryck B>

I första exemplet motsvaras <uttryck A> av värdet 10, inte z = 10.

is

Skillnaden mellan is och ==

Skillnaden mellan operatorn is och == är att is svarar på om två symboler refererar till samma objekt, medan == jämför det beräknade värdet för två objekt.

Exempel

>>> l1 = [1, 2, 3]
>>> l2 = [1, 2, 3]
>>> l1 == l2
True
>>> l1 is l2
False

När används is?

Vill du kontrollera om något är lika med något annat, använd ==. is kan du använda när du vill kontrollera om något är None (det finns bara ’ett’ None värde).

# funktionen get_price(a_thing) returnerar None om a_thing inte finns i
# prislistan
if get_price("cup") is None:
    pass

Om du har ett sanningsvärde är det bättre att bara använda det, dvs skriv hellre

if power_on:
    print("The machine is on.")

och skriv inte

if power_on == True:
    print("The machine is on.")

Skälet är i huvudsak att det är lättare att läsa det förstnämnda, i andra hand att det senare utför en onödig jämförelseoperation.


Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2024-07-26