OT Python3

es 1:
def persona(anni):
    if anni < 18:

es 2:
if persona.anni < 18:

nell’esempio 1 la sintassi funziona sia nella versione 2.7 che 3.1
mi chiedevo se in qualche versione di Python il secondo esempio sia valido?

Ciao Salvio

( Vedo che la formattazione funziona. :slight_smile: )

Per quanto ne so (premessa necessaria !), e’ valido se persona e’ un’istanza di una classe, in ogni versione di Python.

Poi l’attributo anni lo puoi creare e settare dentro o fuori dalla classe,
ho provato con alcuni esempi:


class tizio:
  pass

persona = tizio()
setattr( persona, 'anni', 99 )
print( persona.anni )

########

class caio:

  def __init__( self ):
    self.anni = 0

persona = caio()
persona.anni = 99
print( persona.anni )

########

class sempronio:

  def __init__( self, anni ):
    self.anni = anni

persona = sempronio( 99 )
print( persona.anni )

Ad esempio, con le classi di RhinoCommon usiamo regolarmente la notazione col punto del tuo esempio 2.

Ciao !

ciao Emilio

grazie della dritta, adesso la formattazione è :ok_hand:

per quanto riguarda la domanda adesso sono più confuso di prima nel senso, mi è capitato questo esempio:

if persona.anni < 18:
    print("Accesso negato")
    accesso = False
elif persona.anni > 99:
    print("Non è il caso...")
    accesso = False
else:
    accesso = True
    if persona.is_uomo():
        print("Benvenuto")
    else:
        print("Benvenuta")
return accesso

come da esempio sopra, il codice non funziona e quindi, senza sapere la soluzione sono andato a tentativi.

in primis ho iniziato con un “def” per poi aggiungere “class”:

class Prova:
    pass
persona=Prova()
def persona(anni,is_uomo):
    if persona.anni < 18:
        print("Accesso negato")
        accesso = False
    elif persona.anni > 99:
        print("Non è il caso...")
        accesso = False
    else:
        accesso = True
        if persona.is_uomo():
            print("Benvenuto")
        else:
            print("Benvenuta")
    return accesso
    print(persona(50,True))

il codice non dava errori ma non restituiva nulla.

quindi dopo vari tentativi ho trovato questa soluzione ma ho dovuto modificare il codice originario:

def persona(anni,is_uomo):
    if anni < 18:
        print("Accesso negato")
        accesso = False
    elif anni > 99:
        print("Non è il caso...")
        accesso = False
    else:
        accesso = True
    if is_uomo:
        print("Benvenuto")
    else:
        print("Benvenuta")
    return accesso
print(persona(50,True))

ho dovuto togliere (persona.) davanti ad anni e is_uomo poi rientrare (if persona.is_uomo) e così funziona

mentre considerando i tuoi suggerimenti e combinando un pò il tutto:

class Prova:
    def __init__(self,anni,is_uomo):
        self.anni = anni
        self.is_uomo = is_uomo
        
persona = Prova(50,True)

if persona.anni < 18:
    print("Accesso negato")
    accesso = False
elif persona.anni > 99:
    print("Non è il caso...")
    accesso = False
else:
    accesso = True
    if persona.is_uomo:
        print("Benvenuto")
    else:
        print("Benvenuta")
#return accesso

print(accesso)
print(persona.anni)
print(persona.is_uomo)

sono arrivato a questo codice che funziona usando (persona.anni) ma mi da errore con (return accesso)

lo sò ho fatto un macello (come al solito)

fatto sta che alla fine il risultato identico all’esempio non l’ho ottenuto :frowning:

tu mi hai confermato che viene usata la sintassi del mio esempio 2. dov’è che sbaglio?

Salvio, mi sembra di ricordare l’esempio che citi nel libro di Beri.
Puoi mica dirmi dove si trova nel libro, cosi’ questa sera ci do’ un’occhiata, anche per curiosita’ … :wink:

Grazie

certo, si trova sia alla pagina 19

ma anche all’inizio del 5 capitolo

grazie Emilio, gentile come sempre :smile:

mi sa che fai bene, di sicuro ci sarà qualcosa nella sua spiegazione che mi è sfuggito ahahahah

Grazie Salvio.
Indagheremo … :sunglasses:

… sai mai che imparo qualcosa …:confused:

di sicuro da me si può imparare “cosa non fare” ahahahah

parafrasando “Edison - 10.000 medoti che non funzionano”

potrei pubblicare un libro “come non scrivere i codici” :smiley:

