Snakes on a server

Ett av de kanske lite mer ovanliga språken vi har stöd för på Loopia är Python. Python är ett skriptspråk i likhet med exempelvis Perl eller PHP och är ett så kallat general purpose-språk. Detta innebär att Python kan användas till allt mellan himmel och jord. Python används bland annat av NASA, ILM och Astra Zeneca. Ett annat exempel är Eve Online, ett onlinespel, som använder en specialversion av Python (Stackless Python) till stor utsträckning.

Det som gör att jag gillar Python är flera saker. En prominent anledning är att det är så lätt att läsa Pythonkod. En annan anledning är att jag gillar funktionell programmering (tänk exempelvis LISP (SBCL), Haskell och Erlang) och Python har inslag av just det.

Nåväl, talk is cheap så nu är det hög tid för några exempel.

Databashantering

En kort exempel på databashantering (utan felhantering).

import MySQLdb

db = MySQLdb.connect("host", "user", "password", "database")
db_cursor = db.cursor()
db_cursor.execute("SELECT title FROM books")

row = db_cursor.fetchone()
count = 1
while row is not None:
     print count, row[0]
     count += 1
     row = db_cursor.fetchone()

db_cursor.close()
db.close()

Detta ger följande utmatning från min testdatabas:

1 Security Engineering: A Guide to Building Dependable ...
2 Secrets and Lies: Digital Security in a Networked World
3 Hackers and Painters: Essays on the Art of Programming

Sortering av en hash

Sortering av en hash (som heter dictionary i Python) på värdet istället för nyckeln:

data = {'a' : 2, 'b' : 1}
for key in sorted(data.keys(), lambda x, y: cmp(data[x], data[y])):
        print key, data[key]

Detta ger följande utmatning:

b 1
a 2

Annat spännande …

Andra attraktiva funktioner är filter(), map() och reduce(). Dessa används för att filtrera och sammanställa data. Ett något krystat exempel på detta är följande kodsnutt som filtrerar ut alla tal som är större än noll ur en lista, dela dessa med två och sedan summerar:

data = [6, 4, 8, -3, 5, -7]
bigger_than_zero = filter(lambda x: x > 0, data)
half = map(lambda x: x / 2.0, bigger_than_zero)
the_sum = reduce(lambda x, y: x + y, half)
print the_sum

Ger följande utmatning:

11.5

Det härliga med Python är förstås att allt detta kan skapas med endast en (1) rad kod. Denna är förvisso ganska lång och behöver därför radbrytas i detta exempel (med ett \-tecken).

print reduce(lambda x, y: x + y, map(lambda x: x / 2.0, \
filter(lambda x: x > 0, [6, 4, 8, -3, 5, -7])))

Utmärkta introduktioner för dig som programmerat tidigare och som tycker Python verkar intressant hittar du här och här. Lycka till!

Dela detta inlägg:

16 tankar kring ”Snakes on a server

  1. Tigge

    Intressant. Hade jag faktiskt ingen aning om att det gick. Kanske man ska ge sig på och prova. Kan ni inte skriva något om PHP5-migreringen härnäst?

  2. elemel

    Bra introduktion till Python. Kod med filter()- och map()-uttryck kan även skrivas som list comprehensions. Exempel:

    # uttryck med filter() och map() från bloggen
    bigger_than_zero = filter(lambda x: x > 0, data)
    half = map(lambda x: x / 2.0, bigger_than_zero)

    # motsvarande uttryck med list comprehensions
    bigger_than_zero = [x for x in data if x > 0]
    half = [x / 2.0 for x in bigger_than_zero]

    # sammanslaget uttryck med list comprehension
    half = [x / 2.0 for x in data if x > 0]

    Läs mer om Pythons list comprehensions här:

    http://docs.python.org/tut/node7.html#SECTION007140000000000000000

  3. Daniel Norman Inläggsförfattare

    elemel: Det var ett bra påpekande! Jag stannade medvetet vid funktionsanrop för att bibehålla vad som hände, men din komplettering visar det på ett bra sätt. map(), filter() och reduce() kanske kan betraktas som syntaktiskt socker i vissa avseenden.

    List comprehensions påpekas även i manualsektionen om filter, se http://docs.python.org/lib/built-in-funcs.html#l2h-28

  4. Fredrik Berglund

    Vi har stöd för Ruby, men i praktiken så behöver vi lägga in ett par moduler för att öka möjligheten att använda det, såsom databasaccess, templatesystem, CGI osv. Vi har idag inte stöd för Ruby on Rails, men vi tittar på att eventuellt införa det i ett senare skede.

  5. Pingback: Transgenus » Blog Archive » Rekordförsök i bloggskapande

  6. Pingback: Transgenus » Blog Archive » Planer för transgenus

  7. Simon Johansson

    Hej!
    Jag försöker skapa ett CGI-script som ansluter mot en databas men får felmeddelande om att modulen inte finns på systemet.

    : No module named MySQLdb
    args = (’No module named MySQLdb’,)
    message = ’No module named MySQLdb’

  8. Robbin

    Har ni lyckats fått till Ruby on Rails ännu? Jag skulle jättegärna använda er som host men använder mig utav RoR som språk. Evigt tacksam om ni börjar med det eftersom ni är mitt favorit webbhotell. Och rekommenderar er till alla som frågar om domäner och webbhotell.

    MVH
    Robbin

  9. Daniel Överfjord

    Hej Robbin, då efterfrågan på RoR har varit låg så har detta inte legat på vår priolista. Jag har dock fört ditt önskemål vidare till teknikerna.

  10. Tård Wennerborg

    Hej Susanna,

    Vi har inte något stöd för RoR i dagsläget då efterfrågan fortsatt varit låg, men vi noterar varje gång ett önskemål kommer in och tar hänsyn till detta i vår prioriteringar.

Lämna ett svar

E-postadressen publiceras inte. Obligatoriska fält är märkta *