Tim-M-
Artikelen: 0
Berichten: 21
Lid geworden op: wo 04 apr 2012, 17:49

Python en for loops

Beste
 
Tijdens een cursus op de universiteit is er een twee uur durende introductie in Python gegeven. De zaken die behandeld werden zijn: types van data, datatype conversie, conditional statements, functies, loops, files lezen en schrijven. Er hangt ook een opdracht aan vast, maar bij opgave drie zit ik vast. (beschrijving opdracht volgt later)
 
De data die verwerkt moet worden, is biologische data: eiwitsequenties uit een databank. Dat ziet er zo uit:

>sp|P13280|GLYG_RABIT Glycogenin-1 OS=Oryctolagus cuniculus GN=GYG1 PE=1 SV=3

MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT

VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL

SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR

KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM

THPQFLNVWWDIFTTSVVPLLQQFGLVQDTCSYQHVEDVSGAVSHLSLGETPATTQPFVS

SEERKERWEQGQADYMGADSFDNIKKKLDTYLQ
 
De eerste regel, beginnend met >sp, is een header met informatie over het eiwit en de regels daaronder zijn aminozuren. De datafile (FASTA file) bevat zo'n 800 items (de hoeveelheid aminozuren verschilt van eiwit tot eiwit).
 
Opdracht 3 luidt: Maak een lijst van alle eiwitten die bestaan uit 100 of minder dan 100 aminozuren. Schrijf die in een aparte tekstfile waar zowel de header als de aminozuursequentie instaan.
 
Ik merkte op dat Python de header steeds als 1 string importeert, maar de aminozuursequenties importeert hij per regel. Daarom is het tellen lastig. Ik wou al die aminozuursequenties (per eiwit) samenvoegen tot 1 nieuwe string. Op die manier wordt het tellen eenvoudiger. Tot nu toe had ik deze code:
 
f = open("test3.fasta", "r")

for line in f:

    if ">sp" in line:

        s = str()

        #print(s)        #geeft geen resultaat

        print(line)

        #print(s)       #geeft geen resultaat

    if ">sp" not in line:

        s += line

        print(s)        # probleem: python voegt aan s iedere keer een regel toe en print die in plaats van alle regels tegelijk toe te voege

f.close()
 
Het probleem is dat Python met deze code iedere keer een string s print als hij een regel tegenkomt die niet begint met >sp, waardoor de output wordt zoals dit (voor de sequentie hierboven):
 
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
 
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT
VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL
 
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT

VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL

SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR
 
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT

VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL

SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR

KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM
 
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT

VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL

SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR

KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM

THPQFLNVWWDIFTTSVVPLLQQFGLVQDTCSYQHVEDVSGAVSHLSLGETPATTQPFVS
 
MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT

VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL

SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR

KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM

THPQFLNVWWDIFTTSVVPLLQQFGLVQDTCSYQHVEDVSGAVSHLSLGETPATTQPFVS

SEERKERWEQGQADYMGADSFDNIKKKLDTYLQ
 
Ik begrijp waarom Python het doet: iedere keer als Python een regel tegenkomt die niet begint met >sp, dan wijzigt de waarde van s en wordt de huidige waarde van s geprint. Ik wil echter enkel dat laatste (de hele sequentie), maar ik heb geen idee hoe dat te doen.
 
Alvast bedankt.

P.S. Die introductie Python is de enige programmeerervaring die ik heb.
Gebruikersavatar
Flisk
Artikelen: 0
Berichten: 1.264
Lid geworden op: vr 02 mar 2012, 14:21

Re: Python en for loops

Nu print je elke keer wanneer de for loop doorlopen wordt. Dus elke keer wanneer je een regel toevoegt print je het resultaat. Je print statement moet dus na de loop komen i.p.v. in de loop.
Je leest maar niet verder want je, je voelt het begin van wanhoop.
Tim-M-
Artikelen: 0
Berichten: 21
Lid geworden op: wo 04 apr 2012, 17:49

Re: Python en for loops

Bedankt voor het antwoord.

Hoe moet je dat concreet doen?

