Topic: Aiuto cicli  (Letto 1900 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Aiuto cicli
« Risposta #30 il: Novembre 17, 2013, 16:17 »
Questa versione è dedicata a voi che mi avete aiutato!

 :)

Però se lo eseguO nella shell sia rimpicciolita si ingrandita non ci sono problemi e siccome ho fatto copia ed incolla del disegno in notepad poi gli ho aggiunto gli '1' per fare l'esempio allora è saltato l'ordine :D

Si, è corretto, sono io che non lo avevo provato da terminale.

grazie per il link al tuo bellissimo blog (inserito nei preferiti) e devo dire che spieghi anche in una maniera meravigliosa;

Troppo buono, grazie!  :embarrassed:

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #31 il: Novembre 17, 2013, 20:43 »
Dopo aver letto la tua lezione sul blog e dopo aver provato varie situzioni
ecco il codice con la formattazione con l'operatore %:

[codice]

def stampa(n):
    for x in range(1, n+1):
        for y in range(1, 11):
            if y in (1, 10) or x in(1, n):
                print ('%3s\t' % (x*y,)),
            else:
                print '\t',
        print

acquisizione_numero = input('INSERIRE NUMERO: ')
print

stampa(acquisizione_numero)
[/codice]

ora se inserisco 20 per esempio, l'ultima riga con 0 è perfettamente in linea con quello sopra. :D

ah poi ho capito anche che avevo problemi con le virgole [codice]che servono per continuare la stampa sulla stessa riga[/codice] dopo un po' di prove ho capito che
erano da spostare come puoi vedere dalla riga print che effettua il calcolo.

OT: spero che ne scriverai altre di lezioni :D
« Ultima modifica: Novembre 17, 2013, 20:45 da spiritoserio »

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Aiuto cicli
« Risposta #32 il: Novembre 17, 2013, 21:56 »
Citazione da: spiritoserio
ecco il codice con la formattazione con l'operatore %:

Nota che con la formattazione di stringa non hai stretta necessità di usare \t che allinea ogni 8 spazi, perché hai il controllo completo sulla lunghezza/occupazione delle singole stringhe (ricordando che la virgola finale di print aggiunge un ulteriore spazio):

[codice]
def stampa(num_righe):
    for riga in range(1, num_righe+1):
        for colonna in range(1, 11):
            if colonna in (1, 10) or riga in(1, num_righe):
                print '%3s' % (riga*colonna,),  # <--- 3 + 1 caratteri
            else:
                print '   ',    # <--- 3 + 1 spazi
        print

stampa(10)
[/codice]

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #33 il: Novembre 17, 2013, 22:13 »
Citazione da: spiritoserio
ecco il codice con la formattazione con l'operatore %:

Nota che con la formattazione di stringa non hai stretta necessità di usare     che allinea ogni 8 spazi, perché hai il controllo completo sulla lunghezza/occupazione delle singole stringhe (ricordando che la virgola finale di print aggiunge un ulteriore spazio):

[codice]
def stampa(num_righe):
    for riga in range(1, num_righe+1):
        for colonna in range(1, 11):
            if colonna in (1, 10) or riga in(1, num_righe):
                print '%3s' % (riga*colonna,),  # <--- 3 + 1 caratteri
            else:
                print '   ',    # <--- 3 + 1 spazi
        print

stampa(10)
[/codice]

versione 2.0 :D (sicuramente migliorabile)

[codice]
def stampa(num_righe):
    for riga in range(1, num_righe+1):
        for colonna in range(1, 11):
            if colonna in (1, 10) or riga in(1, num_righe):
                print ('%3s' % (riga*colonna,)),
            if colonna == 2 and riga == 2:
                print ('%3s' % (riga*colonna,)),
            if colonna == 3 and riga == 3:
                print ('%3s' % (riga*colonna,)),
            if colonna == 4 and riga == 4:
                print ('%3s' % (riga*colonna,)),
            if colonna == 5 and riga == 5:
                print ('%3s' % (riga*colonna,)),
            if colonna == 6 and riga == 6:
                print ('%3s' % (riga*colonna,)),
            if colonna == 7 and riga == 7:
                print ('%3s' % (riga*colonna,)),
            if colonna == 8 and riga == 8:
                print ('%3s' % (riga*colonna,)),
            if colonna == 9 and riga == 9:
                print ('%3s\t' % (riga*colonna,)),
            else:
                print '\t',
           
        print
