Python (programlingvo)

**Python**, Esperantigite **Pitono**, estas interpreta, interaktiva programlingvo, ofte uzata kaj kreita de Guido Van Rossum kaj distribuata sub libera permesilo. Ĝi estas nomita laŭ la brita televidserio ''Monty Python's Flying Circus''. Ĝi estas ofte komparata al Tcl, Perl, Scheme aŭ Java, kaj lastatempe al Ruby.

Jen simpla ekzemplo de programo de Python:

```python
# Ekscii pri la primeco de nombro
import math

line = raw_input('Enmetu nombron por provi:')

y = int(line)
x = int(math.sqrt(y))
while x > 1:
    if y % x == 0:
        print '%s ne estas prima (ĝi divideblas de %s)' % (y, x)
        break
    x -= 1
else:
    print '%s estas prima' % y
```

## Filozofio 
Python estas multaparadigma lingvo, kiel C++ kaj malkiel Smalltalk. Ĉi tio signifas ke, anstataŭ devigi programistojn adopti unu specifan stilon de programado, ĝi permesas kelkajn. Estas subtenataj objektema kaj strukturema programado, kaj ankaŭ funkcia programado. Ĝi estas dinamike datentipo-regata kaj uzas senrubigon por prizorgi memoron kaj evitas referencan sintakson.

Kvankam popularigita kvazaŭ kontrasto de Perl, Python havas multajn similaĵojn al tiu lingvo. Tamen, la prilaborantoj de Python kontraŭstaras la flekseblegan sintakson de Perl kaj favoras pli konserveman (kaj, laŭ ili, pli legeblan) sintakson. Kvankam (same kiel Perl) Python estas foje klasigata kiel skripta lingvo, ĝi jam estis uzata por krei multajn grandajn projektojn, ekzemple: aplika servo Zope kaj sistemo de dosiera distribuo *Mojo Nation*.

## Datumaj tipoj kaj strukturoj 
eta
Python havas vastan rangon de bazaj datumaj tipoj. Kune kun normalaj entjera kaj frakcia matematiko, ĝi senĝene subtenas aritmetikon de grandaj nombroj kaj kompleksaj nombroj.

Ĝi subtenas la kutiman aron de operacioj sur ĉenoj, sed havas unu escepton: ĉenoj en Python estas neŝangeblaj objektoj, do iu ĉena operacio kiu alilingve ŝanĝus *string*-objekton (ekzemple, anstataŭigo de literoj) en Python simple redonos novan ĉenon (same kiel en Java).

### Datumtipa sistemo 
En Python valoroj, ne variaĵoj, portas datumtipon — tio signifas, ke Python estas lingvo dinamika pri tipoj, kiel Lisp kaj malkiel Java.

Inter tipodinamikaj lingvoj, Python estas mezgrade tip-regata. Ĝi estas nek tiel malstrikta kiel Perl, nek tiel strikta kiel Caml. Implicita konvertado estas difinita por nombraj datumtipoj, tiel ke oni povas valide multobligi kompleksan nombron per longa entjera nombro (ekzemple) sen eksplika datumtipigo. Tamen, malkiel en Perl, estas neniu implicita konvertado inter, ekzemple, nombroj kaj ĉenoj; nombro estas nevalida argumento al operacio sur ĉeno.

### Kunmetaj datumtipoj 
Python ankaŭ havas kelkajn kunmetajn datumtipojn, i.a. listojn, opojn kaj vortarojn. Listoj, opoj kaj ĉenoj estas sinsekvaĵoj kaj havas inter si multajn samajn metodojn: oni povas iteracii tra la literoj de ĉeno same facile kiel tra la eroj de listo. Listoj estas pludaŭrigeblaj tabeloj, sed opoj estas de fiksita longeco kaj neŝanĝeblaj.

La celo de ĉi tiom da neŝangebleco temas pri vortaroj, datumtipo konata aliloke kiel hakettabeloj aŭ asociaj tabeloj. Por prezervi koherecon sub referenca paso, la ŝlosiloj de vortaro devas esti de neŝangebla datumtipo. Vortaraj valoroj, aliflanke, povas esti de iu ajn datumtipo.