Als ik print op dezelfde indent plaats de laatste if, dan doet hij weer wat ik beschreef in de vorige post.

Als ik print op dezelfde indent plaats als for, dan print hij wat ik wil, maar dan enkel voor het laatste eiwit.
 
Voor de volledigheid is dit de data waarmee ik werk:
 
>sp|P00169|CYB5_RABIT Cytochrome b5 OS=Oryctolagus cuniculus GN=CYB5A PE=1 SV=4

MAAQSDKDVKYYTLEEIKKHNHSKSTWLILHHKVYDLTKFLEEHPGGEEVLREQAGGDAT

ENFEDVGHSTDARELSKTFIIGELHPDDRSKLSKPMETLITTVDSNSSWWTNWVIPAISA

LIVALMYRLYMADD

>sp|P13280|GLYG_RABIT Glycogenin-1 OS=Oryctolagus cuniculus GN=GYG1 PE=1 SV=3

MTDQAFVTLTTNDAYAKGALVLGSSLKQHRTSRRLAVLTTPQVSDTMRKALEIVFDEVIT

VDILDSGDSAHLTLMKRPELGVTLTKLHCWSLTQYSKCVFMDADTLVLANIDDLFEREEL

SAAPDPGWPDCFNSGVFVYQPSVETYNQLLHVASEQGSFDGGDQGLLNTFFNSWATTDIR

KHLPFIYNLSSISIYSYLPAFKAFGANAKVVHFLGQTKPWNYTYDTKTKSVRSEGHDPTM

THPQFLNVWWDIFTTSVVPLLQQFGLVQDTCSYQHVEDVSGAVSHLSLGETPATTQPFVS

SEERKERWEQGQADYMGADSFDNIKKKLDTYLQ

>sp|P02057|HBB_RABIT Hemoglobin subunit beta-1/2 OS=Oryctolagus cuniculus GN=HBB1 PE=1 SV=2

MVHLSSEEKSAVTALWGKVNVEEVGGEALGRLLVVYPWTQRFFESFGDLSSANAVMNNPK

VKAHGKKVLAAFSEG

>sp|P02586|TNNC2_RABIT Troponin C, skeletal muscle OS=Oryctolagus cuniculus GN=TNNC2 PE=1 SV=2

MTDQQAEARSYLSEEMIAEFKAAFDMFDADGGGDISVKELGTVMRMLGQTPTKEELDAII

EEVDEDGSGTIDFEEFLVMMVRQMKEDAKGKSEEELAECFRIFDRNADGYIDAEELAEIF

RASGEHVTDEEIESLMKDGDKNNDGRIDFDEFLKMMEGVQ

>sp|P02643|TNNI2_RABIT Troponin I, fast skeletal muscle OS=Oryctolagus cuniculus GN=TNNI2 PE=1 SV=3

MGDEEKRNRAITARRQHLKSVMLQIAATELEKEEGRREAEKQNYLAEHCPPLSLPGSMAE

VQELCKQLHAKIDAAEEEKYDMEIKVQKSSKELEDMNQKLFDLRGKFKRPPLRRVRMSAD

AMLKALLGSKHKVCMDLRANLKQVKKEDTEKERDLRDVGDWRKNIEEKSGMEGRKKMFES

ES
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: Python en for loops

Probeer dit eens:

Code: Selecteer alles

f = open("test3.fasta", "r")
s = '' # definieer een lege string s buiten de loop
for line in f:
    if ">sp" in line:
        print(s)   # de eerste keer dat je ">sp" tegenkomt zal er niks geprint worden, maar de volgende keren wel
        s = ''     # maak s weer leeg
    else:
        s += line  # geen header regel, dus voeg de lijn toe aan s

f.close()
De check voor een header zou misschien iets cleaner kunnen door line.startswith('>sp').
De print(s) zal nu voor de allereerste header een lege string printen, maar nadat je de eerste regels van het AZ geparsed hebt zal s tekst bevatten en wanneer je dan de tweede header tegenkomt zal je tekst zien verschijnen.
 
