[python] Alternatief voor de For loop?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Khaine
  • Registratie: Februari 2004
  • Laatst online: 22:32

Khaine

Python liefhebber

Topicstarter
Misschien is het omdat ik uit een beknopte java/c++wereld kom. Misschien is het omdat ik dit soort dingen altijd om 1 uur in de nacht verzin. Misschien denk ik krom, maar toch probeer ik het.

Ik ben voor eigen ontwikkeling een spelletje aan het maken in python waarbij het de bedoeling is om een bepaald aantal keer een dobbelsteen te gooien en de resultaten te vergelijken. Voor de dobbelstenen heb ik een aparte klasse gemaakt. In die klasse heb ik verschillende methoden die verschillende soorten dobbelstenen kunnen rollen. Zo heb ik bijvoorbeeld een kleurdobbelsteen, waarvan de 6 zijden in een lijst worden verwoord, op de volgende manier:
code:
1
2
3
kleursteen = ["rood","blauw","geel","groen","zwart","wit"]
roll = random.randrange(0,5)
print "Jouw kleur is: " + kleursteen[roll]


Deze code werkt prima.

Wat ik nu echter wil maken is een andere methode die een variabel aantal keer de kleurdobbelsteen werpt. Het is dan aan de gebruiker om te bepalen hoe vaak dit is. Bijvoorbeeld werpsteen(3) zou 3 keer de getoonde code moeten uitvoeren. In java/c++ maakte ik hiervoor altijd een for loop aan, met variabele i die begon bij 0 en optelt tot hij bij het aantal keer in de statement aan kwam.

Hier dus het probleem. De FOR loop in python vergelijkt met een lijst ipv een simpele int. Een lijst heeft echter een vaste waarde en daar loopt het dus mis. Ik wil niet dat de waarde vast staat, maar bij aanroep kan veranderen. Hoe kan ik deze FOR loop zo aanpassen dat hij de input van mijn statement pakt als referentie? Met een while-loop lukt het wellicht, maar dan moet ik andersom gaan redeneren en dat geeft meer errors dan geluk ben ik bang.

Maak ik ergens een denkfout misschien?

Is this question retorical? No? Then what is the point of retorical questions?


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik ben geen Python-coder, maar werkt dit niet?
Python:
1
for i in range(1, counter)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Khaine
  • Registratie: Februari 2004
  • Laatst online: 22:32

Khaine

Python liefhebber

Topicstarter
NMe schreef op dinsdag 17 november 2009 @ 01:29:
Ik ben geen Python-coder, maar werkt dit niet?
Python:
1
for i in range(1, counter)
Haha 8)7

Sjeez ... dat ik daar overheen heb gekeken. Dat lost het ook echt direct op! Bedankt :)
[edit]
Deze is dus voor het archief.

[edit2]
@hieronder: Die is nog mooier inderdaad. Zo'n briljante slangenbezweerder ben ik nog niet :D

[ Voor 19% gewijzigd door Khaine op 17-11-2009 01:38 ]

Is this question retorical? No? Then what is the point of retorical questions?


Acties:
  • 0 Henk 'm!

  • TweakBoy
  • Registratie: Augustus 2001
  • Laatst online: 14-09 22:16

TweakBoy

---

Python:
1
2
3
4
stdin = int(raw_input('Hoeveel keer werpen? '))
for i in range(0, stdin):
    roll = random.randrange(0,len(kleursteen))
    print "Jouw kleur is: " + kleursteen[roll]

---


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
TweakBoy schreef op dinsdag 17 november 2009 @ 01:35:
Python:
1
2
3
4
worpen = int(raw_input('Hoeveel keer werpen? '))
for i in range(worpen):
    roll = random.randrange(0,len(kleursteen))
    print "Jouw kleur is: " + kleursteen[roll]
FTFY. range(0,max) == range(max). Verder is het natuurlijk een slecht programmeervoorbeeld(TM) om je variabele stdin te noemen ;)

Acties:
  • 0 Henk 'm!

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
Als je nog een 2.x Python versie gebruikt kun je beter een xrange() call gebruiken in plaats van range(). xrange genereert geen list maar geeft je een iterator wat scheelt in je geheugen gebruik (wat je voornamelijk merkt bij grotere ranges). In Python 3 is de range() implementatie die xrange() implementatie en dien je expliciet te converteren naar een list met list(xrange()). Python >= 2.6 geeft DeprecationWarnings als je xrange gebruikt (met de juiste flags) :)

Verder is het beter om random.choice te gebruiken als je iets uit een lijst wil pakken en ik zie niemand hierboven de raw_input() call afhandelen als er geen getal wordt ingevoerd?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
import random

stone = ['red', 'blue', 'white']

while True:
  try:
    times = int(raw_input('Hoeveel keer werpen: '))
  except ValueError:
    print 'Foutieve waarde, gebruik een getal.'
    continue

  break


for i in xrange(times):
  print 'Jouw kleur is %s' % random.choice(stone)


Als we dit destilleren naar dat we alleen maar een lijst willen met de uiteindelijk gegooide waardes (en wat verder afwijken van jouw insteek):
code:
1
2
3
4
5
6
7
#!/usr/bin/env python
import random

L = ['red', 'green', 'blue']
amount = 10

print [random.choice(L) for x in xrange(amount)]


En dan kun je zelf de raw_input afhandeling van hierboven overnemen :)

[ Voor 39% gewijzigd door supakeen op 17-11-2009 11:25 ]

Pagina: 1