Sida 1 av 1

Python?

Postat: 12 aug 2010, 16:20
av Feilin
Jag försöker lära mig hur man programmerar i Python. Jag har kommit till stadiet då jag bara sitter och provar lite kommandon i "Command Line Version" 3.1, men nu tänkte jag försöka göra lite mer avancerade saker.

1. Hur öppnar man .py-filer i ubuntu? Det står överallt att man ska "leta upp" filen med python, men om man använder Command Line Version, hur gör man då? Jag har gjort en fil som heter Ny.py och lagt den på skrivbordet, vad ska jag göra för att köra den som Python-kod?

2. Hur loopar jag kod tills ett kriterium har uppnåtts? T ex, om jag vill addera 1 till ett tal tills talet blir 5
tal = 1
tal = tal + 1
tal = tal + 1
osv...

3. Hur gör jag så att jag döper nånting till "sak#", där # är värdet på tal just i den stunden?
sak(tals värde) = 5
tal = tal + 1
sak(tals värde) = 10
tal = tal + 1
osv...

Tacksam för svar!

Re: Python?

Postat: 12 aug 2010, 16:53
av cthulhu

Re: Python?

Postat: 12 aug 2010, 17:12
av Konservburk
Feilin skrev:1. Hur öppnar man .py-filer i ubuntu? Det står överallt att man ska "leta upp" filen med python, men om man använder Command Line Version, hur gör man då? Jag har gjort en fil som heter Ny.py och lagt den på skrivbordet, vad ska jag göra för att köra den som Python-kod?
Från pythons egna kommandorad:

Kod: Markera allt

exec(open("/sökväg/till/filen.py").read())
Från den vanliga kommandoraden:

Kod: Markera allt

python /sökväg/till/filen.py
/sökväg/till/filen.py blir i ditt fall något i stil /home/feilin/Skrivbord/Ny.py om din användare är feilin och du kör med ett svenskt ubuntu.

Om du vill kunna starta skriptet genom att dubbelklicka på det så måste du till att börja med se till så att första raden i filen ser ut så här:

Kod: Markera allt

#!/usr/bin/python
Högerklicka sedan på filen, välj Egenskaper, fliken Rättigheter och kryssa för Tillåt körning av filen som ett program.
Feilin skrev:2. Hur loopar jag kod tills ett kriterium har uppnåtts? T ex, om jag vill addera 1 till ett tal tills talet blir 5
tal = 1
tal = tal + 1
tal = tal + 1
osv...

Kod: Markera allt

tal = 1
while tal < 5:
	tal += 1
Feilin skrev:3. Hur gör jag så att jag döper nånting till "sak#", där # är värdet på tal just i den stunden?
sak(tals värde) = 5
tal = tal + 1
sak(tals värde) = 10
tal = tal + 1
osv...

Kod: Markera allt

sak = {}
sak[tal] = 5
tal += 1
sak[tal] = 10
tal += 1

Re: Python?

Postat: 12 aug 2010, 17:25
av Luxwarp
http://www.linuxwiki.se/index.php/Bli_ormtjusare

Där har du nog sveriges bästa python guide på nätet. Går igenom allt som du behöver veta, grundläggande. Har använt den många gånger och även folk i klassen som vill lära sig python när dom vill ha ett enkelt scriptspråk:)

Re: Python?

Postat: 12 aug 2010, 17:51
av mcNisse
Konservburk skrev:Om du vill kunna starta skriptet genom att dubbelklicka på det så måste du till att börja med se till så att första raden i filen ser ut så här:

Kod: Markera allt

#!/usr/bin/python
Vill bara lägga till en variant som kan vara bra när man vill skriva skript för installationer som inte har python i /usr/bin.

Kod: Markera allt

#!/usr/bin/env python

Re: Python?

Postat: 12 aug 2010, 20:19
av Feilin
AH! Tack!!!

Nu fick kom jag på att jag varit så slarvig och ignorerat att "S" i "Skrivbord" när jag skriver sökvägen är versalt... Som amatör kan det kännas lite onödigt att den ska vara skriftlägeskänslig, men det finns säkert en baktanke med det också.

Kom till många insikter tack vare era poster, många tack! Nu fattar jag t ex att " " gör att man kan ha flera kommandorader som hänger samman, vilket var bra att upptäcka...

Dock är jag inte helt hundra vad som menas med
#!/usr/bin/python
Hur använder jag den? Att dubbelklicka gör i nuläget att jag får upp den i gedit. Vad ska man öppna den med?

Tack för guiden! Egentligen brukar jag inte läsa guider, för de går ofta igenom sånt som inte är relevant, utan jag brukar försöka ta reda på vilka kommandon jag behöver använda och läsa på dem ett i taget. Finns det nåra bra listor med kommandon, där man har kort förklaring på vad det gör?

(edit)
En sak jag tänkte på; jag hittade en formel som slumpar tal (random.randint(a,b)), men den funkar av nån anledning inte, och jag får istället "random is not defined" som felmeddelande. Varför? Hur får jag random att funka?

