Informacja

2.5: Przepływ kontroli warunkowej — biologia

2.5: Przepływ kontroli warunkowej — biologia


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

Wyrażenie „przepływ sterowania” odnosi się do faktu, że konstrukcje takie jak pętle for zmieniają przepływ wykonywania programu z prostej kolejności od góry do dołu. Istnieje kilka innych rodzajów przepływu sterowania, które omówimy, z których dwa mają charakter „warunkowy”.

Instrukcje if pozwalają nam warunkowo wykonać blok kodu, w zależności od zmiennej odwołującej się do BooleanPrawdziwelubFałszywe, lub częściej warunek, który zwraca BooleanPrawdziwelubFałszywe. Składnia jest dość prosta, opisana tutaj na przykładzie.

Wszystkie linie od początkuJeślido ostatniej linii w anElifa:lubw przeciwnym razie:blok są częścią tej samej konstrukcji logicznej. Taki konstrukt musi mieć dokładnie jedenJeśliblok warunkowy, maj mieć jeden lub więcejElifabloki (są opcjonalne) oraz maj mieć dokładnie jeden sloganw przeciwnym razieblok na końcu (również opcjonalnie). Każdy warunek jest oceniany w kolejności: pierwszy, który ocenia doPrawdziwezostanie uruchomiony, a reszta zostanie pominięta. Jeżeliw przeciwnym razieblok jest obecny, uruchomi się, jeśli żaden z wcześniejszychJeślilubElifabloki zrobiono jako „ostatnią deskę ratunku”.

Podobnie jak w przypadku pętli for, instrukcje if mogą być zagnieżdżone w innych blokach, a inne bloki mogą występować wewnątrz bloków instrukcji if. Podobnie jak pętle for, Python używa wcięć (standardową praktyką są cztery spacje na poziom wcięcia), aby wskazać strukturę bloku, więc otrzymasz błąd, jeśli niepotrzebnie wykonasz wcięcie (bez odpowiedniej linii przepływu kontrolnego, takiej jakdla,Jeśli,Elifa, lubw przeciwnym razie) lub zapomnij o wcięciu, gdy spodziewane jest wcięcie.[1]

Powyższy kod zostanie wydrukowanyKrótka liczba: 2 długa liczba: 2.

Pętle while są rzadziej używane (w zależności od charakteru wykonywanego programowania), ale mogą być nieocenione w pewnych sytuacjach i są podstawową częścią większości języków programowania. Pętla while wykonuje blok kodu tak długo, jak pozostaje warunekPrawdziwe. Zauważ, że jeśli warunek nigdy się nie stanieFałszywe, blok będzie wykonywany w kółko w „nieskończonej pętli”. Jeśli warunek jestFałszywena początku jednak blok jest całkowicie pomijany.

Powyższe zostanie wydrukowaneLicznik jest teraz: 0, śledzony przezLicznik jest teraz: 1,Licznik jest teraz: 2,Licznik jest teraz: 3, i w końcuGotowe. Licznik kończy się na: 4. Podobnie jak w przypadku korzystania z pętli for w zakresie liczb całkowitych, możemy również użyć pętli while, aby uzyskać dostęp do określonych indeksów w łańcuchu lub liście.

Powyższy kod zostanie wydrukowanypodstawa to: A, następniepodstawa to: Ci tak dalej, kończąc napodstawa to: Tprzed ostatecznym wydrukowaniemGotowe. W ten sposób pętle while mogą być używane jako rodzaj drobnoziarnistej pętli for, do iteracji elementów ciągu (lub listy), z kolei przy użyciu prostych indeksów liczb całkowitych i[]składnia. Chociaż powyższy przykład dodaje1doindeks_podstawowyw każdej iteracji równie dobrze mógłby dodać inną liczbę. Dodawanie3spowodowałoby na przykład wypisanie co trzeciej bazy.

Operatory logiczne i spójniki

Widzieliśmy już jeden rodzaj porównania logicznego,<, który zwraca, czy wartość jego lewej strony jest mniejsza niż wartość jego prawej strony. Istnieje wiele innych:

