Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

Problema testo a capo con il comando Print

Auron (15880 points)
51 126 194
in Programmare in Python by (15.9k points)
recategorized by
Ho iniziato ieri il corso di Fondamenti di Programmazione, ho scaricato Anaconda ed installato il tutto... Volevo iniziare ad esercitarmi definendo una funzione che converta un qualsiasi numero decimale in binario. Tutto perfetto al di fuori del fatto che, come da titolo, utilizzando il comando

Print (variabile),

in un ciclo While, non mi viene restituito un output mantenendo la stessa riga, ma questo viene diviso su tante righe quante sono le cifre del numero binario risultante... Suggerimenti?
2.8k views
closed

3 Answers

Best answer
andrea.sterbini (207940 points)
756 1270 2377
by (208k points)
selected by
In python 3 la funzione print accetta il parametro opzionale 'end' che indica cosa aggiungere in fondo (per default un accapo) , quindi se vuoi stampare senza accapo puoi usare

print( testo, end='')

che stampa il testo seguito da stringa vuota
Auron (15880 points)
51 126 194
by (15.9k points)
Grazie mille professore!
Denis (2230 points)
4 13 23
by (2.2k points)
Non mi è chiaro se il risultato ti viene stampato N volte, o questo viene suddiviso in N righe (es: 101,101,101 o 1,0,1 quando immagino che il risultato che tu vuoi ottenere sia 101)

Se l'ipotesi è la prima, ragiona sulla condizione del ciclo while, probabilmente questo non è nemmeno necessario.

Se invece l'ipotesi è la seconda verifica che il tuo programma non stampi nulla prima di aver calcolare l'INTERO numero binario. Invece di stamparlo, dovresti accumularlo (stringa = stringa + dato) e stamparlo alla fine.
Auron (15880 points)
51 126 194
by (15.9k points)
Era la seconda ipotesi e mi hai risolto il problema (ho dovuto anche rendere in formato stringa la variabile numerica altrimenti non me la accumulava nella variabile stringa, come era giusto che fosse)... Mi si è presentato un altro problema al riguardo... In questo modo ottengo una variabile che contiene un valore scritto "al contrario", per esempio con il numero 50 mi viene restituito 010011 invece di 110010... Come posso passare da un risultato ad un altro? C'è un modo per assegnare un valore ad un'altra variabile partendo dalla destra della prima e andando verso sinistra?
Denis (2230 points)
4 13 23
by (2.2k points)
reshown by
Sinceramente non so se esiste una funzione che ti "giri" (passami il termine) la stringa al contrario.  Però potresti implementarlo tu, con un ciclo for che parte da 1 fino al len(stringa) in cui dentro popoli una nuova variabile stringa dall'ultimo elemento al primo.
Devi considerare la stringa come una lista di caratteri, non mi dilungo oltre altrimenti ti tolgo il divertimento!
Auron (15880 points)
51 126 194
by (15.9k points)
Ho risolto la questione come descritto nel commento alla risposta di Riccardo, successiva alla tua... Ma mi interessa questo fatto di partire dall'ultimo elemento di una stringa al primo... Non mi preoccupo di costruire un algoritmo, ma piuttosto della mia ignoranza nella conoscenza dei comandi... In VIsual Basic il comando adatto era Right(Stringa, numero di caratteri a cui arrivare partendo da destra)... Qual è il comando corrispondente in Python?
Denis (2230 points)
4 13 23
by (2.2k points)
La tua risoluzione è sicuramente più efficiente di calcolare un risultato e poi ribaltarlo.
Mi cogli comunque impreparato sulla sintassi Phython.... da una breve ricerca secondo stack overflow basta digitare stringa [-N] per ottene gli ultimi N caratteri, ma non so se ciò è valido con la nostra versione,  e soprattutto non so se valido in generale perchè non l'ho testato
Auron (15880 points)
51 126 194
by (15.9k points)
Ti ringrazio, tra il tuo suggerimento e un po' di mio acume ho risolto... A chi fosse interessato, la soluzione al mio problema è questa:

stringa [-N:len(stringa)]
daniele.gargano (1200 points)
3 7 16
by (1.2k points)
La funzione della quale parlate si chiama "slice", ed è una funzione peculiare di Python.

Lo "slicing" può essere effettuato su qualsiasi elemento Iterabile (Array, Stringhe, Tuple ecc...) e restituisce una "parte" (al più tutto) dell'oggetto di partenza.
La sintassi è la seguente: object[start:stop:step], dove "start" indica l'indice dal quale iniziare lo slice (indice incluso), "stop" indica l'indice dove terminare lo slice (indice escluso. L'ultimo elemento preso sarà dunque indice-1) e "step" indica gli eventuali salti di indice tra un elemento e l'altro (di default step vale 1, e vengono presi dunque tutti gli elementi tra start e stop-1. In caso fosse 2, verrebbe preso un elemento si e uno no.).

Alcuni parametri possono essere omessi o (come ha già sottolineato Denis) negativi, alterando il risultato. Nello specifico:
- Omettendo "start" lo slice inizia dall'indice 0 (analogamente omettendo lo "stop" lo slice termina all'ultimo elemento)
- Omettendo lo "step" si utilizza il default step 1, prendendo di conseguenza tutti gli elementi tra lo start e lo stop
- Dando uno "start" negativo lo slice inizierà da N elementi prima della fine dell'elemento iterabile (analogamente dando uno "stop" negativo lo slice terminerà N elementi prima della fine)
- Dando un "step" negativo "l'estrazione" (non è una vera e propria estrazione in quanto l'oggetto di partenza non viene toccato, al contrario di funzioni come "pop" o "del") avverrà in ordine inverso.

Solitamente quando si deve "ribaltare" un'iterabile il metodo più semplice è dunque utilizzare uno step negativo:
object[::-1]

Vi consiglio di "giocare" un po' con la funzione slice osservando come cambia il risultato a seconda degli indici che si inseriscono, in quanto è veramente una funzione importantissima!
Potete trovare la documentazione ufficiale di questa e altre "built-in functions" qui: https://docs.python.org/3/library/functions.html#slice
Denis (2230 points)
4 13 23
by (2.2k points)
Interessante soprattutto il fatto che questi 'slice' (di cui ammetto non aver mai sentito parlare) si possano usare non solo per le stringhe (nella mia testa l'avevo già infatti collegato ai classici mid, substr e compagni vari), grazie del chiarimento.
R
RiccardoMariotti (1250 points)
4 9 19
by (1.3k points)
reshown by
Se separi le variabili del comando print con un "+" (senza virgolette) il tuo output sarà l'unione delle tue variabili scritte una dopo l'altra sulla stessa riga.

Sono abbastanza nuovo nell'ambito della programmazione, non sono sicuro che questo è ciò che stai cercando.
Auron (15880 points)
51 126 194
by (15.9k points)
Sì, avevo già seguito le istruzioni di Denis e avevo capito il senso... Purtroppo vengo da programmazione in Visual Basic, quindi devo entrare un attimo nell'ottica di Python... Comunque, per chi fosse interessato, ho risolto il problema dell'inversione scambiando di posto le variabile che si sommano nella variabile stringa "accumulativa"... ho posto quindi Stringa = variabile + stringa
francesco.dev (33560 points)
22 51 129
by (33.6k points)
Ciao RiccardoMariotti!
Vorrei aggiungere una cosa alla tua risposta:

L'operatore "+" viene usato quando semplicemente vogliamo concatenare (o accostare) vari elementi presenti in qualsiasi funzione, in questo caso la print.
Invece l'operatore "," può essere adoperato per poter accostare più elementi presenti all'interno della print mettendo tra questi uno spazio!

Quindi, scrivendo "cane"+"gatto" all'interno della print vedremo come output del programma "canegatto"
Invece, scrivendo "cane","gatto" all'interno della print vedremo come output del programma "cane gatto"