Heb je trouwens geleerd hoe je code kan debuggen? Kan je een breakpoint plaatsen en stap voor stap door je code gaan en in de stack data volgen hoe de variabelen veranderen?
Gebruikersavatar
Flisk
Artikelen: 0
Berichten: 1.264
Lid geworden op: vr 02 mar 2012, 14:21

Re: Python en for loops

Bij elke oefening maak je best een algoritme. Een algoritme is een stappenplan in mensentaal dat je moet volgen om de opdracht te voltooien. Zo'n algoritme kan je daarna vertalen naar programmeertaal (in dit geval python). Volgend algoritme lost jouw oefening op:

Code: Selecteer alles

1) maak een variabele voor de opslag van een keten
2) maak een variabele voor de opslag van een header
3) open de data
4) voor elke lijn in de data:
  4.1)als het de eerste lijn data is, sla de lijn op in de header variabele
      4.1.1) negeer 4.2 en 4.3 en ga verder met lijnen doorzoeken
  4.2)als de lijn geen header is:
      4.2.1) voeg de lijn aan de keten variabele toe
  4.3)als de lijn een header is:
      4.3.1) als de lengte van de keten variabele =< 100
            4.3.1.1)print de header en de keten variabele af
            4.3.1.2)print een witregel
      4.3.2) sla de lijn op in de header variabele
      4.3.2) maak de keten variabele terug leeg
5) sluit de data
Ik maak een uitzondering voor de eerste lijn data, want de keten variabele zal dan nog leeg zijn (lengte dus kleiner dan 100) en ik wil geen zinloze witregel printen. In python kan je voor stap 4.1.1 het "continue" statement gebruiken, dat negeert al wat nog volgt in de huidige cyclus van de loop en springt naar de volgende cyclus van de loop.

Als je dat algoritme omzet in python code is de oefening opgelost. Zelf programmeer ik zelden in python. Zorg zeker dat je het algoritme snapt voordat je het vertaalt naar code, je kan altijd doorvragen en dan geef ik meer uitleg.
Je leest maar niet verder want je, je voelt het begin van wanhoop.
Tim-M-
Artikelen: 0
Berichten: 21
Lid geworden op: wo 04 apr 2012, 17:49

Re: Python en for loops

Xenion schreef: Probeer dit eens:

Code: Selecteer alles

f = open("test3.fasta", "r")
s = '' # definieer een lege string s buiten de loop
for line in f:
    if ">sp" in line:
        print(s)   # de eerste keer dat je ">sp" tegenkomt zal er niks geprint worden, maar de volgende keren wel
        s = ''     # maak s weer leeg
    else:
        s += line  # geen header regel, dus voeg de lijn toe aan s

f.close()
De check voor een header zou misschien iets cleaner kunnen door line.startswith('>sp').
De print(s) zal nu voor de allereerste header een lege string printen, maar nadat je de eerste regels van het AZ geparsed hebt zal s tekst bevatten en wanneer je dan de tweede header tegenkomt zal je tekst zien verschijnen.
 
Heb je trouwens geleerd hoe je code kan debuggen? Kan je een breakpoint plaatsen en stap voor stap door je code gaan en in de stack data volgen hoe de variabelen veranderen?
Bedankt!
 
Die code werkt véél beter dan hetgeen ik had. Bestaat er een manier om onder de eerste header toch een sequentie te printen? Het is uiteindelijk de bedoeling om voor iedere eiwitsequentie die kleiner of gelijk is aan 100 AZ te schrijven naar apart document met de vorm: hearder met daaronder de sequentie.

Die laatste twee zinnen zeggen mij niets. Wij hebben enkel wat eenvoudige opdrachten uitgevoerd zoals iets printen, elementen uit een lijst oproepen, een eenvoudige loop programmeren, ...
Tim-M-
Artikelen: 0
Berichten: 21
Lid geworden op: wo 04 apr 2012, 17:49

Re: Python en for loops

Flisk schreef: Bij elke oefening maak je best een algoritme. Een algoritme is een stappenplan in mensentaal dat je moet volgen om de opdracht te voltooien. Zo'n algoritme kan je daarna vertalen naar programmeertaal (in dit geval python). Volgend algoritme lost jouw oefening op:

Code: Selecteer alles