Quale macello ?
A me sembra tutto a posto, bravo ! :slight_smile:

return da’ errore perche’ non sei in una funzione.
Se tu inserisci le istruzioni in una funzione, vedi che poi return funziona. :slight_smile:

Mah … ho guardato il libro.
Secondo me il caro Beri stava solo mostrando che aspetto ha il codice Python, con la sua bella indentazione.

( Non mi sembra che il libro parli di un risultato ottenuto con quelle istruzioni … )

A parte il solito proselitismo, quelle istruzioni servono solo a far vedere come va organizzato il codice Python, cioe’ tramite indentazione.

Certo, trattandosi di un libro per principianti, forse si poteva avvisare che il codice mostrato non puo’ essere eseguito cosi’ com’e’ …
O forse, come dici tu, si tratta di un esercizio camuffato … :smile:

… Esercizio che tu hai risolto felicemente … :slight_smile:

Ciao !

grazie Emilio sia per l’interessamento che per la pazienza :slight_smile:

ps dopo una pausa presa oggi pomeriggio adesso ho riaccesso il pc ed ho letto la tua risposta
in effetti si lo avevo capito che il codice che aveva scritto non poteva funzionare cosi com’era
per questo anche senza esperienza avevo azzardato a cercare di trovare una possibile soluzione
alla fine mi ero fermato credendo di aver combinato tutti gli algoritmi possibili ma non era così.

infatti mentre leggevo quello che mi hai scritto mi si è illuminata la lampadina
e la soluzione era più semplice di quanto pensassi, in pratica:
se una mia soluzione funzionava con (persona.anni) e l’altra funzionava con (return accesso)
combinando insieme le due soluzioni si avrà il risultato finale :wink:

soluzione:

class Prova:
    def __init__(self,anni,is_uomo):
        self.anni = anni
        self.is_uomo = is_uomo
        persona = Prova
def persona(anni,is_uomo):
    if anni < 18:
        print("Accesso negato")
        accesso = False
    elif anni > 99:
        print("Non è il caso...")
        accesso = False
    else:
        accesso = True
        if is_uomo:
            print("Benvenuto")
        else:
            print("Benvenuta")
    return accesso
print(persona(50,True))

in questo modo funziona tutto. come credo era l’intenzione di Beri (o spero non si allontani troppo)
ok alla prossima e grazie ancora :+1:

gli occhi sono facili ad essere ingannati:

la soluzione che ho proposto non funziona essendo che ho sbagliato ad incollare il codice della seconda Definizione infatti sia “anni” che “is_uomo” devono essere preceduti da “persona.”

l’euforia mi ha annebbiato la mente cavolo :unamused:

class Class1:
  pass
persona = Class1()
setattr( persona, 'anni', 50 )
setattr( persona, 'is_uomo', True )
def def1():
    if persona.anni < 18:
        print( "Accesso negato" )
        accesso = False
    elif persona.anni > 99:
        print( "Non è il caso..." )
        accesso = False
    else:
        accesso = True
        if persona.is_uomo:
            print( "Benvenuto" )
        else:
            print( "Benvenuta" )
    return accesso
print( def1() )

questa volta credo che è la sintassi giusta
infatti mi funziona sia il “return accesso”
che “persona.anni” e “persona.is_uomo”

quindi @emilio in definitiva la tua prima opzione si collega bene al resto del codice
garzie ancora, anche per la formattazione è una bomba :wink:

ps peccato che nel libro a quanto pare non spiega la differenza tra i vari metodi

Ciao Salvio,

Bravo !
Sei riuscito a replicare le istruzioni che ti incuriosivano … :slight_smile:
Devo ammettere che sei testardo … :smile:

Scusa, cosa intendi ?
Di quali metodi parli ?

Grazie Emilio, i tuoi elogi li apprezzo molto.

ahahahah

beh in effetti la qualità che mi ha sempre permesso di superarmi è proprio la tenacia
io provo a passare avanti, ma se non risolvo gli intoppi non mi sento soddisfatto

ho scritto metodo nel senso tra le 3 scelte che mi hai consigliato (metodo 1 - 2 - 3)

nel cap8 pag106 del libro c’è un esempio della funzione “setattr”
sarà una mia mancanza ma senza il tuo esempio non avrei risolto

in pratica come faccio a sapere quando usare “init” o “setattr”
o altre funzioni per avere un risultato se non conosco le differenze?

Eh … bella domanda … :smile:

Qui parilamo di programmazione a oggetti … che e’ una moda che risale (ho cercato su Wikipedia …:smile: ) alla nascita del C++ nel 1985.
Da allora in poi e’ stato un … diluvio di oggettti :wink:
Certo, questo paradigma di programmazione ( lo chiamano cosi’ … ) puo’ essere utile in quanto facilita l’organizzazione di dati e procedure, nonche’ il loro riutilizzo.
( Ad esempio Rhino e’ scritto in C++ )
Pero’, come gli altri paradigmi precedenti (o successivi, suppongo …) si porta appresso anche una certa ‘filosofia’ su cosa “e’ megilo” o “e’ peggio”.
( Certi programmatori in quanto a guerre di religione non hanno niente da invidiare all’inquisizione … :wink: )
Filosofia che in pratica da’ forma al linguaggio di programmazione stesso, stabilendo quali caratteristiche ha o non ha, e di conseguenza come puo’ essere utilizzato (da te, in questo caso … :slight_smile: )
Se l’argomento (la progrmmazione ad oggetti) ti interessa, credo che se cerchi sul Web troverai molto materiale da leggere,
Ai fini pratici, bisogna cercare di capire cosa ti consente di fare il linguaggio, e come …
Nel tutorial per Python di Van Rossum c’e’ un capito su classi ed oggetti.
Ho provato a cercare la traduzione in itailano, ma … incredibilmente non l’ho trovata …probabilomente sono io che non so cercare.
Intanto ti mando il link al testo originale:

https://docs.python.org/2.0/tut/node11.html

Tornando agli esempi di cui parlavamo, posso solo dirti come il vedo io, che non sono certo la fonte miglore per questo tipo di infiormazioni… la programmazione ad oggetti non mi ha mai convinto gran che, diciamo che non ci ho mai capito gran che …:smile:

Dicevamo:
se usi __init__() , quello che scrivi dentro __init__() vale per tutti gli oggetti della classe,
cioe’ se tu definisci l’attributo ‘anni’ dentro __init__(), ogni oggetto di quella classe che tu costruirai in seguito avra’ il suo bell’attributo ‘anni’ gia’ pronto per l’uso. :slight_smile:
Se invece usi setattr() sull’oggetto ‘persona’ ad esempio, solo quell’oggetto avra’ quell’attributo.
Gil altri oggetti della stessa classe ne saranno privi.

Almeno questo e’ quello che credo di capire io, ma ti consigilo vivamente di provare in pratica, perche’ posso facilmente aver detto grosse cavolate …

Una volta capito come funziona la cosa … sta a te decidere come fare, oppure ti scegil un filosofo (di programmazione) e segui i suoi precetti …:smile:

Ciao !

Ciao Emilio,

grazie per la risposta anche se non è tanto incoraggiante leggere la citazione sopra :slight_smile:
cercando una consolazione come dice il detto: “mal comune mezzo gaudio” ahahahah

grazie anche per il link l’ho memorizzato nei preferiti
ps nel caso ti potrebbe interessare allego un link in italiano
https://www.python.it/doc/Howtothink/Howtothink-html-it/chap14.htm
dove avevo letto qualcosa sulle classi senza capirci gran chè

il tuo link invece mi ha chiarito una situazione che non avevo ancora compreso

>>> class Complex:
...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
... 
>>> x = Complex(3.0,-4.5)
>>> x.r, x.i
(3.0, -4.5)

dove self.r equivale a realpart mentre in tutti gli altri esempi che ho visionato riportano lo stesso nome
tipo come nel libro: (self.proteine = proteine) cosa che secondo me fa confondere chi è alle prime armi.

mentre in quest’altro link (simile a quello che hai postato ma senza le classi)
https://www.python.it/doc/Easytut/easytut-it/easytut-it.html
nel capitolo “Debugging” lo scrittore scrive questa frase:
Una volta ho impiegato un’intera settimana per correggere un bug dovuto allo scambio di una x con una y.

che dire stringiamo i denti e tiriamo avanti, tanto se ci piacevano le cose semplici non eravamo qui :wink:

Grazie ! … E’ quello che non trovavo io … :grinning:

Vero !
Occhio che la stessa cosa spesso si fa anche per i parametri delle funzioni, tipo:

def somma( a, b ):
  return a + b

a = 22
b = 33
print( somma( a, b ) )
# o anche:
print( somma( a = a, b = b ) )

Beh … speriamo che non ci capiti con uno script che ci serve per un lavoro urgente … :rofl:

Hehe … al contrario, io mi faccio gli script proprio per semplificare le cose … :wink:

