[Python] Errore di semantica -

Alessandro Re ale a ale-re.net
Mer 24 Giu 2015 02:41:08 CEST


2015-06-24 0:19 GMT+01:00 Carpediem <i.carpediem a tiscali.it>:
> Ho seguito i passaggi uno ad uno anche con carta e penna, ho modificato il
> codice più volte ma alla fine ottengo sempre lo stesso non voluto
> risultato. Mi aiutate a capire?

Ciao, ti dirò dove secondo me stai sbagliando, anche se non conosco la roulette.
E non solo ti dirò dove sbagli per l'errore che descrivi, ma per gli
altri mille peccati capitali che hai commesso nel codice >:D ahahah

> uscita_passe = 0
> uscita_manque = 0
> scommessa_semplice = ("passe","manque")
> scommessa_passe = 0
> scommessa_manque = 0
> tutti_i_numeri =
> (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24!
>  ,25,26,27,28,29,30,31,32,33,34,35,36)

Se la roulette avesse avuto 10000 numeri cosa facevi, li elencavi uno
per uno? :P
Usa tuple(range(37)) anziché quell'elenco che hai scrtto.

> passe = (19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36)
> manque = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)

Per questi usa tuple(range(19, 37)) e tuple(range(1, 19)).

> liste_in_ritardo = []
> puntate_possibili = ("passe","manque","pari","dispari","nero","rosso","prima
> dozzina","seconda dozzina","terza dozzina","prima colonna","seconda
> colonna","terza colonna","prima sestina","seconda sestina","terz
> a sestina","quarta sestina","quinta sestina","sesta sestina",\
>                      "settima sestina","ottava sestina","nona
> sestina","decima sestina","undicesima sestina","quattro primi","carre
> 1a5","carre 2a6","carre 4a8","carre 5a9","carre 7a11","carre 8a12","carre
> 10a14","carre 11a15","carre 13a17","carre 14a18","carre 16a20","carre
> 17a21",\
>                      "carre 19a23","carre 20a24","carre 22a26","carre
> 23a27","carre 25a29","carre 26a30","carre 28a32","carre 29a33","carre
> 31a35","carre 32a36")

Questa sfilza di stringhe potresti formattarla meglio, come ad esempio

puntate_possibili = (
    "passe",
    "manque",
    "pari",
    "dispari",
    "nero",
    "rosso",
    "prima

ecc, anche se esce una cosa lunghissima, personalmente preferisco un
codice più lungo e leggibile che di qualche riga in meno e che mi fa
incrociare gli occhi.

> print("Attenzione: stiamo facendo riferimento alle regole della Roulette
> francese.")
> print("Si presuppone, come previsto ad esempio al Casino' di Venezia, che la
> puntata minima accettata \nsia di 10 Euro e la massima di 600. Si ritiene
> scontato, inoltre, che il giocatore\nsegua rigorosamente i suggerimenti che
> verranno evidenziati dal programma.")
> print()

Ho notato che usi un sacco di print(); non voglio dirti che è una cosa
brutta, ma personalmente non mi piace mischiare gli stili: o usi una
print per ogni riga, o usi \n in una print sola. Io andrei di una
print per ogni riga. Ti consiglio, molto umilmente, di adottare uno
stile ed essere coerente ad esso.

> capitale_disponibile = eval(input("Per cominciare, indicami l'importo che
> intendi mettere a disposizione per il gioco (si consiglia almeno 2500 Euro)"
> ))

eval(input()) è una cosa che vuoi evitare quasi sempre. Non usarlo.
Usa int(input()) se vuoi ottenere un intero oppure usa usa
ast.literal_eval(input()).

https://docs.python.org/3/library/ast.html#ast.literal_eval

>     print("Giocata"+((" ")*17),"ritardi di uscita"+((" ")*6),"Giocata"+(("
> ")*17),"ritardi di uscita"+((" ")*8))

Esistono opzioni migliori per formattare "incolonnando". Esempio:

print('Valore: {:12} Valore {:8}'.format(4, 123))

Usa format() e tutte le sue belle opzionI:
https://docs.python.org/3.3/library/string.html#formatstrings

>     if numero_uscito in passe:

Se passe e manque e tutti_i_numeri li usi solo per tenere elenchi di
numeri, puoi fare 2 cose per migliorare il tuo codice:

1. usare set() anziché tuple(). Set è molto più veloce per vedere se
un elemento è al suo interno, rispetto a tuple, e la sintassi "valore
in insieme" è invariata e molto gradevole da leggere. Quindi, anziché
usare tuple(range(37)), usa set(range(37)). Se, invece, la tupla ti
serve perché è ordinata (set non preserva l'ordine), allora tieni la
tupla.

2. Se hai degli intervalli numerici e devi verificare se sei in tali
intervalli, non usare né tuple né set. Usa gli operatori <=, e magari
definisci un paio di funzioni per leggere meglio:

def in_passe(n):
    return 19 <= n <= 36

if in_passe(numero_uscito):
    etc

>         uscita_manque =+1

E questa riga credo sia l'origine del tuo baco. Più volte nel codice scrivi

variabile =+1

e secondo me tu stai cercando di ottenere

variabile = variabile + 1

ma forse non sai, o non ti sei accorto, che l'operatore += è ben
diverso dai due operatori =+.

a += b vuol dire a = a + b
a =+ b vuol dire a = (+b) cioé a = b (+ indica il segno del numero).

>         prosegui_gioco = input("Vuoi continuare a giocare? si/no ")
>         if prosegui_gioco == "si":

ultimo appunto: in genere è buona cosa fare controllo indipendenti
dalle maiuscole e dalle minuscole.
Quindi:

prosegui_gioco = input('Blah").lower()

così se l'utente inserisce SI o Si, il codice funziona comunque e non
è necessario scrivere tutto in minuscolo.

Spero di averti risolto il problema e ti averti dato qualche dritta :P
Ciauz
~Ale


Maggiori informazioni sulla lista Python