1) maak een variabele voor de opslag van een keten
2) maak een variabele voor de opslag van een header
3) open de data
4) voor elke lijn in de data:
  4.1)als het de eerste lijn data is, sla de lijn op in de header variabele
      4.1.1) negeer 4.2 en 4.3 en ga verder met lijnen doorzoeken
  4.2)als de lijn geen header is:
      4.2.1) voeg de lijn aan de keten variabele toe
  4.3)als de lijn een header is:
      4.3.1) als de lengte van de keten variabele =< 100
            4.3.1.1)print de header en de keten variabele af
            4.3.1.2)print een witregel
      4.3.2) sla de lijn op in de header variabele
      4.3.2) maak de keten variabele terug leeg
5) sluit de data
Ik maak een uitzondering voor de eerste lijn data, want de keten variabele zal dan nog leeg zijn (lengte dus kleiner dan 100) en ik wil geen zinloze witregel printen. In python kan je voor stap 4.1.1 het "continue" statement gebruiken, dat negeert al wat nog volgt in de huidige cyclus van de loop en springt naar de volgende cyclus van de loop.

Als je dat algoritme omzet in python code is de oefening opgelost. Zelf programmeer ik zelden in python. Zorg zeker dat je het algoritme snapt voordat je het vertaalt naar code, je kan altijd doorvragen en dan geef ik meer uitleg.
Bedankt!
 
Het algoritme is overzichtelijk en duidelijk. Ik begrijp alleen niet wat u bedoelt met 4.1 "als de lijn data is". Bedoelt daarmee een header of een stuk sequentie?
 
Wat is de beste manier om zulke denkwijze aan te leren? Naar mijn aanvoelen was de introductie van twee uur die ik volgde niet voldoende om deze opdracht op te lossen. Ik had wel enkele stukken van uw algoritme gevonden, maar er ontbraken nog belangrijke zaken.
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: Python en for loops

Het voorbeeld dat ik gaf is zeker nog niet af. Je moet eens nadenken hoe je dat kan vervolledigen. De laatste eiwit-sequentie wordt bv ook niet uitgeprint.
 
Een crash course van 2u is zeker niet voldoende om effectief mee te leren programmeren.
Dat is een skill die je moet trainen. Je moet leren om 'algoritmisch' te denken en dat kan alleen door het regelmatig te doen.
 
Betreft debuggen: dat is niet zo moeilijk maar wel heel belangrijk. Wat je doet is eigenlijk zeggen aan de interpreter om te pauzeren op bepaalde plaatsen in je code zodat je de tijd hebt om handmatig in de variabelen te kunnen kijken of er gebeurt wat jij wil dat er gebeurt. Je kan dan stap voor stap door je code gaan om te achterhalen waar er precies iets mis zou gaan.
 
Ik gebruik zelf de gratis 101 versie van Wing als Python editor. De debugger die daarin zit is vrij goed. Kijk eens naar de instructies en filmpjes op deze pagina om hier meer over te leren: https://wingware.com/wingide/debugger
Gebruikersavatar
Flisk
Artikelen: 0
Berichten: 1.264
Lid geworden op: vr 02 mar 2012, 14:21

Re: Python en for loops

De laatste eiwit-sequentie wordt bv ook niet uitgeprint.
Had ik over het hoofd gezien, algoritme uit post 5 moet dus worden aangepast.
 
Ik begrijp alleen niet wat u bedoelt met 4.1 "als de lijn data is".
4.1 is "als het de eerste lijn data is".
In dat geval is de lijn een header, zonder 4.1 print de rest van het algoritme de vorige header (die is nog leeg), de vorige AZ sequentie (ook nog leeg) en een witregel. Als je die witregel in het begin van het bestand niet wilt, moet je in de eerste cyclus 4.2 en 4.3 dus overslaan.

Nu dat is een klein detail, als je dat verwarrend vindt, laat het dan voorlopig weg, dan wordt het algoritme (puntje 5 is nieuw, de laatste sequentie moet ook gecheckt worden):

Code: Selecteer alles

1) maak een variabele voor de opslag van een keten
2) maak een variabele voor de opslag van een header
3) open de data
4) voor elke lijn in de data:
  4.1)als de lijn geen header is:
      4.1.1) voeg de lijn aan de keten variabele toe
  4.2)als de lijn een header is:
      4.2.1) als de lengte van de keten variabele =< 100
            4.2.1.1)print de header en de keten variabele af
            4.2.1.2)print een witregel
      4.2.2) sla de lijn op in de header variabele
      4.2.2) maak de keten variabele terug leeg
5) als de lengte van de keten variabele =< 100
            4.1)print de header en de keten variabele af
6) sluit de data
 
Wat is de beste manier om zulke denkwijze aan te leren? Naar mijn aanvoelen was de introductie van twee uur die ik volgde niet voldoende om deze opdracht op te lossen. Ik had wel enkele stukken van uw algoritme gevonden, maar er ontbraken nog belangrijke zaken.
Twee uur is idd wat kort, zoals Xenion zegt, al doende leer je. Je programma testen is ook heel belangrijk.
Bij het maken van een algoritme stel ik mezelf altijd de vraag, hoe zou ik het oplossen zonder computer? Dan probeer ik al de stappen die ik zelf zou ondernemen in volgorde op te schrijven, te vertalen naar een algoritme en uiteindelijk naar code. Tijdens dat proces veranderd je algoritme vaak, soms vind je een makkelijkere manier of merk je dat je aanpak niet makkelijk vertaalt naar bruikbare code.
Je leest maar niet verder want je, je voelt het begin van wanhoop.
Tim-M-
Artikelen: 0
Berichten: 21
Lid geworden op: wo 04 apr 2012, 17:49

Re: Python en for loops

Bedankt voor jullie reacties.
 
Ik heb het beschreven algoritme proberen te programmeren en het werkt voor mijn testbestandje (ik wou het eerst test op een klein aantal sequenties en dan pas de echte file gebruiken die 800+ eiwitten bevat.). Er is wel 1 probleempje, er wordt namelijk dit geprint:
 
>sp|P00169|CYB5_RABIT Cytochrome b5 OS=Oryctolagus cuniculus GN=CYB5A PE=1 SV=4

>sp|P13280|GLYG_RABIT Glycogenin-1 OS=Oryctolagus cuniculus GN=GYG1 PE=1 SV=3

>sp|P02057|HBB_RABIT Hemoglobin subunit beta-1/2 OS=Oryctolagus cuniculus GN=HBB1 PE=1 SV=2

>sp|P02057|HBB_RABIT Hemoglobin subunit beta-1/2 OS=Oryctolagus cuniculus GN=HBB1 PE=1 SV=2
 
Dat zijn de headers van de eerste twee eiwitten (die zijn groter dan 100) en de header van het eerste eiwit staat er dubbel.
 
Voor de volledigheid is hier de code:
 
s = ''      # variabele voor opslag sequentie

h = ''      # variabele voor opslag header

f = open("test3.fasta", "r")        # open data

for line in f:      # voor iedere lijn in datafile

        

    if ">sp" not in line:       # >sp niet in lijn, dus sequentie

        s += line       # sla lijn op onder variabele s

        

    if line.startswith(">sp"):      # als lijn start met >sp

        if len(s) <= 100:       # als lengte van variabele s kleiner of gelijk is aan 100

            print(h)        # print header

            print(s)        # print sequentie   

            print()     # print witregel

        h = line

        s = ''

        if len(s) <= 100:      # als lijn start met >sp

                  # sla lijn op onder variabele h

            print(h)        # print header

            print(s)

       

f.close()       # sluit data
Tim-M-
Artikelen: 0
Berichten: 21
Lid geworden op: wo 04 apr 2012, 17:49

Re: Python en for loops

Ik mijn fout gevonden in de vorige code: de laatste if moest op dezelfde hoogte staan als for line in f:
 