OperatorOznaczającyPrzykład (za = 7,b = 3)
<mniej niż?a < b # Fałsz
>Lepszy niż?a > b # Prawda
<=mniejszy lub równy?a <= b # Fałsz
>=większy lub równy?a >= b # Prawda
!=nie równa?a != b # Prawda
==równy?a == b # Fałsz

Te porównania działają dla liczb zmiennoprzecinkowych, liczb całkowitych, a nawet łańcuchów i list. Sortowanie według ciągów i list odbywa się w porządek leksykograficzny: zamówienie, w którym pozycja A jest mniejsza niż pozycja B, jeżeli pierwszy element A jest mniejszy niż pierwszy element B; w przypadku remisu brany jest pod uwagę drugi element i tak dalej. Jeśli w tym procesie zabraknie nam elementów do porównania, ten krótszy jest mniejszy. W odniesieniu do ciągów porządek leksykograficzny odpowiada znanemu porządkowi alfabetycznemu.

Wydrukujmy posortowaną wersję listy łańcuchów w Pythonie, która wykonuje swoje sortowanie przy użyciu powyższych porównań. Zwróć uwagę, że cyfry są uważane za „mniej niż” znaki alfabetyczne, a wielkie litery występują przed małymi literami.

Spójniki logiczne pozwalają nam połączyć zwroty warunkowe, które zwracająPrawdziwelubFałszywew bardziej złożone instrukcje, które również zwracają typy logiczne.

ŁączącyOznaczającyPrzykład (za = 7,b = 3)
orazPrawdziwejeśli oba sąPrawdziwea < 8 i b == 3 # Prawda
lubPrawdziwejeśli jedno lub oba sąPrawdziwea < 8 lub b == 9 # Prawda
niePrawdziwejeśli następujące jestFałszywenie < 3 # Prawda

Można je pogrupować w nawiasy i zwykle powinno to mieć na celu uniknięcie nieporozumień, zwłaszcza gdy następuje więcej niż jeden test anie.[2]

Na koniec zwróć uwagę, że generalnie każda strona anorazlublubpowinno skutkować tylkoPrawdziwelubFałszywe. Ekspresjaa == 3 lub a == 7ma poprawną formę, natomiasta == 3 lub 7nie. (W rzeczywistości,7w tym ostatnim kontekście będą rozumianePrawdziwe, a więca == 3 lub 7zawsze spowodujePrawdziwe.)

Logiczne niebezpieczeństwa

Zwróć uwagę na podobieństwo między=oraz==, a mimo to mają dramatycznie różne znaczenia: pierwszy to operator przypisania zmiennej, a drugi to test równości. Przypadkowe użycie jednego w miejscu, w którym chodzi o drugie, jest łatwym sposobem na wygenerowanie błędnego kodu. Tutajliczba == 1nie zainicjujeliczyćdo1; raczej zwróci, czy już jest1(lub spowoduje błąd, jeśliliczyćw tym momencie nie istnieje jako zmienna). Odwrotny błąd jest trudniejszy do popełnienia, ponieważ Python nie zezwala na przypisywanie zmiennych w definicjach instrukcji if i while.

W powyższym zamiarze jest ustalenie, czy długośćnastępnyjest wielokrotnością 3 (określoną przez wynikdł.(nast.)% 3przy użyciu operatora modulo), ale instrukcja if w tym przypadku powinna byćjeśli reszta == 0:. W wielu językach powyższe byłoby trudnym do znalezienia błędem (resztazostanie przydzielony do0, a wynik byłbyPrawdziwew każdym razie!). W Pythonie wynikiem jest błąd:SyntaxError: nieprawidłowa składnia.

Jednak pewna klasa niebezpiecznych porównań jest wspólna dla prawie każdego języka, w tym Pythona: porównanie dwóch typów zmiennoprzecinkowych pod kątem równości lub nierówności.