Re: Python?

Postat: 12 aug 2010, 20:56
av Konservburk
mcNisse skrev:Vill bara lägga till en variant som kan vara bra när man vill skriva skript för installationer som inte har python i /usr/bin.

Kod: Markera allt

#!/usr/bin/env python
Det där förutsätter dock att env finns i /usr/bin och inte t.ex. direkt i /bin, samt även att katalogen där python ligger finns med i $PATH, vilket inte alls är säkert.

Feilin skrev:AH! Tack!!!
Dock är jag inte helt hundra vad som menas med
#!/usr/bin/python
Hur använder jag den?
Det ska vara första raden i filen. Den talar om att resten av filen ska tolkas av programmet /usr/bin/python.
Feilin skrev:Att dubbelklicka gör i nuläget att jag får upp den i gedit. Vad ska man öppna den med?
Du måste göra filen körbar som jag beskrev i mitt förra inlägg. När du gjort det och dubbelklickar på den så kommer det upp en dialogruta där du kan välja att köra filen istället för att öppna den med gedit. Du kan välja mellan Kör i terminal och bara Kör. Skapar ditt python-skript inga egna fönster så kommer du inte att se något alls om du kör utan terminal. Tänk på att terminalen stängs direkt när ditt skript kört klart, vilket kan gå väldigt fört. Det är det som händer om du bara ser en terminal blinka förbi.
Feilin skrev:En sak jag tänkte på; jag hittade en formel som slumpar tal (random.randint(a,b)), men den funkar av nån anledning inte, och jag får istället "random is not defined" som felmeddelande. Varför? Hur får jag random att funka?
Innan du använder random måste du ha med raden:

Kod: Markera allt

import random

Re: Python?

Postat: 13 aug 2010, 13:34
av Feilin
Återigen, tack för upplysningen! Nu funkar random finfint.

Dock så får jag inte upp en dialogruta med val, även efter jag gjorde den körbar. Det är inte iofs inte speciellt viktigt i nuläget.

Hur behåller jag ett värde mellan olika "methods" (kallas det så när man definierar nåra rader kod som man enkelt kan kalla upp sen?)? Koden börjar med att definiera ett värde som jag vill att den ska hålla koll på hur många gånger funktionen körs och sen i funktionen arbeta med värdet. Men när jag gör så klagar den bara på att "(...) is not defined", fast det är definierat (enligt mig). Hur löser man det problemet?

(edit)
Det verkar ha nåt att göra med "global variables", men jag har fortfarande inte kommit underfund med hur man skapar enkla sådana, som definerar variabeln "var" så att den ligger kvar. Hur gör man det?

Re: Python?

Postat: 13 aug 2010, 14:26
av Konservburk
Feilin skrev:Dock så får jag inte upp en dialogruta med val, även efter jag gjorde den körbar. Det är inte iofs inte speciellt viktigt i nuläget.
Jag har dålig koll på det grafiska gränssnittet. Sist jag provade med en helt ny installation så fungerade det dock som jag beskrivit.
Feilin skrev:Hur behåller jag ett värde mellan olika funktioner (kallas det så när man definierar nåra rader kod som man enkelt kan kalla upp sen?)? Koden börjar med att definiera ett värde som jag vill att den ska hålla koll på hur många gånger funktionen körs och sen i funktionen arbeta med värdet. Men när jag gör så klagar den bara på att "(...) is not defined", fast det är definierat (enligt mig). Hur löser man det problemet?
Jag är inte riktigt med på vad du är ute efter? Kan du visa upp kodsnutten som inte fungerar så kanske det framgår tydligare.
Feilin skrev:(edit)
Det verkar ha nåt att göra med "global variables", men jag har fortfarande inte kommit underfund med hur man skapar enkla sådana, som definerar variabeln "var" så att den ligger kvar. Hur gör man det?
Är det något i den här stilen du är ute efter?

Kod: Markera allt

variabel = 0
def funktion():
	global variabel
	variabel += 1
	print(variabel)
funktion()
funktion()
Man brukar dock undvika att använda globala variabler för sånt där. Då är det bättre att göra en enkel klass i stil med:

Kod: Markera allt

class klass():
	def __init__(self):
		self.variabel = 0
	def __call__(self):
		self.variabel += 1
		print(self.variabel)
objekt = klass()
objekt()
objekt()

Re: Python?

Postat: 13 aug 2010, 14:38
av Feilin
Ok, såhär tror jag man kan förkorta kodsnutten:

Kod: Markera allt

crn = {}
nmm = 1
import random
def ant(sta):
  while sta > 0:
    sak = random.randint(1,2)
    if sak == 1:
      crn[nmm] = 1
    nmm += 1
    sta -= 1
ant(3)
if crn[1]:
  print("1an!")
if crn[2]:
  print("2an med!")
if crn [3]:
  print ("Till och med 3an!")
Själva koden är mycket längre, så det var lättare att skriva ett exempel som jag tror illustrerar samma användning.

