Litt enkel kode og noen ressurser

Pedagogisk programmeringsspråk
KBleivik
Site Admin
Innlegg: 30
Registrert: fre mar 29, 2013 7:52 pm

Litt enkel kode og noen ressurser

Legg innav KBleivik » fre mar 29, 2013 10:38 pm

1. Nedlasting og installasjon.

Python lastes ned fra den offisielle Python siden: http://python.org/ Her http://python.org/download/releases/ er alle tilgjengelige versjoner. Les hele punkt 1 før du bestemmer deg for hvilken versjon du velger, siden versjon 2.5 følger med boken "Hallo World" nevnt nedenfor. Det kan være greitt å begynne der. Med dagens kraftige maskiner er det ingen ting i veien for å ha flere versjoner innstallert samtidig. Hadde jeg begynt på Python i dag, ville jeg startet med å laste ned eskempelkoden til boken "Hallo World" og fått den til å fungere. Det kan jo være en god oppgave å også installer versjon 2.7 og få koden til å virke der. Det vil nok være hardere å debugge koden til å virker for versjon 3.2, men det er også en oppgave man etter hvert bør takle. Versjon 3.+ er jo fremtiden for Python.

Når dette skrives er situasjonen

Download Python

The current production versions are Python 2.7.2 and Python 3.2.2.

Start with one of these versions for learning Python or if you want the most stability; they're both considered stable production releases.

If you don't know which version to use, start with Python 2.7; more existing third party software is compatible with Python 2 than Python 3 right now.

Kilde: http://python.org/download/

Om du velger en installer, følger ikke koden Python er skrevt i med, men bare de ferreste trenger den.

Se også:

http://blog.python.org/2011/07/python-l ... ws_11.html

http://docs.python.org/

http://docs.python.org/py3k/

På PortablePython http://www.portablepython.com/ finnes der mye bra og Pyscripter og SPE skal visst følge med Portablepython - se nedenfor.

2. Valg av IDE, editor etc.

Der er mange editorer / IDEer som kan kjøre Python direkte eller med et innstikk ("plugin"). Vi viser viser til denne: Valg av Python editor / IDE tråden for en mer fullstendig forklaring.

Vi vil i denne innledningsposten bare omtale den enkle IDLE editoren som ligger i mappen c:\python25\Lib\idlelib\ (c:\python27\b\idlelib\) og installeres med Windows installeren av Python samt Stani's Python Editor SPE. Der er to filer, idle.py og idle.pyw. Jeg bruker idle.pyw og sender den til skrivebordet som snarvei. SPE er en god del mer avansert enn IDLE, men den vedlikeholdes ikke. Laster du hele pakken til boken "Hello World" følger den med og bruken forklares i boken. SPE kan lastes ned her:

http://pythonide.blogspot.com/2007/02/h ... om_26.html

http://developer.berlios.de/project/sho ... e_id=14185

hvor vi ser at siste versjon ble laget 14. februar 2008. Merk at SPE er programmert i Python, så det er et godt eksempel på hva som kan lages med Python. Blir du en avansert Python programmerer, kan du prøve å oppdatere koden. Du kan velge gradvis mer avansert verktøy. Forslag:
  1. Start med å kjøre Python kode fra Python prompten. Har du lagt in Python i PATH variablen, skriver du python fra DOS prompt. Jeg har lagt en snarvei til c:\python27\python.exe på skrivebordet. Dermed er det bare å klkke på den snarveien og man er inne i Python konsolet.
  2. Et program kan være noe så enkelt som en samling instrukser. Nå er det på tide å bruke IDLE.
  3. Lastet du ned koden som fulgte med boken og bruker 2.5 versjonen som også fulgte med boken, kan du etter hvert begynne å bruke det litt mer avanserte SPE IDE,
  4. eller gå dirkete over på en mer avansert editor og IDE om det er uaktuelt å bruke SPE.

Etter at du er blitt fortrolig med enkle Pyhon kommandoer og programmer, er det kanskje lurt å fortsette her:

"3. An Informal Introduction to Python": http://docs.python.org/tutorial/introduction.html

Uformell norsk Pyhon FAQ på diskusjon.no

Her http://www.kjellbleivik.com/Books/GameD ... php#python finner du en god del Python ressurser.

Har du aldri brukt Python, kan det være greit å begynne med boken http://www.manning.com/sande/ som benytter Python 2.5. Jeg lastet ned pakken herfra: Windows Installation Instructions http://www.manning.com/sande/Installati ... ml#windows og brukte Simple method som fungerte utmerket. Alt ble installert i mappen C:\python25.

Eksemplene i boken finnes på nettet http://www.manning.com/sande/sourcecode ... y_Chapter/ om man bare vil laste ned og kjøre noen av dem. De kan selvsagt også åpnes i WordPad om man bare ønsker å studere koden.

Eksempel et enkelt interaktivt program Listing 1-2.py (grafisk versjon Listing 6-5.py i kapittel 6 som ikke virker uten at du har installert easygui):

Kode: Velg alt

# Listing_1-2.py
# Copyright Warren Sande, 2009
# Released under MIT license   http://www.opensource.org/licenses/mit-license.php
# Version 59  ----------------------------

# Number Guess game

import random

secret = random.randint(1, 99)     # pick a secret number
guess = 0
tries = 0

print "AHOY!  I'm the Dread Pirate Roberts, and I have a secret!"
print "It is a number from 1 to 99.  I'll give you 6 tries. "

# try until they guess it or run out of turns
while guess != secret and tries < 6:
    guess = input("What's yer guess? ")       # get the player's guess
    if guess < secret:
        print "Too low, ye scurvy dog!"
    elif guess > secret:
        print "Too high, landlubber!"
    tries = tries + 1                         # used up one try

# print message at end of game   
if guess == secret:
    print "Avast! Ye got it!  Found my secret, ye did!"
else:
    print "No more guesses!  Better luck next time, matey!"
    print "The secret number was", secret

Den koden kan selvsagt kjøres linje for linje fra python 2.5 (og forhåpentligvis 2.7 - de eksemplene jeg har testet på 2.7 virker) klarmelding. Den vil ikke virke for python 3.+ versjoner (se hvorfor nedenfor). Eller den kan limes inn i IDLE editoren, lagers som Python fil og kjøres. Lastet man ned hele pakken, har man allerede alle eksemplene som følger med boken. Jeg legger eksemplene i mappen c:\HelloWorld\examples\ for lett å kunne testes på ulike versjoner av Python. Da er det bare å åpne filen i en av editorene og kjøre den (F5 i IDLE). Koden ovenfor er ikke særlig vanskelig, men det tar ikke mange kapitlene før man begynner å lære Python, grafiske bruker grensesnitt GUIer (kapittel 6) og lage enkle spill (ferdig eksempel kode starter i kapittel 10). Med andre ord, et glimrende pedagogisk sted og starte for å lære seg Python. Siden eksemplene er laget for Python 2.5, er det nok sikrest at de kjøres på den versjonen, men de bør nok også virke på siste 2 versjon, dvs. versjon 2.7. Les mer om ulike versjoner og kompatibilitetsproblemer nedenfor.

Oppgave

Lastet du ned pakken som fulgte med boken, skulle du ikke ha problmer med å få listing 6-5.py til å virke i versjon 2.5 av Pyhton. Nå er det på tide å laste ned den siste 2.+ versjone av Python (2.7.2 da dette skrives) og selv få listing 6-5.py til å virke. For at det programmet skal virke må du først Installer easy GUI som forklart her: http://easygui.sourceforge.net/download ... index.html Installerte du ikke pakken finner du, listing 6-5.py her http://www.manning.com/sande/sourcecode ... y_Chapter/ Prøv så å få det programmet til å virke i Python 2.7.+

3. List comprehension og noen andre kodesnutter.

Lister er viktige data strukturer i Python. Følgende eksempel lager en liste og skriver den ut:

Kode: Velg alt

numbers = [i for i in range(1,20)]
print numbers


Trenger man laste ned Python for å teste den koden? Svaret er nei. Koden kan testes direkte på dette

http://ideone.com/

nettstedet, men det går tregt så om man skal teste mange kodesnutter eller skrive egne program i Python kommer man ikke utenom å laste ned og installerer programmet selv.

Se mer om kontroll flyt her: http://docs.python.org/tutorial/controlflow.html

Merk spesielt

4.7.5. Lambda Forms

By popular demand, a few features commonly found in functional programming languages like Lisp have been added to Python. With the lambda keyword, small anonymous functions can be created. Here’s a function that returns the sum of its two arguments: lambda a, b: a+b. Lambda forms can be used wherever function objects are required. They are syntactically restricted to a single expression. Semantically, they are just syntactic sugar for a normal function definition. Like nested function definitions, lambda forms can reference variables from the containing scope:
>>>

>>> def make_incrementor(n):
... return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43

siden lambda funksjoner er ganske populære i ulike språk. Merk også primtalls eksemplet:

>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print n, 'equals', x, '*', n/x
... break
... else:
... # loop fell through without finding a factor
... print n, 'is a prime number'
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

som kan gjøres langt mer effektivt for store tall ved ikke å undersøke tall større enn kvadratroten av tallet, hoppe over partall større enn 2 (som er greit nok i eksemplet) og tall som er delelig med 3. Med andre ord så er ikke 27 et primtall da tverrsummen =2+7= 9 og 9 er delelig med 3 og dermed er ikke 27 et primtall. Men det kan gjøres enda mer effektivt. Primtalls tvillinger som for eksempel (11,13), (17,19) er for eksempel alltid av formen [(nx6)-1,(nx6)+1] . Les mer her:

http://www.webproworld.com/webmaster-fo ... -and-twins.

Ok så la oss begynne med å bare undersøke tall opp til kvadratroten av tallet (+ 1 for sikkerhetsskyld). Først merker vi at hverken sqrt 16 eller sqrt(16) virker i python 2.5 eller 3.1, så vi søker på nettet: python square root som gir dette http://docs.python.org/library/math.html treffet. Et raskt side søk (CTRL + F + sqrt) gir oss dette

math.sqrt(x)

Return the square root of x.

treffet, så vi prøver med

Kode: Velg alt

math.sqrt(16)

men det gir en feilmelding. En som er vant med moduler og utvidelser vil med en gang lukte lunten. Der er sikkert en egen mattematikk modul. Den kjappe som vet hvordan moduler importeres til Python prøver seg med

Kode: Velg alt

import math

som ikke gir noen feilmelding. Og etter at denne modulen er importert, fungerer

Kode: Velg alt

math.sqrt(16)

i begge de Python versjonene jeg benytter. Den litt tregere vil lete i modulene i hjelp systemet (se avsnittet Hjelp i Python nedenfor). Så dermed skal jeg kunne effektivisere Python eksemplet ovenfor til å erstatte n med

Kode: Velg alt

m=math.sqrt(n) + 1

i eksempelet ovenfor dvs i linjen

Kode: Velg alt

for x in range(2, n):

erstattes med

Kode: Velg alt

for x in range(2, m):

Prøv selv og sjekk om den rutinen er kjappere for store primtall.

Det er for øvrig greit å kjenne de matematiske modulene http://docs.python.org/library/numeric.html

funksjonene i Python http://docs.python.org/library/math.html og de innebygde funksjonene http://docs.python.org/library/functions.html

Python standard dokumentasjon: http://docs.python.org/library/index.html og

Python dokumentasjonen generelt: http://docs.python.org/index.html

4. Python 2.+ eller Python 3.?

Ulike versjoner av python gir ulik informasjon og Python er ikke alltid bakover kompatibel, http://wiki.python.org/moin/Python2orPython3

Skriver jeg koden ovenfor i Python 2.5 går alt bra, men skrive jeg

Kode: Velg alt

print numbers


i Python 3.+, får jeg en feilmelding SyntaxError: Invalid syntax. Det er ikke særlig gøy om man har kode som virker i Python 2.+ ettersom print kommandoen er endret til

Kode: Velg alt

