Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  77 6323
Sitat av Pope Vis innlegg
Det er derfor jeg kompilerer de så de kan brukes uten Python, men jeg synes pyinstaller, py2exe osv er en kålete måte å kompilere på. Finnes det andre måter å kjøre skriptene på, evt. andre måter å kompilere de på?
Vis hele sitatet...
Du kan åpne kommandolinjen og skrive "py sti/til/scripteditt.py". Om du har flere Python-versjoner installert, kan du enten bytte "py" til "py -3" eller inkludere "#! python3" (eller for cross platform-støtte: "#! /usr/bin/python3") som første linje i scriptet for å kjøre Python 3.x.

Men såpass ny Python som du kjører skal inkludere en launcher, og installeringen av den skal automatisk assosiere Python-filer med den. Så du skal kunne kjøre scriptet ved å dobbeltklikke på fila eller bare kjøre "sti/til/scriptetditt.py" i kommandolinjen. Dersom dobbeltklikkingen fører til noe annet i stedet, kan du se om å åpne med launcheren er et alternativ om du høyreklikker og velger "Åpne med..." eller hva det heter.
LEIK
Pope's Avatar
Trådstarter
Ok, da tror jeg kanskje det er Anaconda3/Spyder som roter det til. .py-filer er ikke assosiert med noe som helst på min pc. Dette kan jeg selvsagt gjøre noe med, men jeg har ikke sett noe standalone kommandolinje med installasjonen jeg bruker.
▼ ... over en måned senere ... ▼
LEIK
Pope's Avatar
Trådstarter
Pån igjen

Jeg har to lister med strings, en som inneholder en setning og en annen med visse uønskede bokstaver.

setning = ["Jexg", "hayr", "ezn", "katæt", "soøm", "heteår", "Hans"]
letters = ["x", "y", "z", "æ", "ø", "å"]

Jeg ønsker å lage en funksjon som sjekker om elementer fra letters finnes i setning og erstatter disse uønskede bokstavene med "", slik at resultatet blir ["Jeg", "har", "en", "katt", "som", "heter", "Hans"].

Hvordan får jeg til dette? Har prøvd med doble for-løkker og tror dette kan være veien å gå, men blir så forvirret av å håndtere to lister samtidig. Anyone?

Jeg har et ganske ufullstendig forslag som ikke virker (duh), men er jeg ikke inne på noe her?

Kode

    nySetning = []
    for word in Setning:
        if word in letters:
            word = ""
        nySetning.append(word)
Ser forsåvidt her at nySetning i beste fall blir en blank liste.

Så jeg antar at jeg må bruke en else statement for å appende de ønskede bokstavene til nySetning i tillegg..
Sist endret av Pope; 11. april 2018 kl. 13:33. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Kanskje du kan kjøre en enkel Replace?
Kjedelig Streiting™
Realist1's Avatar
Tja. Mange måter å gjøre dette på. For å prøve å "fikse" din måte, så ville jeg vel kanskje gjort noe som dette:

Kode

setning = ["Jexg", "hayr", "ezn", "katæt", "soøm", "heteår", "Hans"]
letters = ["x", "y", "z", "æ", "ø", "å"]

nySetning = []
for word in setning:
    nyttOrd = ""
    for letter in word:
        if letter not in letters:
            nyttOrd += letter
    nySetning.append(nyttOrd)

nySetning

Kode

new_sentence = []
for word in sentence:
    for letter in letters:
        new_word.replace(letter,"")
    new_sentence.append(new_word)
Burde funke. Uten at jeg har testet det. Det finnes sikkert langt mer elegante måter å gjøre det på enn å nøste for-løkker og få grisete kjøretid på det også
Sist endret av liasis; 11. april 2018 kl. 13:46.
Pre-kompilert regex er rimelig raskt på veldig store lister.
Mulig en generator hadde vært mer fornuftig om du har veldig mye data å sjekke.

Kode

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

l1 = ["Jexg", "hayr", "ezn", "katæt", "soøm", "heteår", "Hans"]
l2 = ["x", "y", "z", "æ", "ø", "å"]
r = re.compile('|'.join(l2))
l3 = [r.sub('', i) for i in l1]
print l3
LEIK
Pope's Avatar
Trådstarter
Takker
Jeg fikk ikke ditt forslag til å virke, liasis, da new_sentence blir lik som sentence.
Ditt forslag virker , Realist1.
For større lister blir sikkert dette ganske tidkrevende og det finnes sikkert bedre måter å gjøre det på, men jeg tar til takke med dette

