Source: http://www.garshol.priv.no/download/text/perl.html
Pre nego što počnemo
Samo napomenu pre nego što nastavite: to je zasnovano na mom ličnom iskustvu sa Perlom. Znam da drugi ljudi imaju drugačije mišljenje o ovom jeziku i oni su dobrodošli na njih. Ja samo želim da predstavim svoj, jer vidim puno poruka na Usenetu od ljudi koji izgleda da će upoznati Perla i želim da im kažem da to možda nije dobra ideja. Dakle, napisao sam ovaj članak jednom za svagda sa mojim grudima.
Ako mislite da je bilo šta u ovom članku objektivno pogrešno, molim vas pošaljite mi e-mail o tome. Želim da ovaj članak bude što je moguće tačniji. Ako se samo ne slažete sa mnom, to mi možete reći.
Trebalo bi da objasnim zašto se Perl nazivam “Kamelom”: Biblija o svim stvarima Perl je Larry Walls “Programming Perl”, koju objavljuje O’Reilly. O’Reilly obično daje lepo graviranje životinje iz 19. veka na naslovnoj strani svojih knjiga. “Programming Perl” je dobila kamilu i od tada je poznata kao “kamelska knjiga”. Larry Wall takođe često upućuje na Perl kao kamilu.
Članak bi trebao biti ažuriran kao Python 1.5.2 i Perl 5.005. Ako se nešto promenilo od tih verzija, slobodno mi pričajte o tome.
Upoznajte Kamel
Saznao sam Perl 5 početkom ’97. Preuzeo sam Patrick M. Ryans odličan uvod u Perl i ustanovio da je puno stvari koje sam radila na teškom putu sa C, Pascal i Java bilo mnogo lakše u Perlu. Za obradu teksta i pristup sistemskim funkcijama Perl je izgledao kao pravi Bog-poslati. Sjajno, pomislio sam i kupio sam sebe “Learning Perl”, od strane Randal Schwartz. (Poznat i pod nazivom “knjiga knjige”.)
Pročitao sam prilično brzo i sisao sve ove predivne nove funkcije. Prvi program koji sam napravio pročitao je dnevnik web servera i brojao koliko puta svaku stranicu pristupa. Napisao sam ga za pola sata i radio je odmah! Ne samo da je to funkcionisalo, već je i Perl izgledalo da je u stanju da previdi nevažne greške umesto da se sruši ili prekine kao što bi programi C/Pascal/Java mogli.
(Taj program je objavljen u mnogim verzijama i imao je prilično malo korisnika, tako da Perl nije beskoristan, samo je nepovoljan.)
Da se ne sviđam Kamelom
Bila sam zaista očarana ovim jezikom i počela da je koristim sve više i više. Međutim, dok sam nastavio da ga koristim, nastavio sam otkrivati nove stvari koje im se nisu dopadale. Nakon nekog vremena dodao se na prilično značajnu listu.
Nezakonita sintaksa
Iako priznajem čitljivost malo trpi …
-Larry Wall in <[email protected]>
Jedna od prvih stvari koje sam otkrio nije mi se dopala sintaksa. Veoma je kompleksno i ima puno operatora i specijalnih sintaksi. To znači da dobijete kratak, ali složen kod sa mnoštvom sintaksnih grešaka koji traže malo vremena da se reše.
To takođe znači da je čitanje nekog elses koda teško. Ne možete lako razumjeti nekoga od els skripti i prilagoditi ih vlastitim potrebama, niti možete lako prevesti održavanje nekog elses programa.
Pišem prilično čist Perl kod, jer se držim dalje od većine obfuscating funkcija, ali iako je prilično teško čitati. Ovo je jedan običan primer:
foreach $Key (@SearchEngines) {
if ($fields[11] =~ /$Key/i) {
$HitFrom[4]++; #Yes, search engine
$SEReferrals{$SENames{$Key}}++;
$PageRefs{$fields[6]}{$SENames{$Key}}++;
$found=1;
last;
}
}
To nije čak ni posebno loš primjer. Evo funkciju iz distribucije Perl koji proizvodi vrednost Soundex iz ime ili riječ:
sub soundex
{
local (@s, $f, $fc, $_) = @_;
push @s, '' unless @s; # handle no args as a single empty string
foreach (@s)
{
tr/a-z/A-Z/;
tr/A-Z//cd;
if ($_ eq '')
{
$_ = $soundex_nocode;
}
else
{
($f) = /^(.)/;
tr/AEHIOUWYBFPVCGJKQSXZDTLMNR/00000000111122222222334556/;
($fc) = /^(.)/;
s/^$fc+//;
tr///cs;
tr/0//d;
$_ = $f . $_ . '000';
s/^(.{4}).*/$1/;
}
}
wantarray ? @s : shift @s;
}
Međutim, čak ni to nije baš loše. Perl Journal je izvršila Obfuscated Perl takmičenje. Pobjednici su ovdje. Budite upozorio, ipak. Ovi programi daje riječ nečitljiva potpuno novih i prethodno nezamislive značenja. (I ne, to nije argument za Perl što nečitljiv, ali uglavnom uključena kao duhovit i znatiželjan stavku.)
Programeri i čitljivost
Neki ljudi koji su ovo čitali su se žalili na to “Ali svako može napisati nečitljivu šifru na bilo kom jeziku!” i to je sigurno tačno. Međutim, čini se da neki jezici podstiču čvrsti čitač koda, dok drugi to izgleda odvraćaju.
Od onoga što sam video o sopstvenom i drugom ljudskom kodu Perl stvarno ohrabruje teško čitljive programe. Primjer Soundex-a dolazi iz distribucije Perl i pronađen je samo slučajnim gledanjem kroz 2 ili 3 datoteke. Ponovo gledajući ga sada vidim mnoge druge primere (poput lib/pod/text.pm and lib/file/copy.pm), iako je većina skripti suviše kratka da bi bila teška za čitanje.
Neki su tvrdili da je Perl više poput prirodnih jezika od većine programskih jezika, i to mi svakako izgleda ispravno. A meni je to manjak: prirodni jezik je izuzetno kompleksan, dvosmislen i pun suptilnih nijansi i značenja. Ja sigurno ne želim da su mi programi takvi, ali čini se da neki to rade. Pretpostavljam da će čitalac morati saznati za koju kategoriju pripada.
Previše specijalnih konstrukcija
Mnoge Perl-ove funkcije su ugrađene u sam jezički jezgri, umesto da se smeštaju u zasebne biblioteke. Jedan primjer toga je rukovanje redovnim izrazima, za koje postoji posebna sintaksa. Ovo ima prednost da postoje neki pogodni načini da radite stvari koje se najčešće rade, ali to takođe znači da ne dobijate prednosti objekata.
Da uzmemo jedan primer, Perl ima poseban konstrukt zvani formati, koji su neka vrsta šablona koje možete koristiti za generisanje dobrih tekstualnih izvještaja. Prilično zgodan, ali ugrađen u jezik. Dakle, ne možete kreirati listu formata, vratiti ih iz funkcija i tako dalje, što će u mnogim slučajevima biti ozbiljne neugodnosti.
Mislim da možete to raditi pomoću ručica za datoteke, ali pošto se takođe tretiraju kao posebni slučajevi, nikad nisam mogao da shvatim kako. Pokušao sam da koristim reference, ali nikada nisam uspeo da radim.
Teško je izgraditi strukture podataka
U dokumentaciji Perl-a postoji posebna priručna stranica kako kreirati nizove u nizovima i hešama unutar hašiša. I stvarno je neophodno. Imao sam puno boli pokušavajući da shvatim kako to raditi, čak i nakon što je čitao nekoliko puta. Ovo je nešto što me je zaista potreslo, jer na drugim jezicima ovo je nešto što radite, bez razmišljanja o tome.
U Lisp-u ovo postavlja varijablu a na listu:
(setq a '(1 2 3 4))
Ovde kreiramo listu b gdje je prvi element još jedna lista:
(setq b '((0.8 0.9 1) 2 3 4))
Evo prve liste u Perl:
@a=(1,2,3,4);
a ovo je drugi:
@b=((0.8,0.9,1),2,3,4);
(@ pre naziva promenljive govori Perlu da su to varijable nizova.) To nije bilo tako loše, zar ne? Pa, hajde da pokušamo ovo iskoristiti.
Da biste izabrali prvi element prve liste u Lisp-u, jednostavno pišete
(first a)
i Lisp vam daje
1
Da biste dobili prvi element druge liste koju pišete
(first b)
i Lisp vam daje
(0.8 0.9 1)
Probajmo ovo Perl.
$a[0]
daje nam
1
$ Prije imena promenljive govori Perlu da želimo jednu vrijednost (skalar u Perl lingo), a ne niz. [0] kaže Perlu da želimo prvu vrijednost polja. Perl, kao i mnogi drugi jezici i API, broje od 0.
Onda ćemo
$b[0]
i Perl srećno nam daje
0.8
Tako je Perl slomio na listu unutar liste b i izvadio prvu vrijednost. Ili je, umjesto toga, spustila b na jednu listu kada smo je stvorili, tako da je sada zaista jedna spisak sa 6 elemenata.
Da bismo to uradili, trebali smo pisati
@b=([(0.8,0.9,1)],2,3,4);
kad smo napravili spisak. [] unosi referencu na unutrašnju listu kao prvi element spoljne liste, umesto da spoljava unutrašnju listu u spoljnu.
UREDU. Zato pokušavamo ponovo:
$b[0]
daje nam
ARRAY(0xb75eb0)
Tako očito uspevamo da pronađemo niz, ali nešto još uvek pogriješi usput. Problem je u tome što koristimo $b, što Perlu pomisli da želimo skalar i tako nam daje referencu na niz umjesto samog polja (što nije skalar).
Aha! Naravno! Moramo da koristimo
@b[0]
jer @ govori Perlu da želimo vrijednost polja. Ne tako. Dobijamo
ARRAY(0xb75eb0)
ponovo. Nikada nisam uspeo da shvatim zašto je to tako i u ovom trenutku sam se odrekao čitave stvari.
Nekoliko nedelja kasnije videla sam korisno objavljivanje no.perl: treba tražiti referencu na niz, ovako
@{$b[0]}
što nam stvarno daje
(0.8 0.9 1)
Tako da sada mogu da napišem kod sa nizovima unutar nizova i isprekidaju unutrašnje haše.
Pitajte se: da li zaista mislite da bi trebalo da prođete kroz sve ovo kako biste stavili listu u drugu?
Definisanje interfejsa
Još jedan veliki nedostatak Perl-u je funkcija (ili potprogram, u Perl lingo) potpisima, odnosno, nedostatak potpisa. U većini programskih jezika kada deklarišete funkciju takođe deklarišete svoj potpis, navodeći imena parametara, a na nekim jezicima takođe njihove vrste. Perl to ne radi.
Šta je u Javi
public String substring(String str, int from, int to) {
postaje
sub substring {
local($str, $from, $to) = @_;
ovo Perl. Drugim rečima, morate ručno dekodirati listu parametara. Perl je u poslednje vreme proširen sa pojmom prototipa, što znači da možete pisati
sub substring($, $, $) {
local($str, $from, $to) = @_;
i Perl proveriti da li je broj argumenata tačan. Ipak, to nije potrebno, a postoji i veliki broj Perl koda koji ne koristi ovu sintaksu.
Međutim, nedostaci se ne zaustavljaju. Mnogi programeri ne uništavaju niz parametara kao u prethodnom primeru, što čini kodu mnogo teže čitati na prvi pogled, a to takođe onemogućava automatsko generisanje dobre dokumentacije.
I, što više, vi ne dobijate prednosti koje napredniji jezici imaju od karakteristika kao što su argumenti ključnih riječi (bez ponovnog implementiranja samih sa hashom). Na primjer, kada želite kreirati hešnu tablicu u Common Lisp-u, pozovite funkciju make-hash-table, koja uzima sljedeće argumente ključne riječi:
- test (koju funkciju treba koristiti za testiranje jednakosti ključa),
- veličina (prijedlog o broju očekivanja),
- veličina rehash-a (saveti za preimenovanje tabele),
- rehash-prag (koliki je tačan tabelu pre nego što se ponovo obavi)
To znači da će svi sledeći pozivi ispravno kreirati tabele hašiša:
(make-hash-table)
(make-hash-table :test #'eq)
(make-hash-table :size 1000)
(make-hash-table :rehash-size 2.0 :rehash-threshold 0.7)
To takođe znači da možete imati funkciju koja uzima veliki broj parametara (make-array traje 7) i još uvijek držite i čitljivost i jednostavnost korištenja. Takođe možete uraditi isto u Perlu, ali se sigurno ne podstiču, alatke za dokumentaciju neće to razumjeti, čitaoci možda i ne i sigurno nije zgodan u poređenju sa načinom na koji se nalazi u Common Lisp:
(defun make-hash-table(&key test size rehash-size rehash-threshold)
Nisam baš objektno orijentisan
Iako objektivna orijentacija nije toliko fantastična koliko bi mnogi želeli da razmišljamo, Perl to podržava. Međutim, to čini samo polu-srce, pošto su predmeti dodati prilično kasno u životu jezika.
Rezultat toga je da normalne datoteke, soketovi, heševi i liste nisu objekti, što znači da njihovi interfejsi nisu toliko zgodni kao što su mogli. Novije verzije Perl-a dolaze sa objektno orijentisanim modulima sa omotačima za ove vrste objekata, što znači da Perl ima protokol za takve objekte i možete napisati sopstvene implementacije ovih protokola. Međutim, to takođe znači da morate razlikovati obične datoteke ručke i datoteke objekata, što je malo neugodno.
Još jedna stvar je činjenica da prilikom stvaranja objekata morate eksplicitno upravljati unutrašnjostima vaših predmeta. U Perluu, kreiranje objekata je ručno. Klasa je deklarisana kao paket, a funkcije u paketu postaju metode klase. Da biste napravili objekat, napravite heš stol i zatim ga blagoslovite (koristeći ugrađenu funkciju ‘blagoslovi’) da bi postali predmet. Na stranici čovjeka “perlobj”, koja objašnjava karakteristike objekta Perl, preporučuje se inicijator ove forme objekta:
package MyClass;
sub new {
my $class = shift;
my $self = {};
bless $self, $class
$self->initialize(); # do initialization here
return $self;
}
Postoje i drugi načini inicijalizacije objekta, od kojih neki uzrokuju probleme za nasleđivanje. Lično, smatram neverovatnom da bi ovakva stvar trebala uopće biti potrebna. Ovo je ekvivalentno ovom Python kodu:
class MyClass:
pass
Rezultat toga je da se lako može napraviti pogrešna konstrukcija objekta (kao što je neuslovljavanje za nasleđivanje), definisanje klasa je neugodno i teško je reći od koda kada je definirana klasa (i za čitaoce i za alate za softver).
Sumirajući to
Općenito, ovo znači da je Perl veliki i složen jezik, koji treba puno vremena da pravilno nauči. Po mom mišljenju, ova složenost je nepotrebna i jednostavniji jezik bi bio mnogo bolji. Mislim da ovo takođe znači da mnogi neverski Perl programeri pišu suboptimalni kod.
Druga stvar je što mislim da mali broj programera Perl-a (procentualno) piše generalne i višekratne module, jer morate dobro naučiti jezik pre nego što to učinite, nešto što je relativno teško i potrebno je vremena. Još jedna stvar je što sam jezik to ne podstiče.
Otkrivanje Pythona
Programski jezici naučavaju da ne želite ono što ne mogu da pruže. Morate razmišljati na jeziku da pišete programe u njemu, i teško je želeti nešto što ne možete opisati. Kada sam prvi put započeo programiranje – u BASIC-u nisam propustio rekurziju, jer nisam znao da je to bilo takvo. Mislio sam u BASIC. Mogao sam samo da smislim iterativne algoritme, pa zašto da propustim rekurziju?
– Paul Graham, ANSI Common Lisp.
Pa, nakon što sam otkrio sve te loše stvari o Perlu, šta sam radio? Ja sam ga nastavio koristiti. Na kraju krajeva, koliko je bilo loše, bilo je i bolje nego obrada teksta i web programiranje sa C, Pascal ili Java, i nije bilo bolje alternativa.
Ili sam pomislio. U knjižari Univerziteta postojala je knjiga pod nazivom “Internet programiranje sa Python-om”. Budući da sam oboje jezički nakaza i internet nakaza, mislio sam da je ovo zanimljivo i pokupilo ga. Negde na početku knjige postojala je anegdota o Python programeru koji je napisao sve njegove Python programe tako da kada je došlo do greške (tj. Kada je bačen izuzetak), upravitelj pogreške nazvao je njegovom beeper-om.
Vau, pomislio sam. Ovo zvuči interesantno. Otišla sam kući, pronašla Python tutorial, odštampala i počela da se igra sa Python-om. Te noći napisao sam POP3 klijentsku biblioteku u Python-u. Samo tako. Posle spavanja imao sam ideju: zar ne bi bilo mnogo lepše ako sam keširao poruke i učinio to nevidljivim za korisnika? Ujutru sam to dodao za pola sata.
Od tada sam koristio ovu biblioteku za brisanje e-pošte bez prenosa, premeštanje 150 e-pošte sa jednog POP-a na drugi i mnoge druge stvari. (Da, napravio sam i malu SMTP biblioteku.) Mogu čak i da je koristim kao klijent e-pošte koristeći Python tumač kao komandnu liniju.
I dalje sam koristio Python nakon ovoga. Napisao sam link provjerivač koji je prešao na moje web stranice i proverio ih za greške i nastavio dodavati više protokola i karakteristika. Posle nekog vremena pomislio sam: ovaj program provodi dosta vremena čekanja na odgovore servera. Možda mogu da ga ubrzam koristeći multi-threading kako bi mogao da čeka nekoliko servera istovremeno?
Nikada ranije nisam koristio multithreading, ali sam znao teoriju iza toga. Ovo sam dodao u kontroler veze za sat vremena i to uključuje kopanje u bibliotečku dokumentaciju i uklanjanje nekoliko grešaka koje sam uneo. (Multitriranje je mnogo složenije nego što se zvuči u početku, jer se stvari događaju istovremeno, ali to nije Pythonova greška.)
Pošto ste pročitali ovo, sada možete biti ubeđeni da sam glavni programer, a ne da je Python odličan programski jezik za ovu vrstu stvari. Lično, mislim da to nije tačno. (Zapamtite, ja sam čovjek koji ne može ni da napravi Perl potprogram vratiti ručku datoteke.) Takođe, iz onoga što čujem, mnogi drugi ljudi imaju slična iskustva sa Python-om. Evo jednog primera:
U prvih 15 minuta programiranja Python-a sam napisao program koji bi sve članke u grupi vijesti preuzeo u mh folder za mene – i comp.lang.python je bila moja prva newsgroup!
– Thomas Corbin, u privatnoj poruci za autora
Zaljubiti se u Python
Standardne biblioteke
Je li to stalo tamo? To svakako nije. Od tada sam otkrio ove stvari u Python bibliotekama:
- Podrška za serijske objekte
- Podrška za skladištenje serijskih objekata u jednostavnim bazama podataka
- Python parser
- Podrška za jednostavne tekstovne baze podataka (Perl ima i ovo)
- Biblioteke za kompresiju ZIP fajlova i dekompresiju
- Profiler (i veoma lijep jedan!)
- Biblioteka CGI
- Biblioteka parsera URL-a
- Biblioteka opštih URL adresa
- Pojednostavljeni HTML, SGML i XML parseri
- Jednostavan web server sa CGI podrškom
- POP, IMAP i SMTP biblioteke (Python 1.5.1; pokrenula sam sa 1.4)
A ovo su stvari koje dolaze sa standardnom distribucijom Pythona! Perl takođe ima većinu tih stvari, ali ne dolazi sa prevodiocem, a kvalitet dokumentacije i interfejsa varira.
U Python-u ne dobijate samo ove stvari sa prevodiocem, kompletno sa dokumentacijom, oni su takođe izuzetno jednostavni za korištenje i pružaju tačno ono što najčešće želite. Recimo da pišete web robot i robot ima URL adresu trenutne stranice u nizu (cur_url) i relativnu URL adresu sa ove stranice na sljedeću stranicu u drugom (next_url) i želite izračunati apsolutnu URL adresu sledeću stranicu. Ovo je šifra:
next_url=urlparse.urljoin(cur_url,next_url)
Python takođe podržava GUI programiranje preko Tk na Win32, Mac i Unix. Stvarno je lako instalirati, ali nije dovoljno dokumentovan. Postoje i na mnogim drugim načinima za programiranje GUI-a pomoću Pythona. (Da, postoji i Perl.)
SIG
Python može postati veliki kao Perl ili Tcl. To je više “ljubazno” od onih – mada možda i kontroverznije. Ima izuzetno korisnu korisničku zajednicu, i to je ono što će ga učiniti velikim.
– Guido van Rossum, tvorac Python
Kada žele da stvaraju nove biblioteke ili “standardi”, u Pythoners formiraju specijalne interesne grupe volontera, koji svako može da se pridruže. Neki od rezultata ovog su do sada bile zajedničke API za module baze podataka (što znači da možete koristiti Sybase modul, a zatim razmijeniti sa Oracle jedan i promijeniti samo 2 linije koda), IDL-to-Python mapiranje za CORBA, zajednički tekst format za dokumentaciju gudače i zajedničke alate i API za XML rastavljanje su u fazi razvoja.
Python softver
Ali, ako je to jezik stvarno je tako velika, ne bi trebalo da ljudi su napisali neke prilično divan softver u njemu? Pa, oni imaju. Evo nekoliko primjera:
- kwParsing, parser generator
- Gadfly, a relacijska baza podataka (da, u čistoj Python!)
- Gral, web preglednik
- Fnorb, a CORBA ORB
- Paos, jednostavan objektno-orijentiran baze podataka
- Bobo, sistem koji objavljuje Python objekte preko web servera
- Medusa, visokih performansi, proširiv okvir Internet serveru. (Web server, FTP server i chat server izgrađen na istom kernelu.)
Osobno, moj trenutni projekt u Python je potpuno vrednovanje XML parser.
Da li je zaista bilo bolje od Perl?
Sam uključen ovom poglavlju u slučaju da želite znati kako Python upravlja stvari koje sam se žalio na Perl.
Čitljivost
Python je najčitljiviji jezik koji sam ikada programirao. Trebalo mi je pola sata da razumem Meduzu (iako je prilično čudno u konceptu) i još pola sata da je promenim tako da mogu da mapiram URL putove na web serveru na Python funkcije. Posle sat vremena mogu da pročitam svoje Gnus poštanske kutije preko web servera. Još jedan sat i mogao sam čitati vijesti.
Evo moje sopstvene implementacije zvučne funkcije, napisane u novembru ’97, kada sam još uvek bio nov:
# no_tbl is an array I've constructed that maps characters to numbers
# is_letter is written by me, but I've since discovered that Python
# has it
def soundex(string):
"""Returns the Soundex code of the string. Characters not A-Z skipped."""
string=lower(string)
if not is_letter(string[0]): string=string[1:]
last=no_tbl[ord(string[0])-97]
res =upper(string[0]) # This is where the result will end up
for char in string[1:]:
if is_letter(char):
new=no_tbl[ord(char)-97]
if (new!="0" and new!=last):
res=res+new
last=new
if len(res)<4:
return res+"0"*(4-len(res))
else:
return res[:4]
Dokumentacija
Postoji program Python koji generira javadoc nalik dokumentaciju iz dokumentacije konce u Python programa. To može proizvesti izlaz u HTML, običan tekst i FrameMaker formatu.
Što se tiče standardne biblioteke dokumentacije, možete vidjeti za sebe.
Isključivanje baferiranja izlaza nije očigledno očigledno, ali ne i preteško. Prilično brzo saznate da su sys.stdout, sys.stdin i sys.stderr objekti datoteka koji predstavljaju standardnu, standardnu i standardnu grešku. Dakle, pošto je stdout običan fajl objekt, on bi trebao da se ponaša kao jedan u odnosu na bafer izlaza, takođe. I to. Ovi objekti nemaju metode za isključivanje bafera, ali možete isprazniti podatke pomoću metode ispiranja:
sys.stdout.flush()
Ako ste pronašli da nezgodno postoji komandne linije prekidač za prevodioca koji vam omogućuje da isključite buffering. Međutim, morate pokrenuti prevodilac sa ‘pitona -?’ da ovo, tako da nisam mogao zaista tvrde da je to previše dobro dokumentirana.
Uzidani
Python ima vrlo malo ugrađene funkcije u odnosu na Perl. Regularnih izraza dolaze u zaseban modul i implementira kao objekti. Evo popis sastavio regularnih izraza:
reg_list=[re.compile("foo"),re.compile("[Bb][Aa][Rr]"),re.compile("ba[z]")]
Datoteke su također predmeti, kao što su Python modula i većina drugih stvari. To znači da ih možete proći kao parametri, stuff ih na listama, podklasa njih, pa čak i stvoriti klase sa istim metodama i koristiti ih gdje kod očekuje da objekat datoteku ili modula.
Strukture podataka
To je dva lista primjera u Python, (=> pokazuje kako su rezultati):
a=[1,2,3,4]
a[0] => 1
b=[[0.8,0.9,1],2,3,4]
b[0] => [0.8,0.9,1]
Python ima hash tablice, torke (fiksne dužine lista) i pune objektno-orijentacije.
Parting snimak
Ono što drugi misle
Možda želite čuti što drugi ljudi misle, kao i, pa evo nekih linkova na druga mišljenja o Perl i Python:
- Zato volim Python, neki Python propaganda Paul Prescod.
- Keith Waclena piše o njegovoj potrazi za dobro programskih jezika u Moje Programski jezik Crisis,
- Priča o pet jezika govori o evaluaciji James Logajan o pet skriptiranje jezika za embedded projekt,
- Eric S. Raymond objašnjava zašto voli Python u Zašto Python?
- Sam Holden napisao je annotated verzija ovog članka, sa komentarima o stvarima koje se ne slaže s. (Napomena: Ja sam ažurirao članak od Sam je napisao svoju verziju.)
A poslednje upozorenje
Kamele su pokorne kada su pravilno obučene i obrađene, ali, naročito u sezoni rutiranja, podležu ugibanju besa. Oni pljuju kad su uznemireni i mogu grickati i udarati opasno.
–Encyclopedia Britannica.
Ako posle svega ovoga, ipak želite da koristite Perl, onda budite moj gost i idite odmah. Neću te zaustaviti. Međutim, upozoreni ste.
Međutim, možda ćete biti interesantni o tome šta Enciklopedija Britannica kaže o Pythons-u? Evo ga:
…Monty Python Flying Circus trupa, koja je postavila standard sedamdesetih godina prošlog vijeka za svoje nevjerovatne parodije i čudan humor na televiziji, a kasnije u filmovima.
–Encyclopedia Britannica
Tako je. Python je dobio ime po komediji, a ne nakon gadne reptile. Zbog toga ima toliko čudnih imena i primera u Python tutorijalima i izvornom kodu. 🙂
Dodaci
Priznanja
Hvala za:
- Trond Eivinda Glomsrød za ističući greška (a ne ja plameni za pisanje ovog članka).
- Kjell Arne Rekaa za ističući greška teško mjesto i za koji je skoro uvjeren.
- Robin Friedrich za ističući dva greške u kucanju i povezivanje na ovaj članak iz Python stranice.
- Greg Phillips ukazali na teško mjesto Lisp typo.
- Steinar Knutsen mi govori da je Python prevodioca ima opcija komandne linije za isključivanje buffering.
- James Lee za ističući greška u mom uzorku Perl koda.
- Thomas Corbin za ističući još jedan typo i nenamjerno dati mi lijepo citat.
- Ronald J. Kimball za neke promišljene kritike.
- Andrew Ho vrlo otvoren i korisne kritike, i za davanje Python probati.
- Georg Bisseling, ukazali nekoliko slomljena linkove.
Zadnje ažuriranje 2002-01-16.
vvc