print (numbers)


i Python 3.+. Det er et opplegg til trøbbel eller krevende debugging. Dermed gjenstår følgende muligheter:
  1. Bruke eldre Python vesjon hvor koden virker.
  2. Automatisk konvertering (tolkning) av Python 2.+ til Python 3.+ kode som for eksempel http://packages.python.org/six/
  3. Gjøre debuggingen en automatisk oversetter ikke greier selv.
  4. Kjøre flere Python versjoner ved siden av hverandre og kun oppgradere viktige prosjekter.
Personlig har jeg valgt løsning 4 ovenfor. Merk for øvrig:
At the time of writing (July 4, 2010), the final 2.7 release is out, with a statement of extended support for this end-of-life release. The 2.x branch will see no new major releases after that. 3.x is under active development and has already seen stable releases, such as the recent 3.2. This means that all recent standard library improvements, for example, are only available in Python 3.x.


fra ovennevnt lenke "Should I use Python 2 or Python 3 for my development activity"? som gjentas her: http://wiki.python.org/moin/Python2orPython3

Merk også:

Well, assuming you can't find an alternative package that already supports Python 3, you still have a few options to consider:

Port the library to 3.x. ("Porting" means that you make the library work on 3.x.) It is possible that the library isn't really needed and you can use another one. If that turns out to be really hard, and all your other dependencies do exist in 2.x, consider starting off in 2.x. As has already been explained in other places, good 2.x code will typically make switching painless as soon as every dependency has been successfully ported. Decide if the feature is really that important. Maybe you could drop it?

The ideal situation is that you try to port the library to 3.x. Oftentimes you'll find someone is already working on this. Even when that's not the case, existing project members will usually appreciate the help, especially as porting often finds bugs in the original software, improving the quality of both the original and the 3.x port. Porting isn't always easy, but it's usually easier than writing your own thing from scratch.

............................................................................................

The porting situation is more complicated if there are C extension modules involved, but even then it is still likely to be easier than inventing your own equivalent package.

There are also some more in depth guides right here on the wiki: PortingPythonToPy3k, PortingExtensionModulesToPy3k


Learning with Python 3 http://openbookproject.net/thinkcs/pyth ... index.html har mye bra stoff for dem som vil lære seg Python 3.+.

5. Hjelp i Python

Når jeg starter Python 3.1 blir jeg allerede ved oppstart minnet om følgende

Type help ...


Så skriver jeg help ved Python prompten får jeg ytterligere informasjon

Type help() for interactive help, or help( object) for help abut an object
.

Så skrive jeg help() får jeg ytterligere generell informasjon. Ved help prompten (help>) kan jeg for eksempel skrive topics som gir en oversikt over emner mens modules gir oversikt over en rekke Python moduler. Selv om Python 3.1 har mange flere moduler enn Python 2.5 (og 2.7) går det raskere for hjelp systemet og liste dem. Du skriver quit for å komme ut av hjelp systemet.

Skriver jeg for eksemple print i hjelp systemte i Python 3.+ får jeg av naturlige grunner siden help syntaksen er endret i Python 3.+ en forklaring mens hjelp systemet i 2.5 ikke har noen forklaring på print kommandoen.

Nå vil jeg finne kvadratrotfunksjonen i Ptyhon. Hva er vel da mer naturlig enn å spørre ved å laste hjelp systemet med help() og spørre etter mathematics som ikke gir noe formuftig svar. Derimot gir math svar som starter slik:
Help on built-in moduel math:

NAME math

FILE built-in

DESCRIPTION This module is always available. It defines access to the mathematical functions defined by the C standard.

FUNCTIONS etter en del scrolling

sqrt(...) sqrt(x) Returns the square root of x.

Jeg tolker built-in som at det ikke skulle være nødvendig å laste inn en matte modul, og at sqrt(16) skulle være umiddelbart tilgjengelig ved Python prompten. Men den er bare tilgjengelig etter at math modulen er importert og da som math.sqrt(16) om man da ikke bruker

Kode: Velg alt

from math import sqrt


Da kan man skrive sqrt(16).

6. EasyGui installasjon og mulige konflikter

Hjemmeside: http://easygui.sourceforge.net/ som man bør bruke en del tid på.

1 A warning about using EasyGui with IDLE

You may encounter problems using IDLE to run programs that use easygui. Try it and find out. easygui is a collection of Tkinter routines that run their own event loops. IDLE is also a Tkinter application, with its own event loop. The two may conflict, with the unpredictable results. If you find that you have problems, try running your program outside of IDLE.


http://easygui.sourceforge.net/tutorial ... nts_item_1

Dette er allerde påpekt i boken "Hello World" omtalt i innledningen til denne posten. Løsninger er også skissert der, hvor en er å bruke SPE IDE som er omtalt ovenfor.

Nedlasting: http://easygui.sourceforge.net/download/index.html På nedlastingssiden finner man også hvordan EasyGui skal installeres og tilpasses.

Merk spesielt:
Note that the easygui.py file should be installed directly into Python's site-packages directory. It should not be installed in a site-packages/easygui directory. Doing so will probably cause your "import" statement for easygui to fail.


Det skulle vel dermed kanskje bare være å pakke ut filene og lastet dem inn i den mappen. Men jeg laster dem inn i C:\Temp og går til DOS klarmelding å gjør som forklart i innstallasjongudien og innstallere dem i Python27 mappen. Her http://www.kjellbleivik.com/images/EasyGui.jpg er DOS dialogen. Dokumentasjonen pakket jeg ut og installerte i C:\Python27\EasyGuiDoc. Det letteste er å bokmerke dokumentasjoen ved å klikke på filen index i den mappen og dermed bokmerker jeg file:///C:/Python27/EasyGuiDoc/index.html som minner mye om den dokumentasjone på nettet. Allikevel grei å ha om man ikke er koblet til internet. Etter at EasyGui er installert, er det jo bare å se om Listing 6-5.py fra kapittel 6 i boken "Hello World" fungerer med IDLE.

Kode: Velg alt

# Listinig_6-5.py
# Copyright Warren Sande, 2009
# Released under MIT license   http://www.opensource.org/licenses/mit-license.php
# Version 59  ----------------------------

# Number Guess game using Easygui
import random, easygui

secret = random.randint(1, 99)        #pick a secret number
guess = 0
tries = 0

easygui.msgbox("""AHOY!  I'm the Dread Pirate Roberts, and I have a secret!
It is a number from 1 to 99.  I'll give you 6 tries.""")

# keep trying until they guess it or run out of turns
while guess != secret and tries < 6:
    guess = easygui.integerbox("What's yer guess, matey?")  # get the guess
    if not guess: break
    if guess < secret:
        easygui.msgbox(str(guess) + " is too low, ye scurvy dog!")
    elif guess > secret:
        easygui.msgbox(str(guess) + " is too high, landlubber!")
    tries = tries + 1                                       # used up one try

if guess == secret:
    easygui.msgbox("Avast! Ye got it!  Found my secret, ye did!")
else:
    easygui.msgbox("No more guesses!  Better luck next time, matey!")

Og det gikk glimrende på min 2.7 installasjon. Dermed trenger ikke mer kompliserte programmer fungere sammen med IDLE og da må man bruke SPE eller andre IDEer.

EasyGui Tutorial: http://easygui.sourceforge.net/tutorial/index.html

7 Litteratur.

http://pragprog.com/book/gwpy/practical-programming

http://shop.oreilly.com/product/9780596513986.do

På PortablePython http://www.portablepython.com/ finnes der noen gratis Pyhon bøker.

8 For dypdukkerne.

http://docs.python.org/extending/index.html og http://docs.python.org/py3k/extending/index.html

Yang Zhang http://yz.mit.edu/ har noen lenker om python på sin delicious http://delicious.com/yaaang/Python_library konto. På sin side viser han også til verktøyet gbookmark2delicious http://code.google.com/p/gbookmark2delicious/

Gå tilbake til «Python»

Hvem er online

Brukere i dette forumet: Ingen registrerte brukere og 2 gjester