Det kuleste ville ha vært om vi kunne bruke SPOILER-taggen i BB Code, men det ser ikke ut til at det går an å endre klikketeksten. Noen som vet?
Alternativt kan vi hoste FAQ'en et annet sted, kanskje som wiki og linke til den i forumet. Si i fra hvis noen kan ordne dette. Python.no ville ha vært ønskedrømmen. Domenet er registrert, men ikke aktivt:
http://www.norid.no/...query=python.no
Norsk Python FAQ (en begynnelse)
Q
Hvordan unngå "DeprecationWarning: Non-ASCII character" når jeg bruker norske tegn i scriptet mitt?
A
For å unngå dette, legg inn
# -*- coding: UTF-8 -*-eller andre encodings i en av de første to linjene i scriptet.
Oversikt over alle encodings:
http://docs.python.o...-encodings.html
---------
Q
Hvordan slippe at kommando-vinduet vises når jeg dobbelt-klikker på scriptet i Windows?
A
Kall filen .pyw i stedet for .py
---------
Q
Hva er List Comprehensions (listcomps)?
A
List comprehensions (LC) er en måte å jobbe med og lage lister i Python. Konstruksjonen er hentet fra språket Haskell. LC gir ofte korte, kraftige kodesekvenser som er enkle å lese og gir ryddig kode.
LC erstatter gjerne vanlige for-løkker. Eksempel:
# klassisk for-løkke: Ny liste med store forbokstaver navne_liste = ['kjersti klar', 'rupert rar', 'selmer svanger', 'lise salat'] kapiteler = [] for navn in navne_liste: kapiteler.append(navn.title()) print kapiteler >>> ['Kjersti Klar', 'Rupert Rar', 'Selmer Svanger', 'Lise Salat'] # Som over, men med LC navne_liste = ['kjersti klar', 'rupert rar', 'selmer svanger', 'lise salat'] kapiteler = [s.title() for s in navne_liste] print kapiteler >>> ['Kjersti Klar', 'Rupert Rar', 'Selmer Svanger', 'Lise Salat']
LC egner seg ikke hvis løkkene er kompliserte med mange vilkår. De blir vanskelige å skrive, og vanskelige å lese. Men de kan godt være mer omfattende enn eksempelet over. Et lite eksempel til:
# ta en liste med tall og lag en ny med tall som er ikke er "bad" # tallene som strenger, ikke integere bad = (4, 8, 12, 13, 20, 27, 29) # noen "bad numbers" numbers = range(35) ok_numbers = [str(n) for n in numbers if n not in bad]
(Flere treffende eksempler ønskes)
I neste versjon av Python, 2.5 som kommer høsten 2006, er det bygget inn en versjon av ternary-konstruksjonen som finnes f.eks i C og PHP.
Den åpner for korte, konsise uttrykk:
# vanlig måte if condition: x = true_value else: x = false_value # ny mulig måte: x = true_value if condition else false_value
Dette vil kunne brukes i LC og gjøre filtreringsmulighetene ennå kraftigere!
---------
Q
Hva er en iterator?
A
I engelske tekster om Python møter man tidsnok på ordene iterator og iterable. Dette er kjernebegreper i Python - viktige å forstå, og viktige å vite forskjellen på.
Først iterable. En iterable i Python er alle datatyper/datastrukturer som det kan itereres, dvs. 'loopes' over.
Noen eksempler er:
- En streng: "abcdef"
- En liste: [1,2,3,4,5]
- En tuple: (44, 55, 66)
- En dictionary: {1 : 'en', 2 : 'to', 3 : 'tre'}
- En fil
- Et objekt som spesifiserer "den magiske metoden" __iter__()
- ... og helt konkret: en iterator
En iterator er et spesialobjekt som har en metode, nemlig next(). Den er spesialinnrettet for å iterere over en bestemt datastruktur, f.eks en liste, eller en fil.
Du kan lage en iterator ved å bruke den innebygde funksjonen iter():
en_liste = range(10) en_iterator = iter(er_liste)
I nyere Python brukes de ofte, og Python 3.0 (aka Python 3000), vil mange funksjoner returnere iteratorer i stedet for lister, eller tupler som i dag.
Iteratorer brukes som regel indirekte:
tekstfil = open('poengsum.txt', 'r')
for linje in tekstfil:
print "Poeng:", linje
Jeg sier "indirekte", for her er det ingen kall til next()... Det skjer "under panseret", og det er en viktig del av iteratorprotokollen. Vi looper over dem uten egentlig å oppleve at det ikke er datastrukturen vi jobber direkte på.
Det samme kan gjøres eksplisitt:
tekstfil = open('poengsum.txt', 'r')
try:
while True:
print "Poeng:", tekstfil.next()
except StopIteration:
# Iterator er tom, dvs. siste linje nådd
pass
Tre poenger om iteratorer:
1. En iterator er "ikke-destruktiv", dvs. man kan ikke endre datastrukturen som den looper over via iteratoren selv. De kan derfor brukes til å gjøre data "read only". En annen måte å si dette på er: "En iterator er "enveis", data kan hentes ut, men ikke sendes inn.
2. En iterator har bevissthet - dvs, den vet og husker hvor i sekvensen den sist var. Du behøver ikke å holde rede på en indeks.
# åpne tekstfil med 4 linjer, med tall 0,1,2,3
tekstfil = open('poengsum.txt', 'r')
for line in range(2):
print tekstfil.next()
>>> '0\n'
>>> '1\n'
# masse annen kode
for line in range(2):
print tekstfil.next()
>>> '2\n'
>>> '3\n'
3. En iterator er ofte minne-effektiv. Et typisk eksempel her er svære filer. La oss si du har en log-fil på 1GB. Kode a la:
log_data = open('log.txt', 'r').read()
vil spise opp minnet. Ved å loope over filobjektet via den innebygde iteratoren vil du aldri bruke mer minne enn hver enkelt linje.---------
Q
Hva er dette if __name__ == '__main__' greiene?
A
I script du finner på nettet osv., vil du ofte finne kode som dette nederst i scriptet:
def main(): # diverse if __name__ == '__main__': main() # og ofte: sys.exit(0)
Dette er en uoffisiell standard i Python-miljøet. Hensikten er enkel: Dersom scriptet kjøres alene, utfør main(). Hvis det importeres som en modul i et annet script: Ikke utfør main.
__name__ er en built-in variabel. Den rommer enten strengen "__main__", eller filnavnet på modulen som importeres (uten fil-ekstensjon). Alt avhengig av hvor den kalles fra.
Mer konkret:
Vi lager en fil som heter parse_html.py. I den har vi kun følgende kode:
print __name__
Kjører vi scriptet fra prompt, blir utdata:
>>> __main__
Lager vi en annet script som heter parser.py
og legger inn denne koden:
import parse_html
så vil
>>> parse_html
bli printet ut. __name__ inneholder nå navnet på modulen, ikke "__main__"
Det er ingen ulemper med å bruke denne metoden, så det anbefales. Da kan du importere funksjoner eller klasser fra et script uten at kode eksekveres.
Det er også vanlig å legge til sys.exit(0) som siste statement. Det betyr at returverdien fra scriptet er 0, dvs "alt vel". Det kan være nyttig i andre sammenhenger og forøvrig en standard, spesielt i *UX-sammenheng.
---------
Dette innlegget har blitt redigert av zeitgeist: 22. juni 2006 - 10:57