mi sto meravigliando di come Python permetta che si possa creare questa confusione
mette dei vincoli sull’indentazione tiene conto delle Maiuscole e poi ti fa usare lo stesso nome nei parametri

def somma( a, b ):
  return c + d

c = 22
d = 33

print( somma( c, d ) )
# o anche:
print( somma( a = c, b = d ) )

Emilio ho fatto alcune prove e in questo modo funziona, spero sia la conversione giusta?

chissà @lucio_zadra quante risate si sta facendo leggendo i miei post ahah
disse che era interessato a Python, speravo che si aggregava anche lui :slight_smile:

EDIT:

continuando con il discorso stavo facendo delle prove:

def saluto(par1):
    print('ciao', par1) #x
nome=['tizio','caio','sempronio']
for x in nome:
    saluto(x)
def saluto(par1):
    print('ciao', x) #par1
nome=['tizio','caio','sempronio']
for x in nome:
    saluto(x)

i due codici funzionano entrambi con l’identico risultato
ma come sintassi quale dei due è quella corretta?

Mah … su queste cose ognuno ha la sua idea.
Chi preferisce un linguaggio ‘sbirro’ che decide lui cosa puoi o non puoi fare.
Chi preferisce un linguaggio ‘strumento’, che puoi usare come ti pare e piace.
Io propendo per la seconda …
Come dicevo, diffido delle filosofie di programmazione gia’ cotte e servite … :wink:
( Inoltre non sono una multinazionale con grossi problemi di manutenzione del software … :smile: )

In questo caso, a me sembra utile poter usare lo stesso nome (ma e’ solo il mio parere).
A volte lo faccio, ad esempio quando uso una funzione non per eseguire un’operazione generica (tipo una funzione di libreria), ma per dividere una funzione troppo lunga (secondo me) in 2 o 3 parti.
In questo caso mi sembra comodo conservare lo stesso nome della variabile.

E comunque quando mi sembra il nome piu’ appropriato per il parametro.

Facciamo una prova … virtuale …
Scrivi una funzione (tipo libreria) che poi userai in centinaia di script.
Non ti sembra scomodo ogni volta che usi la funzione doverti preoccupare del nome del parametro da passarle ?
E se tu per caso hai una variabile con lo stesso nome, come fai ?
Cambi nome alla variabile, cosi’ magari ‘cozzi’ con un altro parametro in un’altra funzione …
Oppure devi usare una variabile ausiliaria solo per poter usare la tua funziona di libreria …
O altre cose piuttosto stupide, tipo sommare zero a un numero …
A me sembrerebbe demenziale … :smile:

Un linguaggio di solito non deve servire solo per fare test di 4 o 5 istruzioni, ma deve permetterti di scrivere anche cose piu’ grandi senza troppi problemi.
Poi, certo, ci sono linguaggi adatti soprattutto per brevi script, ma Python non mi risulta che abbia questi limiti.
Anzi, spesso e’ apprezzato proprio perche’ permette di scrivere agevolmente cose piuttosto complesse. :slight_smile:

Se non fossero corrette entrambe, non funzionerebbero … :sunglasses::smile:

Sulla prima niente da dire, passi un parametro e lo usi.

La seconda la scriverei cosi’

def saluto():
    print('ciao', x)
nome=['tizio','caio','sempronio']
for x in nome:
    saluto()

il parametro par1 e’ inutile, non lo usi.
Invece usi la x come variabile globale, cioe’ definita fuori dalla funzione.

Comunque non c’e’ niente di male a scriverla come hai fatto tu, se funziona, e’ OK. :slight_smile:

Python ti permette di usare parametri di funzione o variabili globali.
Scegli tu, caso per caso, cosa preferisci. :slight_smile:

infatti Emilio chiedo e faccio domande proprio per capire il perchè si è scelto di impostare la sintassi di Python in un modo o in un’altro, perchè come giustamente hai detto io che scrivo poche righe di codice è un conto ovviamente non conosco tutte le possibili situazini che si possono incontrare facendo una “programmazione” nel vero senso della parola, ovviamente il discorso li cambia e non di poco.

grazie come sempre adesso mi è più chiara la situazione :+1:

Purtroppo io posso solo dirti come la vedo io da povero scriptomane …
I motivi veri andrebbero chiesti a Van Rossum. :slight_smile:

Comunque anche senza conoscere bene le motivazioni, possiamo divertirci a scriptare sfruttando quello che c’e’ … :grinning:

… Praticamente e’ quello che capita anche con Rhino (almeno per me …). :smile: