4.2. pentru declarații
Instrucțiunea pentru Python diferă puțin de ceea ce puteți folosi în C sau Pascal. Mai mult decât oricare ar fi iterând asupra unei evoluții aritmetice a numerelor (ca în cazul lui Pascal) sau oferind utilizatorului posibilitatea de a defini atât etapa de repetare, cât și starea de oprire (ca C), instrucțiunea lui Python pentru iterație se repetă asupra elementelor din orice secvență (o listă sau un șir), în ordinea în care apar în secvență. De exemplu (nu este destinat jocului):
Dacă trebuie să modificați secvența pe care o repetați în interiorul bucla (de exemplu, pentru a duplica elementele selectate), este recomandat să creați o copie. Iterarea unei secvențe nu se face implicit o copie. Notatia de felie fata ca acest lucru deosebit de convenabil:
Instrucțiunea pentru Python diferă puțin de ceea ce puteți folosi în C sau Pascal. Mai mult decât oricare ar fi iterând asupra unei evoluții aritmetice a numerelor (ca în cazul lui Pascal) sau oferind utilizatorului posibilitatea de a defini atât etapa de repetare, cât și starea de oprire (ca C), instrucțiunea lui Python pentru iterație se repetă asupra elementelor din orice secvență (o listă sau un șir), în ordinea în care apar în secvență. De exemplu (nu este destinat jocului):
Dacă trebuie să modificați secvența pe care o repetați în interiorul bucla (de exemplu, pentru a duplica elementele selectate), este recomandat să creați o copie. Iterarea unei secvențe nu se face implicit o copie. Notatia de felie fata ca acest lucru deosebit de convenabil:
4.3. Intervalul () Funcția
Dacă trebuie să repetați o secvență de numere, intervalul de funcții încorporat () este la îndemână. Aceasta generează progrese aritmetice:
Punctul final dat nu este niciodată parte a secvenței generate; intervalul (10) generează 10 valori, indici legali pentru elementele cu o secvență de lungime 10. Este posibil să lăsăm intervalul să înceapă la un alt număr sau să specificăm o altă valoare (chiar negativă, uneori se numește "pas" ):
În majoritatea acestor cazuri, cu toate acestea, este convenabil să utilizați funcția enumerate () , consultați tehnicile de buclă .
Un lucru ciudat se întâmplă dacă imprimați doar o gamă:
În multe privințe, obiectul returnat de domeniul () se comportă ca și cum ar fi o listă, dar de fapt nu este. Este un obiect care returnează elementele succesive ale secvenței dorite atunci când o iterați peste ea, dar nu face într-adevăr lista, economisind astfel spațiu.
Spunem că un astfel de obiect este iterabil , adică potrivit ca țintă pentru funcții și construcții care se așteaptă la ceva din care pot obține elemente succesive până la epuizarea aprovizionării. Am văzut că declarația pentru este un astfel de iterator . Lista de funcții () este alta; creează liste de la iterables:
Mai târziu vom vedea mai multe funcții care returnează iterabile și vor lua iterații ca argument.
Dacă trebuie să repetați o secvență de numere, intervalul de funcții încorporat () este la îndemână. Aceasta generează progrese aritmetice:
Punctul final dat nu este niciodată parte a secvenței generate; intervalul (10) generează 10 valori, indici legali pentru elementele cu o secvență de lungime 10. Este posibil să lăsăm intervalul să înceapă la un alt număr sau să specificăm o altă valoare (chiar negativă, uneori se numește "pas" ):
În majoritatea acestor cazuri, cu toate acestea, este convenabil să utilizați funcția enumerate () , consultați tehnicile de buclă .
Un lucru ciudat se întâmplă dacă imprimați doar o gamă:
În multe privințe, obiectul returnat de domeniul () se comportă ca și cum ar fi o listă, dar de fapt nu este. Este un obiect care returnează elementele succesive ale secvenței dorite atunci când o iterați peste ea, dar nu face într-adevăr lista, economisind astfel spațiu.
Spunem că un astfel de obiect este iterabil , adică potrivit ca țintă pentru funcții și construcții care se așteaptă la ceva din care pot obține elemente succesive până la epuizarea aprovizionării. Am văzut că declarația pentru este un astfel de iterator . Lista de funcții () este alta; creează liste de la iterables:
Mai târziu vom vedea mai multe funcții care returnează iterabile și vor lua iterații ca argument.
4.4. întrerupeți și continuați declarațiile, și altfelClauzele pe buclă
Comportamentele buclă pot avea o altă clauză; se execută atunci când bucla se termină prin epuizarea listei (cu for ) sau atunci când condiția devine falsă (cu timp ), dar nu și atunci când bucla este terminată printr-o declarație de pauză . Acest lucru este exemplificat de următoarea buclă, care caută numere prime:
(Da, acest lucru este codul corect Uită - te atent:. Altfel clauza aparține pentru bucla, nu dacă . Statement)
Atunci când este utilizat cu o buclă, altfel clauza are mai multe în comun cu altcineva clauza de o încercare declarație decât o face cea în cazul în declarații: o încercare declarație de altă clauză rulează atunci când are loc nici o excepție, și o buclă de altă clauză funcționează atunci când nu pauză apare . Pentru mai multe informații despre instrucțiunile de încercare și despre excepții, consultați Excepții de manipulare .
Comportamentele buclă pot avea o altă clauză; se execută atunci când bucla se termină prin epuizarea listei (cu for ) sau atunci când condiția devine falsă (cu timp ), dar nu și atunci când bucla este terminată printr-o declarație de pauză . Acest lucru este exemplificat de următoarea buclă, care caută numere prime:
(Da, acest lucru este codul corect Uită - te atent:. Altfel clauza aparține pentru bucla, nu dacă . Statement)
Atunci când este utilizat cu o buclă, altfel clauza are mai multe în comun cu altcineva clauza de o încercare declarație decât o face cea în cazul în declarații: o încercare declarație de altă clauză rulează atunci când are loc nici o excepție, și o buclă de altă clauză funcționează atunci când nu pauză apare . Pentru mai multe informații despre instrucțiunile de încercare și despre excepții, consultați Excepții de manipulare .
4.5. declarații trecute
Declarația de trecere nu face nimic. Acesta poate fi folosit atunci când o declarație este cerută sintactic, dar programul nu necesită nicio acțiune. De exemplu:
Acest lucru este folosit în mod obișnuit pentru crearea unor clase minime:
Un alt loc de trecere poate fi folosit ca un suport pentru o funcție sau un corp condiționat atunci când lucrați la un nou cod, permițându-vă să continuați să vă gândiți la un nivel mai abstract. Trecere este ignorat în tăcere:
Declarația de trecere nu face nimic. Acesta poate fi folosit atunci când o declarație este cerută sintactic, dar programul nu necesită nicio acțiune. De exemplu:
Acest lucru este folosit în mod obișnuit pentru crearea unor clase minime:
Un alt loc de trecere poate fi folosit ca un suport pentru o funcție sau un corp condiționat atunci când lucrați la un nou cod, permițându-vă să continuați să vă gândiți la un nivel mai abstract. Trecere este ignorat în tăcere:
4.6. Definirea funcțiilor
Putem crea o funcție care scrie seria Fibonacci la o limită arbitrară:
Cuvântul cheie def introduce o funcție definiție . Acesta trebuie urmat de numele funcției și de lista paranteză a parametrilor formali. Instrucțiunile care formează corpul funcției încep la următoarea linie și trebuie să fie indentate.
Prima declarație a corpului funcției poate fi, opțional, un literal șir; acest șir literal este șirul de documentare al funcției sau docstring . (Mai multe despre docstrings pot fi găsite în secțiunea Documentation Strings .) Există instrumente care folosesc docstrings pentru a produce automat documente online sau imprimate sau pentru a permite utilizatorului să navigheze interactiv prin cod; este o practică bună să includeți docstrings în codul pe care îl scrieți, așa că faceți un obicei.
Executarea unei funcții introduce un nou tabel de simboluri folosite pentru variabilele locale ale funcției. Mai precis, toate alocările variabile ale unei funcții stochează valoarea în tabela simbolurilor locale; în timp ce referințele variabile se uită prima dată în tabela simbolurilor locale, apoi în tabelele cu simboluri locale ale funcțiilor de închidere, apoi în tabelul simbolurilor globale și, în final, în tabelul cu numele încorporate. Astfel, variabilele globale nu pot fi atribuite direct unei valori în cadrul unei funcții (cu excepția cazului în care sunt menționate într-o instrucțiune globală ), deși pot fi menționate.
Parametrii reali (argumente) la un apel funcțional sunt introduse în tabelul simbolului local al funcției numite atunci când este apelată; astfel, argumentele sunt transmise prin apel prin valoare (unde valoarea este întotdeauna o referință de obiect , nu valoarea obiectului). [1] Când o funcție apelează o altă funcție, este creată o nouă tabelă de simboluri locale pentru acel apel.
O definiție a funcției introduce numele funcției în tabela simbolică curentă. Valoarea numelui funcției are un tip care este recunoscut de către interpret ca o funcție definită de utilizator. Această valoare poate fi atribuită unui alt nume care poate fi folosit și ca o funcție. Acest lucru servește ca un mecanism general de redenumire:
Venind din alte limbi, s-ar putea să vă obiectați că fibra nu este o funcție, ci o procedură, deoarece nu revine o valoare. De fapt, chiar și funcții fără întoarcere declarație returnează o valoare, chiar dacă una destul de plictisitoare. Această valoare se numește Niciuna (este un nume încorporat). Scrierea valorii Niciunul nu este în mod normal suprimat de interpret dacă ar fi singura valoare scrisă. Puteți vedea dacă doriți cu adevărat să utilizați print () :
Este simplu să scrieți o funcție care returnează o listă cu numerele seriei Fibonacci, în loc să o tipăriți:
Acest exemplu, ca de obicei, demonstrează câteva noi caracteristici Python:
- Retur Declarația revine cu o valoare dintr - o funcție. întoarcere fără un argument expresie returnează Niciuna . Falling off de la sfârșitul unei funcții, de asemenea, returnează Nici unul.
- Instrucțiunea result.append (a) apelează o metodă a rezultatului obiectului listă . O metodă este o funcție care "aparține" unui obiect și este numită obj.methodname , unde objeste un obiect (aceasta poate fi o expresie), iar methodname este numele unei metode care este definită de tipul obiectului. Diferitele tipuri definesc diferite metode. Metodele de diferite tipuri pot avea același nume fără a cauza ambiguități. (Este posibil să definiți propriile tipuri de obiecte și metode, folosind clase , vedeți Clase ) Metoda append ()prezentată în exemplu este definită pentru obiectele din listă; adaugă un nou element la sfârșitul listei. În acest exemplu este echivalent cu rezultatul = rezultat + [a] , dar mai eficient.
Putem crea o funcție care scrie seria Fibonacci la o limită arbitrară:
Cuvântul cheie def introduce o funcție definiție . Acesta trebuie urmat de numele funcției și de lista paranteză a parametrilor formali. Instrucțiunile care formează corpul funcției încep la următoarea linie și trebuie să fie indentate.
Prima declarație a corpului funcției poate fi, opțional, un literal șir; acest șir literal este șirul de documentare al funcției sau docstring . (Mai multe despre docstrings pot fi găsite în secțiunea Documentation Strings .) Există instrumente care folosesc docstrings pentru a produce automat documente online sau imprimate sau pentru a permite utilizatorului să navigheze interactiv prin cod; este o practică bună să includeți docstrings în codul pe care îl scrieți, așa că faceți un obicei.
Executarea unei funcții introduce un nou tabel de simboluri folosite pentru variabilele locale ale funcției. Mai precis, toate alocările variabile ale unei funcții stochează valoarea în tabela simbolurilor locale; în timp ce referințele variabile se uită prima dată în tabela simbolurilor locale, apoi în tabelele cu simboluri locale ale funcțiilor de închidere, apoi în tabelul simbolurilor globale și, în final, în tabelul cu numele încorporate. Astfel, variabilele globale nu pot fi atribuite direct unei valori în cadrul unei funcții (cu excepția cazului în care sunt menționate într-o instrucțiune globală ), deși pot fi menționate.
Parametrii reali (argumente) la un apel funcțional sunt introduse în tabelul simbolului local al funcției numite atunci când este apelată; astfel, argumentele sunt transmise prin apel prin valoare (unde valoarea este întotdeauna o referință de obiect , nu valoarea obiectului). [1] Când o funcție apelează o altă funcție, este creată o nouă tabelă de simboluri locale pentru acel apel.
O definiție a funcției introduce numele funcției în tabela simbolică curentă. Valoarea numelui funcției are un tip care este recunoscut de către interpret ca o funcție definită de utilizator. Această valoare poate fi atribuită unui alt nume care poate fi folosit și ca o funcție. Acest lucru servește ca un mecanism general de redenumire:
Venind din alte limbi, s-ar putea să vă obiectați că fibra nu este o funcție, ci o procedură, deoarece nu revine o valoare. De fapt, chiar și funcții fără întoarcere declarație returnează o valoare, chiar dacă una destul de plictisitoare. Această valoare se numește Niciuna (este un nume încorporat). Scrierea valorii Niciunul nu este în mod normal suprimat de interpret dacă ar fi singura valoare scrisă. Puteți vedea dacă doriți cu adevărat să utilizați print () :
Este simplu să scrieți o funcție care returnează o listă cu numerele seriei Fibonacci, în loc să o tipăriți:
Acest exemplu, ca de obicei, demonstrează câteva noi caracteristici Python:
- Retur Declarația revine cu o valoare dintr - o funcție. întoarcere fără un argument expresie returnează Niciuna . Falling off de la sfârșitul unei funcții, de asemenea, returnează Nici unul.
- Instrucțiunea result.append (a) apelează o metodă a rezultatului obiectului listă . O metodă este o funcție care "aparține" unui obiect și este numită obj.methodname , unde objeste un obiect (aceasta poate fi o expresie), iar methodname este numele unei metode care este definită de tipul obiectului. Diferitele tipuri definesc diferite metode. Metodele de diferite tipuri pot avea același nume fără a cauza ambiguități. (Este posibil să definiți propriile tipuri de obiecte și metode, folosind clase , vedeți Clase ) Metoda append ()prezentată în exemplu este definită pentru obiectele din listă; adaugă un nou element la sfârșitul listei. În acest exemplu este echivalent cu rezultatul = rezultat + [a] , dar mai eficient.
4.7. Mai multe despre definirea funcțiilor
De asemenea, este posibil să se definească funcții cu un număr variabil de argumente. Există trei forme care pot fi combinate.
De asemenea, este posibil să se definească funcții cu un număr variabil de argumente. Există trei forme care pot fi combinate.
4.7.1. Valori implicite ale argumentelor
Forma cea mai utilă este să specificați o valoare implicită pentru unul sau mai multe argumente. Aceasta creează o funcție care poate fi apelată cu mai puține argumente decât este definită pentru a permite. De exemplu:
Această funcție poate fi apelată în mai multe moduri:
- precizându -se numai argumentul obligatoriu: ask_ok ( „Nu ai într - adevăr doriți sărenunțați?“)
- oferind unul dintre argumentele opționale: ask_ok ( „OK pentru a suprascrie ? fișierul“,2)
- sau chiar da toate argumentele: ask_ok ( „OK pentru a suprascrie fișierul?“, 2, „Haipe, doar da sau nu!“)
Acest exemplu introduce , de asemenea , în cuvinte cheie. Aceasta testează dacă o secvență conține o anumită valoare sau nu.
Valorile implicite sunt evaluate în punctul de definire a funcției în domeniul definitoriu , astfel încât
va imprima 5 .
Avertisment important: Valoarea implicită este evaluată o singură dată. Aceasta face o diferență când implicit este un obiect mutabil, cum ar fi lista, dicționarul sau instanțele majorității clasei. De exemplu, următoarea funcție acumulează argumentele care i-au fost transmise în apelurile următoare:
Aceasta va fi imprimată
Dacă nu doriți ca parola implicită să fie împărțită între apelurile ulterioare, puteți scrie funcția în felul acesta:
Forma cea mai utilă este să specificați o valoare implicită pentru unul sau mai multe argumente. Aceasta creează o funcție care poate fi apelată cu mai puține argumente decât este definită pentru a permite. De exemplu:
Această funcție poate fi apelată în mai multe moduri:
- precizându -se numai argumentul obligatoriu: ask_ok ( „Nu ai într - adevăr doriți sărenunțați?“)
- oferind unul dintre argumentele opționale: ask_ok ( „OK pentru a suprascrie ? fișierul“,2)
- sau chiar da toate argumentele: ask_ok ( „OK pentru a suprascrie fișierul?“, 2, „Haipe, doar da sau nu!“)
Acest exemplu introduce , de asemenea , în cuvinte cheie. Aceasta testează dacă o secvență conține o anumită valoare sau nu.
Valorile implicite sunt evaluate în punctul de definire a funcției în domeniul definitoriu , astfel încât
va imprima 5 .
Avertisment important: Valoarea implicită este evaluată o singură dată. Aceasta face o diferență când implicit este un obiect mutabil, cum ar fi lista, dicționarul sau instanțele majorității clasei. De exemplu, următoarea funcție acumulează argumentele care i-au fost transmise în apelurile următoare:
Aceasta va fi imprimată
Dacă nu doriți ca parola implicită să fie împărțită între apelurile ulterioare, puteți scrie funcția în felul acesta:
4.7.2. Argumentele pentru cuvinte cheie
Funcțiile pot fi de asemenea apelate folosind argumentele de cuvinte cheie ale formulei kwarg = value . De exemplu, următoarea funcție:
acceptă un argument necesar ( tensiune ) și trei argumente opționale ( stare , acțiune și tip ). Această funcție poate fi apelată în oricare din următoarele moduri:
dar toate apelurile următoare ar fi nevalide:
Într-un apel pentru funcții, argumentele cuvintelor cheie trebuie să respecte argumentele poziționale. Toate argumentele de cuvinte cheie trecute trebuie să se potrivească cu unul dintre argumentele acceptate de funcție (de exemplu, actorul nu este un argument valid pentru funcția de papagal ) și ordinea lor nu este importantă. Acest lucru include și argumente non-opționale (de exemplu, papagalul (tensiunea = 1000) este valabil și). Nici un argument nu poate primi o valoare mai mult decât o dată. Iată un exemplu care nu reușește din cauza acestei restricții:
Atunci când este prezent un parametru formal final al formulei ** , acesta primește un dicționar (vezi tipurile de mapare - dict ) care conțin toate argumentele cuvintelor cheie, cu excepția celor care corespund unui parametru formal. Aceasta poate fi combinată cu un parametru formal al formularului * (descris în următoarea subsecțiune) care primește o tuplă care conține argumentele poziționale dincolo de lista de parametri formali. ( * numele trebuie să aibă loc înainte de ** nume .) De exemplu, dacă definim o funcție ca aceasta:
Ar putea fi numit astfel:
și, desigur, ar tipări:
Rețineți că lista de nume de cuvinte cheie ale cuvintelor cheie este creată prin sortarea rezultatelor metodei tastelor () ale dicționarului cuvintelor cheie înainte de a imprima conținutul; dacă acest lucru nu se face, ordinea în care sunt imprimate argumentele este nedefinită.
Funcțiile pot fi de asemenea apelate folosind argumentele de cuvinte cheie ale formulei kwarg = value . De exemplu, următoarea funcție:
acceptă un argument necesar ( tensiune ) și trei argumente opționale ( stare , acțiune și tip ). Această funcție poate fi apelată în oricare din următoarele moduri:
dar toate apelurile următoare ar fi nevalide:
Într-un apel pentru funcții, argumentele cuvintelor cheie trebuie să respecte argumentele poziționale. Toate argumentele de cuvinte cheie trecute trebuie să se potrivească cu unul dintre argumentele acceptate de funcție (de exemplu, actorul nu este un argument valid pentru funcția de papagal ) și ordinea lor nu este importantă. Acest lucru include și argumente non-opționale (de exemplu, papagalul (tensiunea = 1000) este valabil și). Nici un argument nu poate primi o valoare mai mult decât o dată. Iată un exemplu care nu reușește din cauza acestei restricții:
Atunci când este prezent un parametru formal final al formulei ** , acesta primește un dicționar (vezi tipurile de mapare - dict ) care conțin toate argumentele cuvintelor cheie, cu excepția celor care corespund unui parametru formal. Aceasta poate fi combinată cu un parametru formal al formularului * (descris în următoarea subsecțiune) care primește o tuplă care conține argumentele poziționale dincolo de lista de parametri formali. ( * numele trebuie să aibă loc înainte de ** nume .) De exemplu, dacă definim o funcție ca aceasta:
Ar putea fi numit astfel:
și, desigur, ar tipări:
Rețineți că lista de nume de cuvinte cheie ale cuvintelor cheie este creată prin sortarea rezultatelor metodei tastelor () ale dicționarului cuvintelor cheie înainte de a imprima conținutul; dacă acest lucru nu se face, ordinea în care sunt imprimate argumentele este nedefinită.
4.7.3. Liste de argumente libere
În cele din urmă, opțiunea cea mai puțin frecvent utilizată este de a specifica că o funcție poate fi apelată cu un număr arbitrar de argumente. Aceste argumente vor fi înfășurate într-o tuplă (a se vedea Tupele și secvențele ). Înainte de numărul variabil de argumente, pot apărea zero sau mai multe argumente normale.
În mod normal, aceste argumente variadic vor fi ultime în lista parametrilor formali, pentru că vor scoate toate argumentele de intrare rămase care sunt transmise funcției. Orice parametri formali care apar după parametrul * args sunt argumentele "doar pentru cuvinte cheie", ceea ce înseamnă că ele pot fi folosite doar ca cuvinte cheie, nu ca argumente poziționale.
În cele din urmă, opțiunea cea mai puțin frecvent utilizată este de a specifica că o funcție poate fi apelată cu un număr arbitrar de argumente. Aceste argumente vor fi înfășurate într-o tuplă (a se vedea Tupele și secvențele ). Înainte de numărul variabil de argumente, pot apărea zero sau mai multe argumente normale.
În mod normal, aceste argumente variadic vor fi ultime în lista parametrilor formali, pentru că vor scoate toate argumentele de intrare rămase care sunt transmise funcției. Orice parametri formali care apar după parametrul * args sunt argumentele "doar pentru cuvinte cheie", ceea ce înseamnă că ele pot fi folosite doar ca cuvinte cheie, nu ca argumente poziționale.
4.7.4. Despachetarea listelor de argumente
Situația inversă apare atunci când argumentele se află deja într-o listă sau în tuplu, dar trebuie să fie despachetate pentru un apel de funcție care necesită argumente poziționale separate. De exemplu, funcția range () încorporată așteaptă argumente separate de pornire și oprire . Dacă acestea nu sunt disponibile separat, scrieți apelul pentru funcții cu * -operatorul pentru a despacheta argumentele dintr-o listă sau dintr-o listă:
În același mod, dicționarele pot furniza argumente de cuvinte cheie cu ** -operator:
Situația inversă apare atunci când argumentele se află deja într-o listă sau în tuplu, dar trebuie să fie despachetate pentru un apel de funcție care necesită argumente poziționale separate. De exemplu, funcția range () încorporată așteaptă argumente separate de pornire și oprire . Dacă acestea nu sunt disponibile separat, scrieți apelul pentru funcții cu * -operatorul pentru a despacheta argumentele dintr-o listă sau dintr-o listă:
În același mod, dicționarele pot furniza argumente de cuvinte cheie cu ** -operator:
4.7.5. Expresii Lambda
Funcțiile anonime mici pot fi create cu cuvântul cheie lambda . Această funcție returnează suma celor două argumente: lambda a, b: a + b . Funcțiile Lambda pot fi utilizate ori de câte ori sunt necesare obiecte funcționale. Acestea sunt limitate sintactic la o singură expresie. Semantic, ele sunt doar zahăr sintactic pentru o definiție normală a funcției. Asemenea definițiilor de funcții imbricate, funcțiile lambda pot să vadă variabile din domeniul de aplicare care conține:
Exemplul de mai sus utilizează o expresie lambda pentru a returna o funcție. O altă utilizare este aceea de a transmite o funcție mică ca argument:
Funcțiile anonime mici pot fi create cu cuvântul cheie lambda . Această funcție returnează suma celor două argumente: lambda a, b: a + b . Funcțiile Lambda pot fi utilizate ori de câte ori sunt necesare obiecte funcționale. Acestea sunt limitate sintactic la o singură expresie. Semantic, ele sunt doar zahăr sintactic pentru o definiție normală a funcției. Asemenea definițiilor de funcții imbricate, funcțiile lambda pot să vadă variabile din domeniul de aplicare care conține:
Exemplul de mai sus utilizează o expresie lambda pentru a returna o funcție. O altă utilizare este aceea de a transmite o funcție mică ca argument:
4.7.6. Structuri de documentare
Iată câteva convenții despre conținutul și formatarea șirurilor de documentație.
Prima linie trebuie să fie întotdeauna un rezumat scurt și concis al scopului obiectului. Pentru brevitate, nu ar trebui să precizeze în mod explicit numele sau tipul obiectului, deoarece acestea sunt disponibile prin alte mijloace (cu excepția cazului în care numele se întâmplă să fie un verb care descrie funcționarea unei funcții). Această linie trebuie să înceapă cu o literă mare și să se încheie cu o perioadă.
Dacă există mai multe linii în șirul de documentație, al doilea rând trebuie să fie necompletat, separând vizual rezumatul de restul descrierii. Următoarele rânduri ar trebui să fie unul sau mai multe paragrafe care descriu convențiile de apel ale obiectului, efectele sale secundare etc.
Parserul Python nu dezinstalează indentarea de la literali de șir multi-line în Python, așa că instrumentele care procesează documentația trebuie să desprindă indentarea, dacă se dorește. Aceasta se face folosind următoarea convenție. Prima linie ne-goală după prima linie a șirului determină cantitatea de indentare pentru întregul șir de documentație. (Nu putem folosi prima linie deoarece este în general adiacentă citatelor de deschidere ale șirului, astfel încât indentarea sa nu este vizibilă în literalul șir.) Spațiul alb "echivalent" cu această indentare este apoi desprins de la începutul tuturor liniilor șirului . Linii care sunt mai puțin indentate nu trebuie să apară, dar dacă se întâmplă, toate spațiile lor de vârf trebuie să fie dezbrăcate. Echivalența spațiilor albe trebuie testată după expansiunea filelor (în mod normal, la 8 spații).
Iată un exemplu de docstring multi-linie:
Iată câteva convenții despre conținutul și formatarea șirurilor de documentație.
Prima linie trebuie să fie întotdeauna un rezumat scurt și concis al scopului obiectului. Pentru brevitate, nu ar trebui să precizeze în mod explicit numele sau tipul obiectului, deoarece acestea sunt disponibile prin alte mijloace (cu excepția cazului în care numele se întâmplă să fie un verb care descrie funcționarea unei funcții). Această linie trebuie să înceapă cu o literă mare și să se încheie cu o perioadă.
Dacă există mai multe linii în șirul de documentație, al doilea rând trebuie să fie necompletat, separând vizual rezumatul de restul descrierii. Următoarele rânduri ar trebui să fie unul sau mai multe paragrafe care descriu convențiile de apel ale obiectului, efectele sale secundare etc.
Parserul Python nu dezinstalează indentarea de la literali de șir multi-line în Python, așa că instrumentele care procesează documentația trebuie să desprindă indentarea, dacă se dorește. Aceasta se face folosind următoarea convenție. Prima linie ne-goală după prima linie a șirului determină cantitatea de indentare pentru întregul șir de documentație. (Nu putem folosi prima linie deoarece este în general adiacentă citatelor de deschidere ale șirului, astfel încât indentarea sa nu este vizibilă în literalul șir.) Spațiul alb "echivalent" cu această indentare este apoi desprins de la începutul tuturor liniilor șirului . Linii care sunt mai puțin indentate nu trebuie să apară, dar dacă se întâmplă, toate spațiile lor de vârf trebuie să fie dezbrăcate. Echivalența spațiilor albe trebuie testată după expansiunea filelor (în mod normal, la 8 spații).
Iată un exemplu de docstring multi-linie:
4.7.7. Annotările funcției
Funcțiile adnotărilor sunt complet opționale, informații despre metadatele arbitrare despre funcțiile definite de utilizator. Nici Python, nici biblioteca standard nu utilizează adnotări de funcții în nici un fel; această secțiune arată doar sintaxa. Proiectele terților pot folosi adnotări de funcții pentru documentare, verificări de tip și alte utilizări.
Adnotările sunt stocate în atributul __annotations__ al funcției ca dicționar și nu au efect asupra niciunei alte părți a funcției. Adnotările adnotărilor sunt definite după un nume de parametru printr-o colonă, urmată de o expresie evaluând valoarea adnotării. Returnarea adnotărilor este definită printr-un literal -> , urmat de o expresie, între lista de parametri și colon care denotă sfârșitul instrucțiunii def . Următorul exemplu are un argument pozițional, un argument cheie și valoarea returnată adnotată cu nonsens:
Funcțiile adnotărilor sunt complet opționale, informații despre metadatele arbitrare despre funcțiile definite de utilizator. Nici Python, nici biblioteca standard nu utilizează adnotări de funcții în nici un fel; această secțiune arată doar sintaxa. Proiectele terților pot folosi adnotări de funcții pentru documentare, verificări de tip și alte utilizări.
Adnotările sunt stocate în atributul __annotations__ al funcției ca dicționar și nu au efect asupra niciunei alte părți a funcției. Adnotările adnotărilor sunt definite după un nume de parametru printr-o colonă, urmată de o expresie evaluând valoarea adnotării. Returnarea adnotărilor este definită printr-un literal -> , urmat de o expresie, între lista de parametri și colon care denotă sfârșitul instrucțiunii def . Următorul exemplu are un argument pozițional, un argument cheie și valoarea returnată adnotată cu nonsens:
4.8. Intermezzo: Stilul de codificare
Acum că sunteți pe punctul de a scrie mai multe piese mai complexe de Python, este un moment potrivit să vorbiți despre stilul de codare . Cele mai multe limbi pot fi scrise (sau mai concise, formatate) în diferite stiluri; unele sunt mai ușor de citit decât altele. A face ușor pentru alții să vă citească codul este întotdeauna o idee bună, și adoptarea unui stil de codare frumos ajută extraordinar pentru asta.
Pentru Python, PEP 8 a apărut ca ghid de stil pe care majoritatea proiectelor respectă; promovează un stil de codare foarte lizibil și plăcut pentru ochi. Fiecare dezvoltator Python ar trebui să o citească la un moment dat; aici sunt cele mai importante puncte extrase pentru tine:
-
Utilizați indentare cu 4 spații și nu există file.
4 spații sunt un compromis bun între indentarea mică (permite o adâncime de cuibare mai mare) și o indentare mare (mai ușor de citit). Filele introduc confuzie și sunt cel mai bine evitate.
-
Înfășurați linii astfel încât să nu depășească 79 de caractere.
Acest lucru ajută utilizatorii cu afișaje mici și face posibilă existența mai multor fișiere de coduri pe ecranele mai mari.
-
Utilizați linii goale pentru a separa funcțiile și clasele și blocurile mai mari de coduri din interiorul funcțiilor.
-
Când este posibil, puneți comentariile pe o linie proprie.
-
Utilizați docstrings.
-
Utilizați spațiile în jurul operatorilor și după virgule, dar nu direct în interiorul bracketing constructe: a = f (1, 2) + g (3, 4) .
-
Denumiți cursurile și funcțiile în mod consecvent; convenția este de a folosi CamelCase pentru clase și lower_case_with_underscores pentru funcții și metode. Utilizați întotdeauna sine ca nume pentru primul argument al metodei (consultați A First Look at Classes pentru mai multe despre clase și metode).
-
Nu utilizați codificări fanteziste dacă codul dvs. este destinat să fie utilizat în medii internaționale. Python implicit, UTF-8, sau chiar simplu ASCII funcționează cel mai bine în orice caz.
-
De asemenea, nu utilizați caractere non-ASCII în identificatori dacă există doar cel mai mic șansă ca persoanele care vorbesc o limbă diferită să citească sau să mențină codul.
Notă de subsol
[1] De fapt, apelul după referința obiectului ar fi o descriere mai bună, deoarece dacă un obiect mutabil este trecut, apelantul va vedea orice schimbare pe care apelantul o face (elementele introduse în listă).
Sursa: https://docs.python.org/3.3/tutorial/classes.html
Acum că sunteți pe punctul de a scrie mai multe piese mai complexe de Python, este un moment potrivit să vorbiți despre stilul de codare . Cele mai multe limbi pot fi scrise (sau mai concise, formatate) în diferite stiluri; unele sunt mai ușor de citit decât altele. A face ușor pentru alții să vă citească codul este întotdeauna o idee bună, și adoptarea unui stil de codare frumos ajută extraordinar pentru asta.
Pentru Python, PEP 8 a apărut ca ghid de stil pe care majoritatea proiectelor respectă; promovează un stil de codare foarte lizibil și plăcut pentru ochi. Fiecare dezvoltator Python ar trebui să o citească la un moment dat; aici sunt cele mai importante puncte extrase pentru tine:
- Utilizați indentare cu 4 spații și nu există file.4 spații sunt un compromis bun între indentarea mică (permite o adâncime de cuibare mai mare) și o indentare mare (mai ușor de citit). Filele introduc confuzie și sunt cel mai bine evitate.
- Înfășurați linii astfel încât să nu depășească 79 de caractere.Acest lucru ajută utilizatorii cu afișaje mici și face posibilă existența mai multor fișiere de coduri pe ecranele mai mari.
- Utilizați linii goale pentru a separa funcțiile și clasele și blocurile mai mari de coduri din interiorul funcțiilor.
- Când este posibil, puneți comentariile pe o linie proprie.
- Utilizați docstrings.
- Utilizați spațiile în jurul operatorilor și după virgule, dar nu direct în interiorul bracketing constructe: a = f (1, 2) + g (3, 4) .
- Denumiți cursurile și funcțiile în mod consecvent; convenția este de a folosi CamelCase pentru clase și lower_case_with_underscores pentru funcții și metode. Utilizați întotdeauna sine ca nume pentru primul argument al metodei (consultați A First Look at Classes pentru mai multe despre clase și metode).
- Nu utilizați codificări fanteziste dacă codul dvs. este destinat să fie utilizat în medii internaționale. Python implicit, UTF-8, sau chiar simplu ASCII funcționează cel mai bine în orice caz.
- De asemenea, nu utilizați caractere non-ASCII în identificatori dacă există doar cel mai mic șansă ca persoanele care vorbesc o limbă diferită să citească sau să mențină codul.
Notă de subsol
[1] | De fapt, apelul după referința obiectului ar fi o descriere mai bună, deoarece dacă un obiect mutabil este trecut, apelantul va vedea orice schimbare pe care apelantul o face (elementele introduse în listă). Sursa: https://docs.python.org/3.3/tutorial/classes.html |
Niciun comentariu:
Trimiteți un comentariu