Jeg skal teste kjøretid med ditt eksempel opp mot de andre, Goophy Takk!
Sist endret av Pope; 11. april 2018 kl. 14:03. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
For bitte små lister som dette er map eller list comprehension raskest.
Nøstede for-løkker er bare treigt.
LEIK
Pope's Avatar
Trådstarter
Noen forslag til hvordan jeg løser dette med list comprehension da? Helt uten å importere moduler.

Kode

[word.translate(None, ''.join(letters)) for word in setning]
Hvis du går gjennom det første forslaget ditt litt nøye, så vil du nok se at det alltid vil returnere den originale listen. "word in letters" vil alltid returnere false, siden det sjekker om word finnes som element i letters, og det gjør det jo ikke.
LEIK
Pope's Avatar
Trådstarter
Det har du veldig rett i Provo
Kunne du ha forklart meg hvordan koden din virker? translate og join er nytt for meg.
Sitat av Pope Vis innlegg
Det har du veldig rett i Provo
Kunne du ha forklart meg hvordan koden din virker? translate og join er nytt for meg.
Vis hele sitatet...
Mener ikke å være douche her, men det kan være lurt å se på dokumentasjonen. Der finner du begge funksjonene forklart. Sier dette fordi det å kunne lese dokumentasjon er noe av det viktigste når man koder, og jeg gremmes over at det ikke er større fokus på dette når folk skal lære det via høyskoler og universiteter.

Edit: en annen ting som kan være lurt, er å fyre opp python i terminal eller powershell og leke med funksjoner der om dokumentasjonen fremstår litt tunglest.
Sist endret av Xasma; 11. april 2018 kl. 15:06.
LEIK
Pope's Avatar
Trådstarter
Xasma: Det er det som noen ganger kan være problemet, at dokumentasjonen forvirrer meg ytterligere. Veldig greit å få ting forklart på en enkel måte av og til. Men takk for tipset om å teste i terminal, det skal jeg gjøre
String-metoden translate() gjør først og fremst en oversettelse, eller et ombytte, av characters i henhold til en translation table. Men den tar også et ekstra argument, deletechars, som er en streng med characters som skal slettes fra strengen den kalles på, og det er den funksjonaliteten jeg brukte i koden over. Ettersom jeg ikke var interessert i noe øvrig bytte av characters, sendte jeg bare None som translation table.

String-metoden join() tar en liste av strenger som argument, og bruker strengen den kalles på som delimiter og spleiser sammen alle strengene i listen. Så om du skriver for eksempel "+-+".join(["Hei", "sveis", "Pope"]), så vil den returnere strengen "Hei+-+sveis+-+Pope". I koden over brukte jeg en tom streng som delimiter, slik at den bare spleiset sammen alle bokstavene i letters-listen til en sammenhengende streng. Selvsagt kunne man jo bare definert dem som en streng i utgangspunktet og sluppet å kalle join(), men jeg gikk ut fra at du kanskje ikke hadde denne muligheten.
Sitat av Pope
Det har du veldig rett i Provo
Kunne du ha forklart meg hvordan koden din virker? translate og join er nytt for meg.
Vis hele sitatet...
Regner med at du bruker Python 3,til info der vil koden @Provo feile fordi dem har gjort om str.maketrans()
If there is only one argument, it must be a dictionary mapping
Vis hele sitatet...
Da kan det skrives sånn med et argument som er dictionary.

Kode

>>> setning = ["Jexg", "hayr", "ezn", "katæt", "soøm", "heteår", "Hans"]
>>> letters = ["x", "y", "z", "æ", "ø", "å"]

>>> [s.translate({ord(c):'' for c in ''.join(letters)}) for s in setning]
['Jeg', 'har', 'en', 'katt', 'som', 'heter', 'Hans']
Viss man tar med str.maketrans(),kan det gjøres sånn uten dictionary.

Kode

>>> setning = ["Jexg", "hayr", "ezn", "katæt", "soøm", "heteår", "Hans"]
>>> remove = str.maketrans('', '', 'xyzæøå')
>>> [s.translate(remove) for s in setning]
['Jeg', 'har', 'en', 'katt', 'som', 'heter', 'Hans']
Noen forslag til hvordan jeg løser dette med list comprehension da? Helt uten å importere moduler.
Vis hele sitatet...
Tjaa i farta noe som dette,men det ble ikke noe pent(lesbart).
En eller flere linjer til hadde gjort det klarere.