[/codice]

Nota: se togli gli ultimi due TAB come dici tu che dovrebbe gestire tutto la formattazione(GIUSTAMENTE) però in realtà in pratica non funziona e vorrei capire perchè...
se tolgo gli ultimi due TAB mi salta tutto l'ordine mentre cosi funziona una meraviglia.

Accetto idee per capire come dimezzare il codice .
Per ora il codice funziona fino a 10 sto ragionando su come fargli prendere il numero di righe :D
« Ultima modifica: Novembre 17, 2013, 22:35 da spiritoserio »

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Aiuto cicli
« Risposta #34 il: Novembre 17, 2013, 22:39 »
Nota che con la formattazione di stringa non hai stretta necessità di usare     che allinea ogni 8 spazi, perché hai il controllo completo sulla lunghezza/occupazione delle singole stringhe (ricordando che la virgola finale di print aggiunge un ulteriore spazio):

Aggiungo: il controllo con la formattazione di stringa arriva al punto che puoi anche non indicare a priori quanto spazio serve per allineare correttamente tutti i numeri al crescere della cifre.
Lo fai calcolare al programma, così:
[codice]def stampa(num_righe):
    spazio = len(str(num_righe*10))  # Calcola quanto spazio occupa la cifra piu' grande, per esempio 1000 sono 4 cifre.
    for riga in range(1, num_righe+1):
        for colonna in range(1, 11):
            if colonna in (1, 10) or riga in(1, num_righe):
                # Non viene indicato esplicitamente quanto spazio occupa la stringa,
                # si usa l'asterisco al suo posto ed il valore effettivo e' nella variabile spazio calcolata a runtime.
                print "%*s" % (spazio, riga * colonna),  
            else:
                print  "%*s" % (spazio, ""),
        print

stampa(10)
[/codice]
La cosa è ancora più generale: tutti i valori per la formattazione di stringa che non conosci puoi sostituirli con un asterisco,
nelle parentesi tonde dopo l'ultimo simbolo di percentuale, metti tante variabili quanti sono gli asterischi.

A runtime ogni asterisco sarà sostituito nello stesso ordine dal valore della corrispondente variabile.
« Ultima modifica: Novembre 17, 2013, 23:09 da Giornale di Sistema »

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #35 il: Novembre 17, 2013, 22:43 »
Citazione da: spiritoserio
ecco il codice con la formattazione con l'operatore %:

Nota che con la formattazione di stringa non hai stretta necessità di usare     che allinea ogni 8 spazi, perché hai il controllo completo sulla lunghezza/occupazione delle singole stringhe (ricordando che la virgola finale di print aggiunge un ulteriore spazio):

[codice]
def stampa(num_righe):
    for riga in range(1, num_righe+1):
        for colonna in range(1, 11):
            if colonna in (1, 10) or riga in(1, num_righe):
                print '%3s' % (riga*colonna,),  # <--- 3 + 1 caratteri
            else:
                print '   ',    # <--- 3 + 1 spazi
        print

stampa(10)
[/codice]

il tuo codice funziona con la formattazione il mio invece se tolgo i tab non funziona come dovrebbe :D

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #36 il: Novembre 17, 2013, 22:47 »
Nota che con la formattazione di stringa non hai stretta necessità di usare     che allinea ogni 8 spazi, perché hai il controllo completo sulla lunghezza/occupazione delle singole stringhe (ricordando che la virgola finale di print aggiunge un ulteriore spazio):

Aggiungo: il controllo con la formattazione di stringa arriva al punto che puoi anche non indicare a priori quanto spazio serve per allineare correttamente tutti i numeri al crescere della cifre.
Lo fai calcolare al programma, così:
[codice]def stampa(num_righe):
    spazio = len(str(num_righe*10))  # Calcola quanto spazio occupa la cifra piu' grande, per esempio 1000 sono 4 cifre
    for riga in range(1, num_righe+1):
        for colonna in range(1, 11):
            if colonna in (1, 10) or riga in(1, num_righe):
                # Non viene indicato esplicitamente quanto spazio occupa la stringa,
                # si usa l'asterisco al suo posto ed il valore effettivo e' nella variabile spazio calcolata a runtime.
                print "%*s" % (spazio, riga * colonna),  
            else:
                print  "%*s" % (spazio, ""),
        print

stampa(10)
[/codice]
La cosa è ancora più generale: tutti i valori per la formattazione di stringa che non conosci puoi sostituirli con un asterisco,
nelle parentesi tonde dopo l'ultimo simbolo di percentuale, metti tante variabili quanti sono gli asterischi.

A runtime ogni asterisco sarà sostituito nello stesso ordine dal corrispondente valore della variabile.
grazie , avevo letto dell'asterisco ma credevo di far diventare la cosa troppo complessa.
invece col tuo esempio tutto è piu chiaro.

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Aiuto cicli
« Risposta #37 il: Novembre 17, 2013, 22:47 »
OT: spero che ne scriverai altre di lezioni :D

Ci sto lavorando, insieme ad un altro grosso progetto. Staremo a vedere come va a finire.  :angel:

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Aiuto cicli
« Risposta #38 il: Novembre 17, 2013, 23:05 »
Citazione da: spiritoserio
se tolgo gli ultimi due TAB mi salta tutto l'ordine mentre cosi funziona una meraviglia.
Gli if che hai scritto non sono esclusivi, ma vengono controllati tutti, in particolare l'ultimo fallisce ogni volta che colonna e riga non valgono 9, quindi ad ogni print viene anche eseguito quel ramo else che aggiunge un \t a quanto stampato finora. L'unico caso in cui quel ramo non viene eseguito è quando riga e colonna valgono 9, ecco perchè per non scombinare il tutto hai dovuto aggiungere un \t anche nel ramo if dell'ultimo controllo.

Citazione
Accetto idee per capire come dimezzare il codice .
Controlli se riga vale 2 e colonna vale 2, poi se riga vale 3 e colonna vale 3 e cosi' via, non è più semplice controllare solo se colonna è uguale a riga? ;)

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #39 il: Novembre 17, 2013, 23:16 »
Citazione da: spiritoserio
se tolgo gli ultimi due TAB mi salta tutto l'ordine mentre cosi funziona una meraviglia.
Gli if che hai scritto non sono esclusivi, ma vengono controllati tutti, in particolare l'ultimo fallisce ogni volta che colonna e riga non valgono 9, quindi ad ogni print viene anche eseguito quel ramo else che aggiunge un     a quanto stampato finora. L'unico caso in cui quel ramo non viene eseguito è quando riga e colonna valgono 9, ecco perchè per non scombinare il tutto hai dovuto aggiungere un     anche nel ramo if dell'ultimo controllo.

Citazione
Accetto idee per capire come dimezzare il codice .
Controlli se riga vale 2 e colonna vale 2, poi se riga vale 3 e colonna vale 3 e cosi' via, non è più semplice controllare solo se colonna è uguale a riga? ;)

Provo a seguire la tua dritta! Grazie  :confused: :D

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #40 il: Novembre 17, 2013, 23:29 »

[codice]Codice completo[/codice]

[codice]
def stampa(num_righe):
    spazio = len(str(num_righe*10))
    for riga in range(1, num_righe+1):
        for colonna in range(1, 11):
            if colonna in (1, 10) or riga in(1, num_righe):
                print '%*s' % (spazio, riga*colonna),
            elif colonna == riga:
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
          
        print

acquisizione_numero = input('INSERIRE NUMERO: ')
print

stampa(acquisizione_numero)
[/codice]

[codice]
print 'grazie!!' * 1000
[/codice]

mi stampa solo fino a 9 se metto 20 si ferma a 9 :(
« Ultima modifica: Novembre 17, 2013, 23:37 da spiritoserio »

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Aiuto cicli
« Risposta #41 il: Novembre 17, 2013, 23:35 »
penso di essere arrivato alla perfezione (grazie a voi) di cio' che avevo chiesto all'inizio.

Versione 2.0 terminata!  :party:
È tempo di una versione 3.0 che preveda quanto dicevi prima:

Per ora il codice funziona fino a 10 sto ragionando su come fargli prendere il numero di righe :D

In realtà anche il numero di colonne, così sarebbe totalmente a discrezione dell'utente decidere cosa stampare

Edit:

mi stampa solo fino a 9 se metto 20 si ferma a 9 :(

È normale, la diagonale completa la puoi vedere solo se si tratta di un quadrato, quindi 10x10, 20x20, ma non 20x10.

Un altra cosa: se stai usando Python 2.x, al posto di input() usa raw_imput().
Quest'ultimo restituisce una stringa, per convertirla in numero int(raw_imput())

input() non fa quello che pensi tu in Python 2.x.
Va usato invece in Python 3.x dove fa quello che immagini.

Edit2: e quando ti occuperai di avere anche più di 10 colonne (la versione 3.0),
attenzione anche alla variabile spazio dove il moltiplicatore non è più fisso a 10, ma appunto varia del numero di colonne che stabilisci.

Edit3: rieditato ulteriormente parte del messaggio, meglio rileggerlo tutto.  ;)
« Ultima modifica: Novembre 18, 2013, 00:08 da Giornale di Sistema »

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #42 il: Novembre 17, 2013, 23:38 »
penso di essere arrivato alla perfezione (grazie a voi) di cio' che avevo chiesto all'inizio.

Versione 2.0 terminata!  :party:
È tempo di una versione 3.0 che preveda quanto dicevi prima:

Per ora il codice funziona fino a 10 sto ragionando su come fargli prendere il numero di righe :D

In realtà di colonne, ma ci siamo capiti.
ho modificato il post perchè mi sono reso conto che non ci siamo ancora aahahahahah
ma so che ci sono vicino :D

avevo gia festeggiato uhmmmmmm

ci rimetto mano :D

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #43 il: Novembre 17, 2013, 23:51 »
penso di essere arrivato alla perfezione (grazie a voi) di cio' che avevo chiesto all'inizio.

Versione 2.0 terminata!  :party:
È tempo di una versione 3.0 che preveda quanto dicevi prima:

Per ora il codice funziona fino a 10 sto ragionando su come fargli prendere il numero di righe :D

In realtà di colonne, ma ci siamo capiti.

Edit:

mi stampa solo fino a 9 se metto 20 si ferma a 9 :(

A riga 5 con quell'if hai impostato che fosse così.
Sono condizioni da ripensare un po' perché così come sono non "scalano" bene su valori maggiori di 10.

Un altra cosa: se stai usando Python 2.x, al posto di input() usa raw_imput().
Quest'ultimo restituisce una stringa, per convertirla in numero int(raw_imput())

input() non fa quello che pensi tu in Python 2.x.
Va usato invece in Python 3.x dove fa quello che immagini.

Grazie Paolo ho fatto un po' di prove ma non sono riuscito per ora a iterare fino a num_righe :(

Sarà il compito di domani , per il dopo lavoro ehheheehhe
ebbene si ora sara' meglio andare a dormire domani mattina il dovere chiama.

Grazie per me oggi è stata una meravigliosa lezione.
 buona notte a te e Claudio.

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Aiuto cicli
« Risposta #44 il: Novembre 17, 2013, 23:54 »
buona notte a te e Claudio.

notte...  :sleepy: