• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
è cui argomenti c funzione con una nei

[Risolto] funzione nei cui argomenti c'è una funzione con argomenti
#1
Carissimi,

ho scritto il seguente codice

Codice:
def stampa(x,y):
    print("sto eseguendo la funzione con argomenti che scrive x e y")
    print(x, y)

def funzioneNoArgomenti():
    print("sto eseguendo la funzione senza argomenti")
    print(x, y)


   

#***************** e s e g u e  u n a  f u n z i o n e  a  d e t e r m i n a t i  m i n u t i  d e l l ' o r a *****************


#provo a fare una funzione che a determinati minuti dell'ora fa un'azione
#si possono scegliere fino a 4 minuti diversi dell'ora. Nel caso ci serve un minuto specifico inseriamo 4 volte lo stesso argomento nella funzione

def do4min(minA, minB, minC, minD, funzione):#possiamo impostare 4 minuti dell'ora in cui può succedere qualcosa
    import datetime
    now=datetime.datetime.now()# chiedo che ora è
    print (now)
    print (type(now))

    minuti=now.strftime('%M')#chiedo in questo momento in che minuti dell'ora siamo
    print (minuti)
    print (type(minuti)) #me lo restituisce in stringhe
   
    if minuti==minA or minuti==minB or minuti==minC or minuti==minD:
        print("Visto che siamo ai minuti giusti eseguo la funzione indicata come 5° argomento")
        funzione()
    else:
        print("Non siamo ancora ai minuti dell'ora giusti non eseguo la funzione")

do4min("00", "01","02", "03", stampa(25, 58))
do4min("00", "01","02", "03", funzioneNoArgomenti)

in pratica controlla se il momento attuale è al minuto "00", "01","02", "03" dell'ora e se sì esegue una funzione.
Ma se la funzione che lancia non ha argomenti (come nel caso della funzione "funzioneNoArgomenti") effettivamente se non è al momento giusto non esegue la funzione. Mentre nel caso che la funzione abbia argomenti come nel caso stampa la funzione viene eseguita sempre anche se non siamo ai minuti  "00", "01","02", "03" .

Avete qualche suggerimento?

Grazie per l'attenzione

Saluti LaPa
With a little/big help from my friends Rolleyes
Risposta
#2
Non ho ben capito che vuoi fare, ma probabilmente è sufficiente cambiare
Codice:
do4min("00", "01","02", "03", stampa(25, 58))

con

Codice:
do4min("00", "01","02", "03", stampa,25, 58)


Mi permetto di suggerire l'utilizzo della libreria esterna schedule per questo tipo di esecuzioni in base al tempo:

dopo averla installata con
Codice:
pip install schedule
(o con il menu strumenti-gestisci i pacchetti di Thonny) ecco un esempio di script
Codice:
import schedule, time

def stampa(x,y):
    print("sto eseguendo la funzione con argomenti che scrive x e y")
    print(x, y)

def funzioneNoArgomenti():
    print("sto eseguendo la funzione senza argomenti")
    print(1, 2)

schedule.every().hour.at(":00").do(funzioneNoArgomenti)
schedule.every().hour.at(":01").do(stampa,5,22)
schedule.every().hour.at(":02").do(stampa,1,14)
schedule.every().hour.at(":03").do(funzioneNoArgomenti)

while True:
    schedule.run_pending()
    time.sleep(1)
Risposta
#3
Grazie Zzed,

non conoscevo il modulo schedule, in effetti tentavo, maldestramente, di sostituirlo con codice autoprodotto.

Detto questo la soluzione da te suggerita l'ho provata e purtroppo non funziona.

[quote="Zzed" pid='30849' dateline='1676244066']
Non ho ben capito che vuoi fare, ma probabilmente è sufficiente cambiare
Codice:
do4min("00", "01","02", "03", stampa(25, 58))

con

Codice:
do4min("00", "01","02", "03", stampa,25, 58)

Infatti i numeri dopo la funzione stampa non vengono interpretati come argomenti di stampa ma come ulteriori argomenti di do4min.

Se ci sono altri suggerimenti .....

Grazie per l'attenzione

Saluti

LaPa
With a little/big help from my friends Rolleyes
Risposta
#4
Non è molto chiaro cosa tu voglia fare. In sintesi, se ho interpretato il codice e quanto esplicitato, vorresti stampare dei dati (o altre azioni) a determinati minuti (nell'arco di ciascuna ora) anche non successivi/conseguenti, impostati come argomenti della funzione (es.:" def do4min(minA, minB, minC, minD, funzione):" dove A, B, C, D potrebbero essere casualmente (ovvero da un input) 1, 8, 20, 45. Alla verifica dei minuti, se non vi sono dei valori da stampare dalla funzione chiamata, nulla viene fatto. Nel caso in cui vi sono dei dati da stampare anche al di fuori dei minuti impostati, deve essere comunque chiamata la funzione di stampa dati (o qualunque azione). Corretto?
Quali sono gli input e come vengono inseriti?
Risposta
#5
prova però l'esempio che ti ho postato. Come quasi sempre faccio, prima di rispondere l oho testato, e funziona.
Risposta
#6
(14/02/2023, 23:34)Zzed Ha scritto: prova però l'esempio che ti ho postato. Come quasi sempre faccio, prima di rispondere l oho testato, e funziona.

Salve,
mi scuso per il ritardo della mia risposta.

Mi scuso con Zzed in effetti il suo codice funziona. 

Codice:
def stampa(x,y):
    print("sto eseguendo la funzione che scrive x e y")
    print(x, y)
    print("sto eseguendo la funzione che scrive il prodotto tra x e y che è = ",x*y)
def funzioneNoArg():
    print("sto eseguendo la funzione che non ha argomenti")


#***************** e s e g u e  u n a  f u n z i o n e  a  d e t e r m i n a t i  m i n u t i  d e l l ' o r a *****************


#provo a fare una funzione che a determinati minuti dell'ora fa un'azione
#si possono scegliere fino a 4 minuti diversi dell'ora. Nel caso ci serve un minuto specifico inseriamo 4 volte lo stesso argomento nella funzione

def do4min(minA, minB, minC, minD, funzione, arg1, arg2):#possiamo impostare 4 minuti dell'ora in cui può succedere qualcosa
    import datetime
    now=datetime.datetime.now()# chiedo che ora è
    print (now)
    print (type(now))

    minuti=now.strftime('%M')#chiedo in questo momento in che minuti dell'ora siamo
    print (minuti)
    print (type(minuti)) #me lo restituisce in stringhe
   
    if minuti==minA or minuti==minB or minuti==minC or minuti==minD:
        print("Visto che siamo ai minuti giusti eseguo la funzione indicata come terzo argomento")
        funzione(arg1, arg2)
       
    else:
        print("Non siamo ancora ai minuti dell'ora giusti non eseguo la funzione")


do4min(52", "53", "54", "55", stampa, 37, 97)


Se lancio il codice in uno dei 4 minuti, "52", "53", "54", "55", dell'ora Funziona!

Però io non so se la funzione da lanciare in quei minuti non ha argomenti, ne ha 2 o più di 2.

Il codice di sopra funziona solo se la funzione richiamata ha 2 argomenti o parametri.

Infatti se lancio in quei minuti la funzione senza argomenti

Codice:
do4min(52", "53", "54", "55", funzioneNoArg,)


ricevo un traceback
Codice:
Traceback (most recent call last):
  File "/usr/lib/python3.8/idlelib/run.py", line 559, in runcode
    exec(code, self.locals)
  File "/home/pasquale/Documenti/RPi/plant+out/AlPostoDiCrontabZzed.py", line 88, in <module>
    do4min("18", "19", "20", "21", funzioneNoArg)
TypeError: do4min() missing 2 required positional arguments: 'arg1' and 'arg2'

lo stesso succede se lancio
Codice:
do4min("18", "19", "20", "21", funzioneNoArg, None, None).

Tuttavia penso di avere risolto il problema utilizzando nella funzione al posto degli argomenti questa sintassi "*param"

il mio script diventa quindi:

Codice:
def stampa(x,y):
    print("sto eseguendo la funzione che scrive x e y")
    print(x, y)
    print("sto eseguendo la funzione che scrive il prodotto tra x e y che è = ",x*y)
def funzioneNoArg():
    print("sto eseguendo la funzione che non ha argomenti")


#***************** e s e g u e  u n a  f u n z i o n e  a  d e t e r m i n a t i  m i n u t i  d e l l ' o r a *****************


def do4min(minA, minB, minC, minD, funzione, *param):#possiamo impostare 4 minuti dell'ora in cui può succedere qualcosa
    import datetime
    now=datetime.datetime.now()# chiedo che ora è
    print (now)
    print (type(now))

    minuti=now.strftime('%M')#chiedo in questo momento in che minuti dell'ora siamo
    print (minuti)
    print (type(minuti)) #me lo restituisce in stringhe
   
    if minuti==minA or minuti==minB or minuti==minC or minuti==minD:
        print("Visto che siamo ai minuti giusti eseguo la funzione indicata come terzo argomento")
        funzione(*param)
       
    else:
        print("Non siamo ancora ai minuti dell'ora giusti non eseguo la funzione")

pertanto sembra essere ok sia se la funzione che lancio, a determinati minuti, non ha argomenti o ne ha 2 o più di 2.

Codice:
do4min("48", "49", "50", "51", funzioneNoArg)
do4min("48", "49", "50", "51", stampa, 37, 97)




Grazie per l'attenzione

Saluti

LaPa
With a little/big help from my friends Rolleyes
Risposta
  


Vai al forum:


Navigazione: 1 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect