Förstasidan
 
RSS för bloggen
Svenska Loopia d.o.o i Serbien Loopia d.o.o i Serbien

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!

12 kommentarer till » Snakes on a server «

Här har du den / dem.

Tigge

Postat 2008-01-17 klockan 00:32

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?

Daniel Norman

Postat 2008-01-17 klockan 09:16

Jodå, det kommer inlägg om PHP5-migreringen också!

patrik

Postat 2008-01-17 klockan 22:16

Är det mod_python ni använder?

Daniel Norman

Postat 2008-01-18 klockan 08:41

Python körs som CGI och finns tillgängligt på UNIX-konton.

elemel

Postat 2008-01-18 klockan 09:46

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

Daniel Norman

Postat 2008-01-18 klockan 09:58

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

M

Postat 2008-01-18 klockan 14:12

Hur ser det ut med stöd för Ruby (och Ruby on Rails)?

Fredrik Berglund

Postat 2008-01-18 klockan 17:17

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.

Hans

Postat 2009-05-11 klockan 21:27

Catalyst web framework för Perl är riktigt fint!

Transgenus » Blog Archive » Rekordförsök i bloggskapande

Postat 2010-03-15 klockan 18:30

[...] Loopias UNIX-servrar naturligtvis stödjer Python modifierade jag slicedlimes wrapper-skript så att Mathias python-skript kunde anropas direkt med [...]

Transgenus » Blog Archive » Planer för transgenus

Postat 2010-03-17 klockan 09:15

[...] steg var att skriva om delar av motorn och ta bort kravet på python eftersom det tyvärr är få webbhotell som tillhandahåller python. Andra steget var att tillhandahålla en möjlighet för programmerare att få tillgång till att [...]

Simon Johansson

Postat 2010-09-14 klockan 17:51

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’

Lämna en kommentar

Fyll i nedanstående formulär för att lämna en kommentar.

  Visas ej.

Diners Club American Express Mastercard SecureCard VISA Verified by Visa