Ik zal bij wijze van oefening van de code eens in mensentaal proberen uit te leggen:
 
  • Eerst zijn er twee lege variabelen gedefinieerd voor de header en de sequentie.
  • Daarna is het document geopend
  • Voor iedere lijn in het document:
    • Als de lijn geen header is (geen >sp) in de lijn, dan wordt die lijn opgeslagen onder de sequentievariabele
    • Als de lijn een header is dan:
      • Als de sequentievariabele kleiner is dan 100, dan wordt zowel de header als sequentievariabele geprint
      • De header wordt opgeslagen onder de headervariabele
      • De sequentievariabele wordt weer leeggemaakt.
    • Op het einde wordt gekeken of de sequentievariabele kleiner is dan 100. Zo ja, dan wordt er weer geprint zoals hierboven
Ik heb nog twee vragen over de code:
1. De headervariabele is eerst leeg, dan wordt die variabele geprint en pas daarna wordt de header opgeslagen onder headervariabele. Hoe komt het dat de correcte header wordt afgeprint? Ik zou denken dat die variabele nog leeg was als de eerste sequentie kleiner dan 100 zou zijn of dat het de header van de vorige sequentie was.
 
2. Sla je de eerste header niet over omdat je begint met if ">sp" not in line?
Gebruikersavatar
Flisk
Artikelen: 0
Berichten: 1.264
Lid geworden op: vr 02 mar 2012, 14:21

Re: Python en for loops

Ik mijn fout gevonden in de vorige code: de laatste if moest op dezelfde hoogte staan als for line in f:
Inderdaad, werkt de code nu goed? Ik kijk zo meteen eens naar de andere vragen.
EDIT:
In je uitleg in mensentaal staat het wel nog op het foute niveau.
Je leest maar niet verder want je, je voelt het begin van wanhoop.
Gebruikersavatar
Flisk
Artikelen: 0
Berichten: 1.264
Lid geworden op: vr 02 mar 2012, 14:21

Re: Python en for loops

Tim-M- schreef:1. De headervariabele is eerst leeg, dan wordt die variabele geprint en pas daarna wordt de header opgeslagen onder headervariabele. Hoe komt het dat de correcte header wordt afgeprint? Ik zou denken dat die variabele nog leeg was als de eerste sequentie kleiner dan 100 zou zijn of dat het de header van de vorige sequentie was.
De eerste lijn van de file is een header, daarnaast zijn op dat moment de header en sequentie variabele allebei nog leeg.

In de for loop gebeurt er met die eerste lijn, in volgorde (volg mee met de code):

- lege header en sequentie worden geprint (immers len(s) =< 100 want s is nog leeg).

- witregel wordt geprint

- de lijn wordt opgeslaan in de header variabele.

- de lege sequentie variabele wordt nog eens leeg gemaakt (vrij nutteloos)

Nu zit de eerste header van de file dus in de header variabele en deze is nog niet geprint.

De volgende lijnen in de file is de AZ sequentie die bij deze header horen en in de for loop worden ze opgeslaan in de sequentie variabele.

Volgende gebeurt er dan wanneer de tweede header in de data bereikt wordt:

Geval 1, sequentie langer dan 100

- De tweede header wordt opgeslaan in de header variabele (de eerste gaat verloren)

- De sequentie variabele wordt leeggemaakt

Er wordt niets geprint. Het eerste eiwit was immers te lang.

Geval 2, sequentie korter dan 100

- De eerste header wordt geprint

- de eerste sequentie wordt geprint

- De tweede header wordt opgeslaan in de header variabele

- De sequentie variabele wordt leeggemaakt

Het eerste eiwit is volledig geprint, het was niet te lang.

In feite check (en eventueel print) je elke keer wanneer je een nieuwe header tegenkomt, het vorige eiwit. Dan krijg je natuurlijk een probleem bij het laatste eiwit, zonder puntje 5 in het algoritme (bericht 9) wordt dat niet meer gecheckt. En daarom moet dat dus ook pas na de for loop komen.
Je leest maar niet verder want je, je voelt het begin van wanhoop.
Tim-M-
Artikelen: 0
Berichten: 21
Lid geworden op: wo 04 apr 2012, 17:49

Re: Python en for loops

Héél erg bedankt! Door die uitleg begrijp ik het probleem beter. Werken met die loops is als beginner toch niet zo evident.

Terug naar “Informatica en programmeren”