Chociaż liczby całkowite mogą być dokładnie reprezentowane w arytmetyce binarnej (np.751w systemie binarnym jest reprezentowana dokładnie jako1011101111), liczby zmiennoprzecinkowe mogą być reprezentowane tylko w przybliżeniu. Nie powinno to być całkowicie nieznane pojęcie; na przykład możemy zdecydować się na zaokrąglenie ułamków zwykłych do czterech miejsc po przecinku podczas wykonywania obliczeń na ołówku i papierze, pracując z 1/3 jako 0,3333. Problem polega na tym, że te błędy zaokrągleń mogą się komplikować w trudny do przewidzenia sposób. Jeśli zdecydujemy się obliczyć (1/3)*(1/3)/(1/3) jako 0.3333*0.3333/0.3333, pracując od lewej do prawej zaczniemy od 0.3333*0.3333 zaokrąglonych do czterech cyfr jako 0.1110. Następnie dzieli się ją przez 0,3333 i ponownie zaokrągla, aby otrzymać odpowiedź 0,3330. Tak więc, mimo że wiemy, że (1/3)*(1/3)/(1/3) == 1/3, nasz proces obliczeniowy nazwałby je nierównymi, ponieważ ostatecznie testuje 0,3330 przeciwko 0,3333!

Współczesne komputery mają znacznie więcej cyfr precyzji (w większości przypadków co najmniej około 15 cyfr dziesiętnych), ale problem pozostaje ten sam. Co gorsza, liczby, które nie wymagają zaokrąglania w naszym systemie arytmetycznym Podstawa-10, wymagają zaokrąglania w systemie Podstawa-2 komputera. Rozważ 0,2, które w systemie binarnym to 0,001100110011 i tak dalej. W rzeczy samej,0.2 * 0.2 / 0.2 == 0.2prowadzi doFałszywe!

Porównując pływaki z<,>,<=, oraz>=jest zwykle bezpieczny (w bardzo małych marginesach błędu), porównanie pływaków z==oraz!=zwykle wskazuje na niezrozumienie działania liczb zmiennoprzecinkowych.[3] W praktyce określilibyśmy, czy dwie wartości zmiennoprzecinkowe są wystarczająco podobne, z pewnym określonym marginesem błędu.

Zliczanie kodonów stop

Jako przykład użycia warunkowego przepływu sterowania rozważymy plik seq.txt, który zawiera pojedynczy ciąg DNA w pierwszym wierszu. Chcemy policzyć liczbę potencjalnych kodonów stop"ETYKIETKA",„TAA”, lub„TGA”które występują w sekwencji (tylko na przedniej nici, w tym przykładzie).

Nasza strategia będzie następująca: Najpierw musimy otworzyć plik i odczytać sekwencję z pierwszego wiersza. Będziemy musieli prowadzić licznik liczby kodonów stop, które widzimy; ten licznik zacznie się od zera i dodamy do niego po jednym dla każdego"ETYKIETKA",„TAA”, lub„TGA”podciąg, który widzimy. Aby znaleźć te trzy możliwości, możemy użyć pętli for i krojenia łańcuchów, aby sprawdzić każdy podsekwencja o wielkości 3 pz; sekwencja 3bp w indeksie0znastępnywystępuje wkolejny[0:3], ten na stanowisku1występuje wkolejne[1:4], i tak dalej.

Musimy uważać, aby nie próbować odczytać podciągu, który nie występuje w sekwencji. Gdybyseq = "AGAGAT", istnieją tylko cztery możliwe sekwencje 3bp, a próba wybrania tej zaczynającej się od indeksu 4,nast[4:7], spowoduje błąd. Co gorsza, indeksowanie ciągów zaczyna się od0, a także są osobliwości inkluzywnego/wyłącznego charakteru[]krojenie izasięg()funkcjonować!

Aby pomóc, narysujmy obraz przykładowej sekwencji, z różnymi indeksami i podsekwencjami o wielkości 3 pb, którym chcielibyśmy się przyjrzeć z adnotacjami.

Biorąc pod uwagę początkowy indeksindeks, podsekwencja 3bp jest zdefiniowana jakoseq[indeks:indeks + 3]. Dla powyższej sekwencjidł.(nast.)wróci?15. Pierwszym interesującym nas indeksem startowym jest0, podczas gdy ostatnim indeksem początkowym, który chcemy uwzględnić, jest12, lubdł.(nast.) - 3. Gdybyśmy mieli użyćzasięg()funkcja zwracająca listę interesujących nas sekwencji startowych, których użyjemyzakres(0, len(seq) - 3 + 1), gdzie+ 1wyjaśnia fakt, żezasięg()obejmuje pierwszy indeks, ale nie obejmuje ostatniego indeksu.[4]

Pamiętajmy też o bieganiu.rozebrać się()na sekwencji odczytu, ponieważ nie chcemy włączać żadnego znaki nowej linii zakłócają poprawne obliczenie długości sekwencji!

Uwaga w poniższym kodzie (który można znaleźć w pliku) stop_count_seq.py) wykomentowany wiersz#drukuj(kodon).

Podczas kodowania użyliśmy tego wiersza do wydrukowania każdego kodonu, aby mieć pewność, że podsekwencje o wielkości 3 pz zostały niezawodnie uwzględnione, zwłaszcza pierwszy i ostatni wseq1.txt(ATAorazAAT). Jest to ważna część procesu debugowania, ponieważ za pomocą tego typu kodu można łatwo popełnić małe błędy „po jednym”. Gdy byliśmy zadowoleni z rozwiązania, po prostu skomentowaliśmy instrukcję print.

W przypadku takich zadań okienkowych czasami łatwiej jest uzyskać dostęp do indeksów za pomocą pętli while.

Gdybyśmy chcieli uzyskać dostęp do nienakładających się kodonów, moglibyśmy użyćindeks = indeks + 3zamiastindeks = indeks + 1bez żadnych innych zmian w kodzie. Podobnie, gdybyśmy chcieli sprawdzić okna 5bp, moglibyśmy zastąpić instancje3z5(lub użyj arozmiar oknazmienny).

Ćwiczenia

  1. Masa cząsteczkowa jednoniciowego łańcucha DNA (w g/mol) to (liczba"A")*313,21 + (liczba"T")*304,2 + (liczba"C")*289.18 + (liczba"G")*329.21 – 61.96 (uwzględniając usunięcie jednego fosforanu i dodanie grupy hydroksylowej na pojedynczej nici).

    Napisz kod, który drukuje całkowitą masę cząsteczkową dla sekwencji w pliku seq.txt. Wynik powinien być21483.8. Zadzwoń do swojego programumol_weight_seq.py.

  2. Plik seqs.txt zawiera kilka sekwencji, po jednej w wierszu. Napisz nowy program w Pythonie, który wypisuje masę cząsteczkową każdego z nich w nowym wierszu. Na przykład:
    Możesz chcieć użyć znacznej części odpowiedzi na pytanie 1 wewnątrz jakiejś pętli. Zadzwoń do swojego programumol_weight_seqs.py.
  3. Plik ids_seqs.txt zawiera te same sekwencje coseqs.txt; jednak ten plik zawiera również identyfikatory sekwencji, z jednym identyfikatorem w wierszu, po którym następuje znak tabulacji (T), po której następuje sekwencja. Zmodyfikuj swój program z pytania 2, aby wydrukować to samo wyjście, w podobnym formacie: jeden identyfikator w wierszu, po którym następuje znak tabulacji, a następnie masa cząsteczkowa. Format wyjściowy powinien więc wyglądać tak (ale liczby będą inne, aby uniknąć podawania odpowiedzi):
    Zadzwoń do swojego programumol_weight_ids_seqs.py.

    Ponieważ znaki tabulacji powodują różne wyrównanie danych wyjściowych w zależności od długości ciągu identyfikatora, możesz chcieć uruchomić dane wyjściowe za pomocą narzędzia wiersza poleceńkolumnaz-Topcja, która automatycznie formatuje dane wejściowe rozdzielane tabulatorami.

  4. Utwórz zmodyfikowaną wersję programu w pytaniu 3 rozdziału 15, „Zbieranie i pętle, część 1: Listy idla”, dzięki czemu identyfikuje również lokalizacje podsekwencji, które się nakładają. Na przykład,"ZRAMOLAŁY"występuje„GAGAGAGAGATATGAGA"w pozycjach 1, 3, 5, 7 i 14.


Obejrzyj wideo: Jak rozróżnić próbę badawczą od kontrolnej? (Lipiec 2022).


Uwagi:

  1. Akecheta

    Bardzo szybka odpowiedź :)

  2. JoJotaxe

    I coś podobnego jest?

  3. Pyramus

    A co należy zrobić w tym przypadku?



Napisać wiadomość