Kode

>>> ''.join(c for x in setning for c in x+' ' if c not in 'xyzæøå').split()
['Jeg', 'har', 'en', 'katt', 'som', 'heter', 'Hans']
Sist endret av snippsat; 11. april 2018 kl. 22:06.
▼ ... over en måned senere ... ▼
LEIK
Pope's Avatar
Trådstarter
Nå har jeg tullet meg borti noe som kalles bitwise operators som jeg ikke skjønner skjønner så mye av.
Det gjelder følgende tegn: <<, >>, &, |, ~, ^.

Jeg fant en forklaring på det, men får det ikke til å stemme helt når jeg tester i Python.

  • x << y
    Returns x with the bits shifted to the left by y places (and new bits on the right-hand-side are zeros). This is the same as multiplying x by 2**y.
  • x >> y
    Returns x with the bits shifted to the right by y places. This is the same as //'ing x by 2**y.
  • x & y
    Does a "bitwise and". Each bit of the output is 1 if the corresponding bit of x AND of y is 1, otherwise it's 0.
  • x | y
    Does a "bitwise or". Each bit of the output is 0 if the corresponding bit of x AND of y is 0, otherwise it's 1.
  • ~ x
    Returns the complement of x - the number you get by switching each 1 for a 0 and each 0 for a 1. This is the same as -x - 1.
  • x ^ y
    Does a "bitwise exclusive or". Each bit of the output is the same as the corresponding bit in x if that bit in y is 0, and it's the complement of the bit in x if that bit in y is 1.
Vis hele sitatet...
Si at x = 5 og y = 7.

1) Den første er grei. Da vil x<<y = 5 * 2^7= 640.

2 ) Den andre er litt rar, men gjetter at det har med integerdivisjon å gjøre, så derfor får jeg ikke noe spesielt vettugt ut når jeg prøver x>>y = 5/(2^7) = 5/128. Blir bare 0, men det gir mening hvis man ikke regner med tatt mellom 0 og 1.

3) Hæ?

Kode

2&2
Out[69]: 2

2&3
Out[70]: 2

2&4
Out[71]: 0

2&5
Out[72]: 0

2&6
Out[73]: 2
4) Hæ?

Kode

2|2
Out[74]: 2

2|3
Out[75]: 3

2|4
Out[76]: 6

2|5
Out[77]: 7

2|6
Out[78]: 6
5) Denne er også grei. ~x = -5-1 = -6

6) Hæ?

Kode

2^2
Out[81]: 0

2^3
Out[82]: 1

2^4
Out[83]: 6

2^5
Out[84]: 7

2^6
Out[85]: 4
Så nummer 1, 2 og 5 er "greie". Skjønner likevel ikke når det skal være aktuelt å bruke de.

Grunnen til at jeg kom inn på dette var at jeg fikk se en kode med to lister (a og b) etterfulgt av set(a) | set(b), hvor set skal plukke ut unike verdier av en liste i uordnet rekkefølge.
Du må se på bits og hva som foregår når man sender de parvis, basert på posisjon inn i logiske porter og hva som da kommer ut.

Si du har 0110(6) og 1011(11) og gjør en bitwise AND-operasjon: da sammenligner du hvert bit, og hver gang begge tallene har 1 i samme posisjon, får du ut 1. Her er begge 1 kun i 2. posisjon, og dermed beholder du denne, mens de andre blir 0, og vi får 0010(2).

Så kan vi gjøre det samme med OR-operasjon: her trenger du kun at en av de to er 1, og dermed får du 1111, siden vi kan finne minst en ener i hver posisjon.

Til sist har vi XOR-operasjon: her ser vi etter 1'ere igjen, men her kan maksimalt én av input bitsene være 1, og dermed får vi 1101.

Når du leker med disse kan det være lurt å bruke bin(int), da får du ut hvordan de ser ut i bit-format.
Sist endret av Xasma; 16. mai 2018 kl. 10:44. Grunn: rettet småfeil
LEIK
Pope's Avatar
Trådstarter
Takk for flott svar Jeg har ikke sett på bits enda, nei.
Hva er det som står i parenteser etter bits-rekkene(?) dine?

