Topic: "Tipizzare" variabili  (Letto 498 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline CostantinoPanino

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
"Tipizzare" variabili
« il: Settembre 29, 2016, 16:54 »
(Premetto di non aver trovato un titolo adatto, ma spero vada bene. )
Buondì.
Ho da circa una settimana iniziato ad addentrarmi nel Python-universo, e scrivendo un semplice e classico codice di confronto dei lati di un triangolo col fine di farmi dare in uscita il tipo di triangolo, mi è sorta una lecita e sacrosanta curiosità da neofita: è possibile "tipizzare" le variabili, o impedire con una funzione che in input venga inserito un certo tipo di variabile?
ps. Il problema è sorto infatti quando, provando a inserire i tre lati, ho digitato dei caratteri: quando ho digitato "a", "a", "a" per ogni lato, la stampa era "Il triangolo è equilatero".

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.921
  • Punti reputazione: 9
    • Mostra profilo
Re: "Tipizzare" variabili
« Risposta #1 il: Settembre 29, 2016, 17:55 »
No, in python non è possibile "tipizzare" le variabili (ci sono delle tecniche avanzate per fare cose analoghe, ma lasciamo perdere), e non rientra nella filosofia del linguaggio, e non dovrebbe essercene bisogno, in generale. Nel tuo caso, se il tuo codice è scritto in modo tale che quando inserisci un input del tipo sbagliato il programma va avanti lo stesso e fornisce risultati sbagliati, vuol dire che hai scritto male il codice. Il comportamento corretto in python sarebbe piantare un'eccezione e uscire dal programma (a meno di intercettare l'eccezione e fare qualcos'altro, ovviamente).
Certo, se non posti il codice non potremmo mai saperlo, ma poco male... dopo tutto questo è un forum di programmazione, non è che il codice sia poi così importante, no?

Offline CostantinoPanino

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re: "Tipizzare" variabili
« Risposta #2 il: Settembre 29, 2016, 18:01 »
Ahahah, ecco qui. È un codice molto poco elegante, devo ancora capire come elegantizzarlo

Questo è il codice al momento: http://pastebin.com/ssLNtNZm

[codice]l1=eval(input("Lato 1: "))
 
l2=eval(input("Lato 2: "))
 
l3=eval(input("Lato 3: "))
 
trng={'l1':l1, 'l2':l2, 'l3':l3}
 
if (trng['l1']==trng['l2'])and(trng['l2']==trng['l3']):
    print("Il triangolo è equilatero.")
   
elif (trng['l1']==trng['l2'])or(trng['l1']==trng['l3'])or(trng['l2']==trng['l3']):
    print("Il triangolo è isoscele.")
 
elif (trng['l1']!=trng['l2'])and(trng['l1']!=trng['l3'])and(trng['l2']!=trng['l3']):
    print("Il triangolo è scaleno.")
[/codice]
« Ultima modifica: Settembre 30, 2016, 19:43 da CostantinoPanino »

Offline bebo

  • python erectus
  • ***
  • Post: 241
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re: "Tipizzare" variabili
« Risposta #3 il: Settembre 30, 2016, 01:19 »
Puoi inserire codice direttamente dentro il forum, cosi' potremo/potrai sempre vederlo anche quando i link esterni scompariranno.

altra cosa: per farla breve.. Non usare MAI eval: http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
e se l'hai letto in qualche libro..riportalo alla libreria o biblioteca o regalalo al tuo caminetto

Se vuoi "sistemare" l'input in ingresso, usa int() attorno ad input(), ed un try/except per catturare eventuali eccezioni e forzare l'utente ad inserire un risultato decente (ps: un ciclo while potrebbe andare bene), mettendo il tutto dentro a una funzione, in modo da poter "elegantizzare" il tutto:
[codice]a = leggi_intero()
b = leggi_intero()[/codice]

Se n'e' parlato di recente anche qua: http://www.python-it.org/forum/index.php?topic=9898.0 (c'e' la moda dei triangoli adesso? :P )

Offline CostantinoPanino

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re: "Tipizzare" variabili
« Risposta #4 il: Settembre 30, 2016, 19:41 »
Puoi inserire codice direttamente dentro il forum, cosi' potremo/potrai sempre vederlo anche quando i link esterni scompariranno.
Perfetto, ora edito.

altra cosa: per farla breve.. Non usare MAI eval: http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
e se l'hai letto in qualche libro..riportalo alla libreria o biblioteca o regalalo al tuo caminetto

Se vuoi "sistemare" l'input in ingresso, usa int() attorno ad input(), ed un try/except per catturare eventuali eccezioni e forzare l'utente ad inserire un risultato decente (ps: un ciclo while potrebbe andare bene), mettendo il tutto dentro a una funzione, in modo da poter "elegantizzare" il tutto:
[codice]a = leggi_intero()
b = leggi_intero()[/codice]


Eval lo incontrai su un altro codice qualche tempo fa, mi è tornato in mente e pensavo potesse tornare utile in questo caso. Grazie per la dritta.
Dritte che mi hanno aiutato assai. Ho risolto, grazie mille!
Allego il codice:
[codice]def inp_int():
    while True:
        try:
            num=int(input("Lato: "))
            return num
        except:
            print("Inserisci un intero o un reale")

l1=inp_int()
l2=inp_int()
l3=inp_int()

trng={'l1':l1, 'l2':l2, 'l3':l3}

if (trng['l1']==trng['l2'])and(trng['l2']==trng['l3']):
    print("Il triangolo è equilatero.")
    
elif (trng['l1']==trng['l2'])or(trng['l1']==trng['l3'])or(trng['l2']==trng['l3']):
    print("Il triangolo è isoscele.")

elif (trng['l1']!=trng['l2'])and(trng['l1']!=trng['l3'])and(trng['l2']!=trng['l3']):
    print("Il triangolo è scaleno.")
[/codice]
« Ultima modifica: Settembre 30, 2016, 19:47 da CostantinoPanino »

Offline bebo

  • python erectus
  • ***
  • Post: 241
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re: "Tipizzare" variabili
« Risposta #5 il: Ottobre 01, 2016, 22:11 »
Bene!

Adesso faccio l'azzeccagarbugli  :devil:
C'e' un motivo per cui vuoi utilizzare un dizionario per gestire tre variabili come in questo semplice caso?

Ancora.. non ti basterebbe fare:
[codice]l1 = ...
..
l3 = ..

if l1==l2==l3:
    print "equi"
 
if l1==l2 or l2==l3 or l3==l1:
    print "isoscele"
[/codice]
?


Inoltre (non me ne ero accorto dal codice che avevi postato la prima volta) ma non si usano le parentesi tonde attorno alle condizioni in python: https://docs.python.org/3/reference/compound_stmts.html#if

Ti butto poi un altro po' di idee per migliorare ancora lo script:
  • che ne dici di fare un po' di controllo dell'input? che succede ad es. se inserisco come lati 1, 2, 30000000000 ? che tipo di triangolo e'?
  • che ne dici di estendere il problema anche ai quadrilateri per esempio, semplicemente cambiando la struttura dati, ad esempio usando una lista per gestire i valori in ingresso, dentro alla quale buttare gli input dell'utente (anche qua facendo controllo dell'input, ad esempio fermando l'utente una volta inseriti 4 valori)?

Offline CostantinoPanino

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re: "Tipizzare" variabili
« Risposta #6 il: Ottobre 02, 2016, 20:30 »
Bene!

Adesso faccio l'azzeccagarbugli  :devil:
C'e' un motivo per cui vuoi utilizzare un dizionario per gestire tre variabili come in questo semplice caso?

Ancora.. non ti basterebbe fare:
[codice]l1 = ...
..
l3 = ..

if l1==l2==l3:
    print "equi"
 
if l1==l2 or l2==l3 or l3==l1:
    print "isoscele"
[/codice]
?


Inoltre (non me ne ero accorto dal codice che avevi postato la prima volta) ma non si usano le parentesi tonde attorno alle condizioni in python: https://docs.python.org/3/reference/compound_stmts.html#if

Ti butto poi un altro po' di idee per migliorare ancora lo script:
  • che ne dici di fare un po' di controllo dell'input? che succede ad es. se inserisco come lati 1, 2, 30000000000 ? che tipo di triangolo e'?
  • che ne dici di estendere il problema anche ai quadrilateri per esempio, semplicemente cambiando la struttura dati, ad esempio usando una lista per gestire i valori in ingresso, dentro alla quale buttare gli input dell'utente (anche qua facendo controllo dell'input, ad esempio fermando l'utente una volta inseriti 4 valori)?

Il dizionario l'ho usato di proposito per familiarizzarci.
Sulle parentesi nelle condizioni: le ho messe pensando che, date le più condizoni in un solo if, fossero necessarie per separarli per bene.
Sulle idee:
- è pur sempre un triangolo scaleno, no?  :thinking:
- buona idea, appena lo finisco condivido qua il codice! Edit: in che senso "fermando l'utente"?
« Ultima modifica: Ottobre 02, 2016, 20:43 da CostantinoPanino »

Offline bebo

  • python erectus
  • ***
  • Post: 241
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re: "Tipizzare" variabili
« Risposta #7 il: Ottobre 03, 2016, 01:27 »
  • Prova tu a disegnare un triangolo "che si riesca a chiudere" con dei lati da 1, 2 e 10 :) Proprieta' 4: https://it.wikipedia.org/wiki/Triangolo#Caratteristiche_del_triangolo
  • Nel senso che se non tieni conto del numero di variabili inserite dall'utente, questo potrebbe essere bravo e inserire 3 o 4 dati, ma anche "fregarsene" e inserirne 5 oppure 17.. ma se il tuo programma non e' fatto per i pentagoni o i 17lateri ( :P ) cosa succede? solitamente esplode :) bisogna essere sicuri che il proprio programma sia a prova di utonto..
    per scrivere una cosa del genere ti serve ad occhio un ciclo while, una lista e un if. Sono tre etti..che faccio, lascio? :D

Altra ulteriore idea:
puoi ulteriormente ampliare i dati presentabili all'utente aggiungendo area, lunghezza di altezze, mediane, ecc ..