Re: Python?

Postat: 13 aug 2010, 14:56
av Konservburk
Varför inte bara flytta in initieringen av nmm i funktionen?

Kod: Markera allt

crn = {}
import random
def ant(sta):
	nmm = 1
	while sta > 0:
		sak = random.randint(1,2)
		if sak == 1:
			crn[nmm] = 1
		nmm += 1
		sta -= 1
ant(3)
if 1 in crn:
	print("1an!")
if 2 in crn:
	print("2an med!")
if 3 in crn:
	print ("Till och med 3an!")
Jag ändrade även if crn[1] till if 1 in crn (och motsvarande för 2 och 3) som gör mer det jag tror att du är ute efter.

Re: Python?

Postat: 13 aug 2010, 15:05
av Feilin
Därför att jag vill att den inte ska sätta den till 1 varje gång jag kör metoden, utan hålla räkningen på hur många gånger (eller vilken gång, snarare) den kör(t)s.

(edit)
Jag vill, direkt efter funktionen körts, printa lite information, och då är det vitalt om det är 1a eller 2a gången den körs

Re: Python?

Postat: 13 aug 2010, 15:28
av Konservburk
Feilin skrev:Därför att jag vill att den inte ska sätta den till 1 varje gång jag kör metoden, utan hålla räkningen på hur många gånger (eller vilken gång, snarare) den kör(t)s.

(edit)
Jag vill, direkt efter funktionen körts, printa lite information, och då är det vitalt om det är 1a eller 2a gången den körs
Det framgår ju inte av ditt exempel.

Hur som helst så finns det flera alternativ. Enklast är att använda en global variabel som jag visade tidigare, men det är mycket bättre att skapa en liten klass istället. Globala variabler blir betydligt svårare att hålla ordning på när programmet växer sig större.

Re: Python?

Postat: 13 aug 2010, 16:05
av Feilin
Ursäkta min oklarhet i mina förklaringar. Vad jag vill är att kunna komma åt en variabel (eller nån motsvarande funktion) både innan, under och efter jag kör en metod. Just nu gör jag såhär (vilket blir fel):

Först vill jag definiera variablerna:

Kod: Markera allt

crn = {}
nmm = 1
Sen vill jag definiera metoden:

Kod: Markera allt

def ant(sta):
  while sta > 0:
    crn[nmm] = random.randint(1,2)
    nmm += 1
    sta -= 1
Sist vill jag returnera värden:

Kod: Markera allt

print(crn[1])
print(crn[2])
Fast det måste vara fler fel, för bara det här returnerar:

Kod: Markera allt

File "<string>", line 10, in <module>
Varför då?

Re: Python?

Postat: 13 aug 2010, 16:39
av Konservburk
Feilin skrev:Just nu gör jag såhär (vilket blir fel):

Först vill jag definiera variablerna:

Kod: Markera allt

crn = {}
nmm = 1
Sen vill jag definiera metoden:

Kod: Markera allt

def ant(sta):
  while sta > 0:
    crn[nmm] = random.randint(1,2)
    nmm += 1
    sta -= 1
Sist vill jag returnera värden:

Kod: Markera allt

print(crn[1])
print(crn[2])
Fast det måste vara fler fel, för bara det här returnerar:

Kod: Markera allt

File "<string>", line 10, in <module>
Varför då?
Har du glömt att anropa funktionen?
Feilin skrev:Ursäkta min oklarhet i mina förklaringar. Vad jag vill är att kunna komma åt en variabel (eller nån motsvarande funktion) både innan, under och efter jag kör en metod.
Jag har förstått det. Som jag redan visat så kan du använda en global variabel, men jag rekommenderar fortfarande att du använder en liten klass istället.

Kod: Markera allt

import random

class DinKlass():

	# dina variabler
	crn = {}
	nmm = 1

	# dina metoder
	def ant(self, sta):
		while sta > 0:
			self.crn[self.nmm] = random.randint(1,2)
			self.nmm += 1
			sta -= 1

objekt = DinKlass()  # skapa ett obejkt av din klass
print(objekt.nmm)
objekt.ant(3)  # anropa metoden
print(objekt.nmm)

Re: Python?

Postat: 13 aug 2010, 22:15
av Feilin
Nu har jag kommit runt problemet (på annat sätt, inte lyckats att skapa klasser och objekt), dock blev det mycket enklare och enkelspårigt. Jag får försöka fortsätta leka lite tills jag kommit på hur klasser och objekt fungerar.

Hursomhelst, tack för hjälpen! Kommer säkert komma tillbaka hit och bygga om koden som tipsat! Tusen tack!

En sak jag funderar på nu, var om man vill göra nånting med en grafisk layout. Har fått höra att vill man behandla text så är Python det smidigaste språket, men om man vill göra nåt mer grafiskt och interraktivt, som permanenta formulär (liknande excel eller access, är vad jag skulle vilja komma åt), så är Java enklare. Är det så? Är det möjligt att skapa formulär med knappar osv i Python?