Testet bin(int) og det var naturligvis også helt nytt, men her er det mulig å lære ting Takk igjen!
Sitat av Pope Vis innlegg
Takk for flott svar Jeg har ikke sett på bits enda, nei.
Hva er det som står i parenteser etter bits-rekkene(?) dine?

Testet bin(int) og det var naturligvis også helt nytt, men her er det mulig å lære ting Takk igjen!
Vis hele sitatet...
Det er tallet i titallsystemet, burde vel ha brukt skikkelig notasjon, men gadd ikke i farten. Uten å gå for dypt i det, så bruker maskiner 2 som base for tallsystemet mens vi normalt bruker 10 som base. En kort forklaring, som blir litt rotete siden vi ikke har LaTeX tilgjengelig: Fra høyre leses binære tall som toerpotenser, så f.eks 1010 i binært blir i konvertering ti titallsystemet: ((2^0)*0)+((2^1)*1)+((2^2)*0)+((2^3)*1) = 10. Du ikke gjøre det i den rekkefølgen, men det kan være greit i starten. Så lenge man forstår at det er en summering av toerpotenser, lest fra høyre til venstre og en 1 representerer at denne toerpotensen trengs for å uttrykke et tall, henger du med.

Bitmanipulasjon brukes i mye rart, kryptering bruker f.eks XOR-ing i visse implementasjoner, men også mye annet. Bitmanipulasjon er hendig til en del ting, men for de aller fleste ikke noe mer enn en kuriositet.
Sist endret av Xasma; 16. mai 2018 kl. 13:09.
Nawesome
Provo's Avatar
Crew
Sitat av Xasma Vis innlegg
Fra høyre leses binære tall som toerpotenser, så f.eks 1010 i binært blir i konvertering ti titallsystemet: ((2^0)*0)+((2^1)*1)+((2^2)*0)+((2^3)*1) = 10.
Vis hele sitatet...
Det kan være greit å legge til at det er det samme som skjer med andre tallsystemer, inkludert titallssystemet, eller det desimale tallsystemet som det også kalles. Man summerer sifrene ganget med basen opphøyd i sin posisjon, hvor man begynner å telle fra null.

I titallssystemet, hvor vi i praksis overfører fra titallssystemet til titallssystemet:
5 = 5*100
17 = 7*100 + 1*101
54987 = 7*100 + 8*101 + 9*102 + 4*103 + 5*104

For å gjøre om binært til titallssystemet:
1010bin = 0*20 + 1*21 + 0*22 + 1*23 = 10.

Det heksadesimale tallsystemet er som alle andre, bare at det har 16 som base. Siden det må være 16 siffer, er sifrene 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E og F. Fremgangsmåten er lik:
7D4Ahex = 10*160 + 4*161 + 13*162 + 7*163 = 32074.



Man kan lett bli forvirret av andre tallsystemer om man ikke har erfaring med det. Men det kan hjelpe på forståelsen å visualisere et mekanisk telleapparat av typen man bruker for å telle flypassasjerer og liknende. Hver gang man trykker på knappen, øker tallet med 1. Der har man en rekke hjul, antallet avhenger av hvor mange siffer den har, ikke utseendemessig ulikt snurrehjulene på en vanlig mekanisk kodelås som ofte er på kofferter og hengelåser, eller tellehjulene på gamle kassettspillere.

Først begynner apparatet på 000, om det har tre siffer. Når du trykker på knappen, snurrer det første hjulet en tidels runde rundt, og viser sifferet 1, slik at apparatet nå viser 001. Trykker du igjen går det til 002, også videre. Når du har kommet til det siste sifferet, 9, så vil det som skjer når du trykker være at det første hjulet snurrer over til 0 igjen, men drar med seg neste hjul en tidels runde, slik at det nå står 010. Så går det til 011, 012, 013 også videre. Ved 019 vil neste trykk gjøre at første hjul drar med seg andre hjul over en tidelsrunde til, slik at man kan lese 020. Hjul nummer to vil også dra med seg hjul nummer tre, når det går rundt fra det høyeste til det laveste sifferet, så på 099 vil neste trykk dra første hjul over til laveste siffer, som drar andre hjul over til laveste siffer, som drar tredje hjul over på 1, slik at man får 100 – hundre, altså.

Så er det bare å bytte base. Heksadesimalt er det akkurat det samme som skjer, men der har man sifrene A, B, C, D, E og F i tillegg. Så hjulet har 16 posisjoner (0-F) i stedet for ti (0-9). Når det første hjulet snurrer fra F (desimalt 15) til 0, drar det med seg neste hjul et hakk, og det heksadesimale telleapparatet viser 010 der det desimale telleapparatet viser 016. Neste er 011, så 012 også videre.

Binært, samme prinsipp, bare at der har vi kun to siffer, og ikke ti eller 16. Du begynner å telle, og apparatet går fra 000 til 001. Allerede neste trykk går nederste hjul fra høyeste til laveste siffer, og drar med seg det foran et hakk, så man får 010. Neste trykk gir 011. Deretter drar det første hjulet med seg det andre hjulet som drar med seg det tredje hjulet, og vi får 100. Og sånn fortsetter det videre oppover.
Sist endret av Provo; 16. mai 2018 kl. 14:35.
LEIK
Pope's Avatar
Trådstarter
Jøss, har hørt om nuller og enere før, men at det var sånn det hang sammen var jeg ikke klar over.

Bit-rekkene(?) kan være lengre enn fire plasser? Hvis ikke kan man ikke få større tall enn 1111(17)?

Hvor viktig er dette for Pythonprogrammering i praksis? Har ikke vært nevnt i informatikkfaget jeg har.

Sweet Jesus, Provo. Åpenbaring
Takker og bukker!
Sist endret av Pope; 16. mai 2018 kl. 14:33. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Nawesome
Provo's Avatar
Crew
Bit-rekkene kan være mye lenger enn fire plasser. På en datamaskin ofte 32 eller 64, men det avhenger av datatypen. Dette er ikke spesielt viktig for python-programmering, med mindre du programmerer noe hvis hensikt er bitmanipulasjon.

Jeg burde vel nevnt at det er noen knep for å representere negative tall, og også desimaltall, men det blir fort litt mer avansert enn nødvendig for å forstå det helt grunnleggende.

(Og binært 1111 er desimalt 15, ikke 17 )
LEIK
Pope's Avatar
Trådstarter
Edit: mente 15, ikke 17.
Hehe, her går det unna.

Akkurat, derav 32- og 64-bit som man har hørt om et helt liv!
Sist endret av Pope; 16. mai 2018 kl. 14:36.
▼ ... over en uke senere ... ▼
LEIK
Pope's Avatar
Trådstarter
Nå har jeg holdt på med classes i et par dager. Jeg skjønner at classes kan være effektivt fordi det muliggjør gjenbruk av kode i form av "inheritance" osv, men til mitt (ganske enkle) bruk klarer jeg meg lenge med funksjoner. Jeg antar at classes blir mer nyttig ettersom koden blir mer avansert.

Anyways, jeg kommer sannsynligvis til å få classes på eksamen og jeg lurer på om dette er riktig bruk av classes:

Kode

from math import sqrt

class ABCformula:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c
        
    def calculate_X(self):
        try:
            x1 = (-self.b + (sqrt((self.b**2) - 4*self.a*self.c)))/2*self.a
            x2 = (-self.b - (sqrt((self.b**2) - 4*self.a*self.c)))/2*self.a
            if x1 == x2:
                print("Only one soloution:\nX1 = {0:.1f}".format(x1))
            elif x1 != x2:
                print("Two soloutions\nX1 = {0:.1f}\nX2 = {1:.1f}".format(x1, x2))
        
        except ValueError:
            raise ValueError("No real roots")

poly1 = ABCformula(1,4,4)
Kanskje needless to say; jeg må selvfølgelig bruke riktig kall for methoden calculate_X.
poly1.calculate_X()
Sist endret av Pope; 27. mai 2018 kl. 16:09. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Sitat av Pope Vis innlegg
Kanskje needless to say; jeg må selvfølgelig bruke riktig kall for methoden calculate_X.
poly1.calculate_X()
Vis hele sitatet...
Tjeh, hvis du bare har én funksjon i klassen, så kan du vel bare kalle funksjonen for __call__ i steden for calculate_X. Da vil poly1() fungere som kall.
LEIK
Pope's Avatar
Trådstarter
Nice Og det fungerer bare når klassen inneholder kun en method?
Ikke bare et dyr
Dyret's Avatar
Det som er nydelig med klasser, er at det abstraherer vekk en god del av koden din, og kan innkapsle logikk for å passe på at klassevariablene er gyldige. I funksjonen du lister over, så er det egentlig ikke noen vits, ettersom du antageligvis bare kommer til å kalle calculate_X én gang. Da hadde det vært like greit å ha en modul som het ABCformula, med funksjonen calculate_X(a,b,c). Med den første løsningen blir det 2-3 kodelinjer: (import), instansiering, kall. Med den andre så blir det 1-2 linjer: (import), kall. Det ville gitt mer mening om klassen kunne løse flere typer polynomer eller noe, slik at det var litt mer dynamisk hva du ga inn, og forskjellig hva du ville ha ut.

Klasser blir litt mer nyttige når du ønsker å ha en instans av noe, som du kan gi en initialtilstand og så gjøre operasjoner basert på den tilstanden. Det mest nyttige er i situasjoner hvor du er nødt til å lagre mellomtilstander, og så gi denne tilbake igjen til neste runde av en kalkulasjon eller for en tilstandsmaskin. En ting jeg bruker klasser til, er ting som kjører i tråder og skal ha én instans per ressurs - gjerne i en egen tråd. Si at du kommuniserer med et eller annet objekt, som ikke er ditt eget program. Det kan være en mikrokontroller som du snakker UART/SPI med, en socket som snakker med en terminal-service/nettside e.l. Her er det veldig greit å ha en klasse som du kan gi start-parametere til (baudrate/comport eller adresse/port), og så har klassen funksjoner som lar deg sende og lese et visst antall bytes, samt lukke forbindelsen. Tenk så at du ønsker å snakke med ti slike enheter samtidig, fra samme kodebase.

Fordelen med å ha det som klasse-instanser, er at du ikke trenger å huske noe annet enn hva instansen heter. Med en gang du har gitt klassen den informasjonen den trenger, så er det "off your hands". Du kommuniserer nå bare via å gjøre funksjonskall på instans-objektet. Instansen selv kan huske hvem som skal kobles til, holde styr på hvorvidt forbindelsen fortsatt er oppe, og lagre unna både inngående og utgående data. Enten for å spare det til du har tid å lese det, eller for å skrive masse data til en treig enhet. Du kan enkelt spørre alle instansene (i loop) om de har noe data til deg. Det er superenkelt å lukke alle ressursene. Alternativet hadde vært en haug med funksjoner som tok masse input-parametre for å finne ut hvilken tilkobling du mener.

En annen ting er også arv, hvor du kan arve en funksjon og så gjøre noe spesielt i den nye klassen. Tidligere har jeg brukt dette for spesielle logg-objekter som må skrive ut alt i XML, slik at neste system kan tolke resultatet. Da har jeg en klasse som kan bygge meldinger på riktig format, men som bare skriver alt ut til stdout. Så lager jeg flere klasser som arver den originale, men i stedet skriver ut til en fil, eller utfører operasjoner på hele XML-strukturen før den skrives (konverterer til et annet format, kjører syntax-sjekker, komprimerer den, fjerner duplikater e.l.). I stedet for å ha en ultra-generell XMLLogger-klasse som tar femten parametre, så har jeg i stedet 5 mini-klasser på et par kodelinjer, som hver har et beskrivende navn over hva de gjør (XMLFileLogger, XMLNoDuplicateLogger). (Jeg husker ikke nøyaktige navn, men det understreker uansett poenget. Det var for et continuous integration-system som MÅTTE ha alt på et forhåndsbestemt format).

Python har også generatorer, som kan brukes som en slags mellomting mellom funksjoner og klasser. Si at du ønsker å få ut en god del Fibonacci-tall, men ikke alle på én gang pga. minnebegrensninger. Da kan du gjøre noe sånt som dette:

Kode

def Fibonacci(n):
    a,b = 1,1
    counter = 0
    while counter < n:
        yield a
        a,b = b,a+b
        counter += 1

fib = Fibonacci(10)
list([e for e in fib]) # Lager en liste med de ti første tallene
fib = Fibonacci(10)
next(fib) # Printer ut ett og ett tall, eller StopIteration Exception når det er tomt. I Python2 kan man bruke fib.next().
fordelen her er at du kan kalle Fibonacci(100000000000) uten problem. Du kan fortsatt hente ut ett og ett tall, men putter du de i en liste så går du tom for minne. En generell funksjon vil ikke klare det samme, uten å få vite hva de to foregående tallene var, eller starte helt på nytt hver gang. En klasse opererer på de samme prinsippene, bare med funksjoner i stedet for tilstandsvariabler, og et interface som gir deg tilgang til innholdet i klassen.
Sist endret av Dyret; 27. mai 2018 kl. 21:06.