Topic: Un indovinello  (Letto 157 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.062
  • Punti reputazione: 9
    • Mostra profilo
Un indovinello
« il: Giugno 17, 2020, 15:41 »
A proposito di "Python linguaggio difficile da imparare", ecco un piccolo esempio che mi è venuto in mente qualche giorno fa.
Ve lo propongo come indovinello:

In Python 3 "print" è una funzione, giusto?

E allora provate a rispondere rapidamente: che cosa restituisce "print" quando lo chiamo, per esempio, con

>>> print('hello world')
hello world

?

Spiegazione e soluzione:
https://pythoninwindows.blogspot.com/2020/06/un-indovinello-su-print.html

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Un indovinello
« Risposta #1 il: Giugno 18, 2020, 09:10 »
Un'istanza della classe string!!
O meglio, un valore di un'istanza della classe string!

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.062
  • Punti reputazione: 9
    • Mostra profilo
Re:Un indovinello
« Risposta #2 il: Giugno 18, 2020, 10:07 »
Niente affatto! Print non restituisce una stringa... è proprio un'altra cosa...
Mi chiedo quanti si sbaglierebbero... secondo me anche alcuni che insegnano python in certi corsi di informatica...  :devil:

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Un indovinello
« Risposta #3 il: Giugno 18, 2020, 15:12 »
A quando la soluzione?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.062
  • Punti reputazione: 9
    • Mostra profilo
Re:Un indovinello
« Risposta #4 il: Giugno 18, 2020, 15:55 »
è nell'articolo che ho già  linkato sul mio blog:
https://pythoninwindows.blogspot.com/2020/06/un-indovinello-su-print.html

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 258
  • Punti reputazione: 0
    • Mostra profilo
Re:Un indovinello
« Risposta #5 il: Giugno 20, 2020, 08:39 »
Quesito interessante, alcune vicende si danno "per scontate", senza interrogarsi troppo su, di solito ci son mille altre cose da apprendere e capire che distraggono dal fermarsi su faccende che diamo per "scontate".

Niente affatto! Print non restituisce una stringa... è proprio un'altra cosa...

Che le funzioni python restituissero "None" in assenza di un "return" lo avevo letto, diverse volte, anche se non saprei dir di preciso dove, forse anche in post qui e altrove, a parte docs e testi ... certo che la domanda mi ha spiazzato ed ho voluto fare dei piccoli test, prima di leggere il link, questi :

>>> print(print('Salve Mondo!'))
Salve Mondo!
None
>>> type(print('Salve Mondo!'))
Salve Mondo!
<class 'NoneType'>
>>> type(print)
<class 'builtin_function_or_method'>
>>> def non_torno_niente():
pass

>>> print(non_torno_niente())
None
>>> type(non_torno_niente())
<class 'NoneType'>
>>> type(non_torno_niente)
<class 'function'>
>>>

... ed ho voluto cercare in giro cosa fosse l'oggetto "NoneType" di python, solo per aver conferma di ciò che intuivo, cioè che rappresenta un valore nullo nel linguaggio, forse (ma devo tradurmelo) è questa la migliore descrizione che credo di aver trovato.

Interrogativi che spesso non ci poniamo tanto per poco tempo quanto per scarsa curiosità intellettuale ma tutt'altro che banali.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.062
  • Punti reputazione: 9
    • Mostra profilo
Re:Un indovinello
« Risposta #6 il: Giugno 20, 2020, 11:07 »
Sì... in realtà il quesito era più sul capire la differenza tra "side-effect" e "valore di ritorno" di una funzione, specialmente nel caso di "print" dove uno può avere le idee confuse.

Quanto a None, è uno strano animale di suo.
La sostanza da capire è che None è un oggetto ingegnerizzato per essere il *meno informativo* possibile in Python. Non puoi "caricarci dentro" nessuna informazione in nessun modo, oltre al suo unico valore possibile "None" appunto.
Per cominciare, None è un singleton: esiste un solo None in tutto Python, e ogni volta che chiedi "None", hai sempre lo stesso "None":

>>> a = None
>>> b = None
>>> a is b
True

Mentre per esempio, come tutti sanno

>>> a = 10000
>>> b = 10000
>>> a is b
False

Ma c'è una protezione ancora maggiore: il suo tipo, NoneType, esiste ma *non è raggiungibile* da Python perché non sta nei builtin (a differenza, per esempio, di "int" o "list" o tutti gli altri). E per di più *non è sottoclassabile* (a differenza degli altri):

>>> NoneType
NameError: name 'NoneType' is not defined
>>> class foo(type(None)): pass
TypeError: type 'NoneType' is not an acceptable base type

Quindi di fatto None è l'unica istanza in circolazione di NoneType.
Ma c'è una protezione ancora maggiore (!): None ha lo statuto di keyword (cosa stranissima, visto che è un oggetto!), quindi non è possibile sovrascriverlo con un assegnamento:

>>> None = 42
SyntaxError: can't assign to keyword

Ci sono veramente pochissime cose che puoi fare con None. In pratica, l'unica proprietà che ha, oltre al suo valore, è che testa per False:

>>> None is False
True

La cosa che più si avvicina a None sono i booleani True e False: anche questi sono singleton, anche questi sono keyword, anche "bool" non è sottoclassabile. Però almeno True e False sono *due* valori distinti... Inoltre, siccome "bool" deriva da "int", è possibile fare alcune cose in più (anche se non hanno molto senso):

>>> sorted([42, True, -1, False])  # questo con "None" te lo scordi
[-1, False, True, 42]

In pratica None può essere usato solo... per la sua presenza. Segnala un "buco" semantico dove dovrebbe esserci un valore, più o meno come "pass" segnala un buco sintattico dove dovrebbe esserci un'instruzione.
Nel caso da cui siamo partiti, per esempio: una funzione in Python deve *sempre* restituire un valore. Ma che cosa succede quando, semanticamente, non c'è alcun valore da restituire? Tu, al momento di scrivere la funzione, puoi cavartela semplicemente non scrivendo "return": Python te lo consente. Ma dietro le quinte, per rispettare la regola, restituisce comunque la cosa meno informativa possibile, ovvero None, per segnalare appunto che non c'è nessun valore significativo da restituire.