### Objekta sistemo 
La datumtipa sistemo de Python estas bone integrigita kun la klasa sistemo. Kvankam la bazaj datumtipoj ne estas precize klasoj, klaso povas heredi de datumtipo. Tial eblas pludaŭrigi ĉenojn kaj vortarojn ... kaj eĉ entjerajn nombrojn, se oni volas. Python ankaŭ subtenas multoblan heredon.

La lingvo subtenas vastan introspekton de datumtipoj kaj klasoj. Datumtipoj povas esti legataj kaj komparataj — ja, ĉar kiel Smalltalk, datumtipoj estas mem datumtipo. La atribuaĵoj de objekto povas esti elprenitaj kiel vortaro.

## Sintakso 
Python estis formita por esti tre legebla. Ĝi havas simplan vidan aranĝon, uzas anglalingvajn vortojn ofte kie aliaj lingvoj uzas punkciumon, kaj havas rimarkinde malpli da sintaksaj konstruoj ol multaj strukturaj lingvoj, ekz. C, Perl aŭ Pascal.

Ekzemple, Python havas nur du strukturajn iteraciajn formojn — "for", kiu iteracias erojn de listo aŭ iteracianto (kiel "foreach" en Perl); kaj "while", kiu iteracias tiel longe kiel veras Bulea esprimo. Tial mankas al ĝi C-stila kompleksa "for," "do...while", kaj la "until" de Perl, kvankam kompreneble oni povas esprimi egalajn aferojn. Same, ĝi havas nur "if...elif...else" por branĉigo, neniun "switch" aŭ etikeditan "goto".

### "La Blankspaca Afero" 
Unu nekutima eco de la sintakso de Python estas la metodo uzata por limigi programajn blokojn. Foje nomata "la blankspaca afero", ĝi estas unu eco de sintakso de Python, pri kiu multaj programistoj neniam programintaj en Python jam aŭdis, ĉar ĝi estas unika inter nunaj disvastigitaj lingvoj.

En lingvoj, kiuj uzas la blokan strukturon fine hereditajn de Algol, i.a. Pascal, C, kaj Perl — blokoj da kodo estas limigitaj per vinkuloj aŭ ŝlosilvortoj. (C kaj Perl uzas { }; Pascal uzas "begin" kaj "end".) En ĉiuj ĉi lingvoj, tamen, programistoj foje krommarĝenas la kodon ene de bloko, por vide disigi ĝin de la ĉirkaŭa kodo.

Python anstataŭprenas propraĵon de la malpli konata lingvo *Occam* — anstataŭ de punkciumo aŭ ŝlosilvortoj, ĝi uzas krommarĝenon mem por indiki la daŭron de bloko. Mallonga ekzemplo klarigos ĉi tion. Jen estas C- kaj funkcioj de Python, kiuj faras la saman aferon — komputas la faktorialon de entjera nombro.

C:

```c
int factorial(int x) {
    if (x == 0) {
        return(1);
    } else {
        return(x * factorial(x-1));
    }
}
```

**Python:**

```python
def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)
```

Iuj programistoj alkutimiĝintaj al Algol-stilaj lingvoj, en kiuj blankspaco estas semantike malplena, komence pensas, ke ĉi tio estas konfuza. Iuj jam faris nekomplimentajn komparojn al la laŭkolona stilo uzata ĉe truokartaj Fortran-sistemoj: iam, estas grandega progreso havi "liberformajn" lingvojn, en kiu nur simboloj gravis kaj ne ties pozicio sur la linio.

Tamen al programistoj de Python "la blankspaca afero" estas simple ellaboraĵo de normalaĵo, kiun programistoj per Algol-stilaj lingvoj ĉiukaze jam sekvas.

### Funkcia programado 
Kiel ĉi-supre menciite, alia forto de Python estas la havebleco de funkciaj sintaksaj eroj. Kiel oni povas antaŭvidi, ĉi tiuj ege faciligas labori je listoj kaj aliaj kunmetaĵoj. Unu tia konstruo estas la lista komprenumo, enkondukita de la funkcia lingvo Haskell, kiel vidata jene kalkulante la unuajn kvin eksponentumojn de du:

```python
nombroj = [1, 2, 3, 4, 5]
 eksponentumoj_de_du = [2 ** n for n in nombroj]
```

Pro tio, ke Python permesas, ke funkcioj estu argumentoj, ankaŭ eblas esprimi eĉ pli subtilajn funkciajn konstruojn, ekz. la pludaŭrigon.

La ŝlosilvorto "lambda" de Python eble misdirektus iujn fanatikulojn de funkcia programado. Lambdo-blokoj en Python rajtas enhavi nur esprimojn, ne asertojn. Tial, ili ne estas la plej ĝenerala maniero, per kiu reliveri ĉe funkcio. Anstataŭe la kutima afero por fari estas simple difini kaj reliveri ĉe funkcio uzante lokregionan nomon, kiel en la jena ekzemploj de simpla sekca funkcio:

```python
def add_and_print_maker(x):

    def temp(y):
        print "%d + %d = %d" % (x, y, x + y)

    return temp
```

### Traktado de esceptoj 
Python subtenas (kaj vaste uzas) traktadon de esceptoj por provi pri eraraj kondiĉoj. Fakte, eĉ eblas kapti la escepton kaŭzitan de sintaksa eraro.

Esceptoj permesas pli koncizan kaj dependeblan traktadon de eraroj ol multaj aliaj manieroj de raporti erarajn aŭ esceptajn okazojn. Esceptoj estas fadensekuraj; ili ne havas la emon malordigi kodon tiel, kiel provado por reliveritaj eraro-kodoj en C; kaj ili povas facile leviĝi tra la voka stako, kiam eraro estas raportenda al pli alta nivelo de la programo.

La stilo de Python postulas uzi esceptojn, kiam ajn povas aperi erara kondiĉo. Ja, anstataŭ provi aliron al dosiero aŭ resurso antaŭ uzi ĝin, estas kutime en Python simple provi uzi ĝin — kaptante la escepton se aliro ne estas permesata.

## Norma biblioteko 
Python havas grandan norman bibliotekon (*angle: Standard library*), kiu igas ĝin taŭga por multaj taskoj. Povas esti aldonitaj al la moduloj de la norma biblioteko specialaj moduloj kreitaj en C aŭ Python. La norma biblioteko estas aparte tre taŭga por krei interretajn aplikojn, kaj subtenas grandan kvanton da normaj aranĝoj kaj protokoloj (ekz. MIME kaj HTTP). Moduloj por krei bildajn uzantinterfacojn, konekti al rilatumaj datumbazoj, kaj manipuli regulesprimojn estas ankaŭ parto de la norma biblioteko.

La norma biblioteko estas unu el la plej grandaj fortoj de Python. La plejparto de ĝi estas kongrua trans sistemoj, kio signifas, ke eĉ tre specialigitaj programoj de Python povas funkcii ĉe Unikso, Mac OS, kaj Vindozo senŝanĝe.

## Aliaj propraĵoj 
Kiel Lisp, kaj malkiel Perl, la interpretilo de Python ankaŭ subtenas interaktivan reĝimon, en kiu esprimoj povas esti enmetitaj de la terminalo kaj rezultoj povas esti tuj viditaj. Ĉi tio estas bonaĵo por lernantoj de la lingvo kaj ankaŭ por spertaj programistoj: etaj eroj de kodo povas esti provitaj en interaktiva mondo antaŭ ol oni enmetas ilin en veran programon.

## Eksteraj ligiloj 
*  Instruilo por la programlingvo Python
*  Paradokso de Python - eseo de Paul Graham pri Python.
*  La Hejmpaĝo de Python
*  Lerniloj kaj referencoj de Python
*  Zope: Aplika servilo kaj sistemo de prizorgado de enhavo
*  Bazo en Python por krei retajn aplikaĵojn
*  Vikio pri Python
*  Python Brasil
*  Python strings 


Kategorio:Programlingvoj