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

Do you need help?

Problema nei test con 'r' mode di open() in HW4 rec

AlessandroPy (690 points)
4 12 16
in Avvisi by (690 points)
le funzioni che calcolano le medie sono giuste e passano i test, ma il test mi dice comunque "opening file with mode 'r' is not allowed", ora esiste un altro modo per aprire i file da leggere oppure sto sbagliando qualcos'altro io?
661 views
closed

2 Answers

Best answer
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
selected by
I test permettono di aprire solo i file dei dati indicati dal problema o dai parametri e non altro.
Probabilmente ne apri uno che non dovresti aprire,

BTW, se consegni il codice posso dargli un'occhiata
AlessandroPy (690 points)
4 12 16
by (690 points)
Si ha ragione, "mea culpa" avevo capito male la proprietà della ricorsione.

Ho consegnato il programma (HW4rec) che passa i test delle funzioni scritte se la variabile DEBUG è settata a TRUE nel file test_01.py, se messa a FALSE sbaglia i test con il dbsize=medium e large...
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
Nei test non esistono tabelle con nome italiano. Nello zip probabilmente ci sono dei vecchi file, ma le tabelle e i corrispondenti file json sono solo in inglese.
noemicalandro (8950 points)
0 0 2
by (9.0k points)
ciao, in teoria se devi solo leggerli non serve per forza la mode, basta "with open (file) as f:"
AlessandroPy (690 points)
4 12 16
by (690 points)
reshown by
Ciao, e innanzitutto grazie per la risposta, difatti, ho scritto esattamente così, "with open(file) as f:" in tutte le funzioni, inoltre tutte le funzioni sono ricorsive quindi non dovrebbe neanche esserci il problema del timeout..., e passo 10 test sui 21 totali, unica cosa se eseguo i test con DEBUG = TRUE mi passa 13 test, qualche spiegazione??
G
Gavino_Santu (210 points)
0 0 1
by (210 points)
Cavolo è dura implementare le funzioni di questo esercizio con le ricorsioni.. Io ho usato il più possibile la programmazione funzionale (filter, map, generator, ecc...) e nonostante questo va in timeout. Hai dei consigli da darmi oltre le funzioni  ricorsive? (non sono ancora pratico con la ricorsione)
AlessandroPy (690 points)
4 12 16
by (690 points)
Ciao, io ho optato per la ricorsione in quanto in Python utilizzi meno memoria e di conseguenza il codice gira più velocemente, ti faccio l'esempio: se nel programma devi calcolare una media in funzione di n variabili con x valori, normalmente faresti:

media = sum(x valori,...) / n variabili

solo che così impieghi molto più tempo di esecuzione rispetto a calcolare il risultato passando per una funzione per via delle variabili globali..., se invece il 'calcoletto' che devi fare lo metti dentro una funzione, tutto ciò che ci sarà dentro essa sarà di tipo locale e quindi non verrà preso in memoria da inizio esecuzione del programma ma solo al momento del richiamo della funzione, qui sotto ti ho fatto l'esempio del calcolo della media di prima ma inserito dentro una funzione:

def media(lista_valori, n):

      return sum(lista_valori) / n

Infine tornando alla tua domanda, per questi generi di programmi, dove si accede a DB di diverse dimensioni, ti consiglio di usare, quando possibile, funzioni ricorsive in modo da far girare il tutto in modo piu fluido, veloce e sicuro, senza appesantire troppo il tutto, sennò quando capitano tanti dati da processare va in timeout.
G
Gavino_Santu (210 points)
0 0 1
by (210 points)
L'esempio che hai posto non ha a che fare con la ricorsione o sbaglio? (giusto per capire)
AlessandroPy (690 points)
4 12 16
by (690 points)
Se applicato dentro gli HW lo è, in quanto si dice funzione ricorsiva quella funzione che viene richiamata all'interno di un'altra funzione, quindi nel caso sopra di def media(), se per una delle funzioni da fare nell'HW, ti serve calcolare la media di qualcosa, verrà così:

def media_studente(...):

      ...

      def media(lista_valori, n):

             return sum(lista_valori) / n

      return media(...)

Potrei sbagliarmi eh, ma credo che vista la logica Pythoniana, anche quando chiami dentro una tua funzione def() una built-in function tipo: "list()", "range()", "sum()", "len()",... stai facendo una ricorsione...
G
Gavino_Santu (210 points)
0 0 1
by (210 points)
Ma considerando che la media è un calcolo che deve essere effettuato all' interno di 3 funzioni diverse, non mi conviene definire la funzione media(lista_valori, n) esternamente? Per poi chiamarla quando mi serve definendola una volta sola? Grazie per l'aiuto comunque.
AlessandroPy (690 points)
4 12 16
by (690 points)

Sarebbe Top come cosa, ma non credo sia permesso negli Homework in quanto bisogna definire tutto dentro le funzioni predisposte nel file.py, C'è scritto nelle regole:

  • ATTENZIONE: SONO VIETATE le variabili globali.

quindi tutto cio che sta fuori dalla funzione/i dell'esercizio non dovrebbe essere ammesso,  è una mia interpretazione..., difatti in ogni HW c'è scritto:

  • l'esercizio consiste nel realizzare, se necessario definendo funzioni ausiliarie, la funzione descritta all'inizio del file, completandone il codice
spero di esserti stato di aiuto collega

 

G
Gavino_Santu (210 points)
0 0 1
by (210 points)

No infatti io intendo utilizzare funzioni ausiliarie, esattamente come c'è scritto, senza variabili globali. Se non erro i valori di ritorno passati tramite funzioni non sono variabili globali.

Implemento in questo modo (evito di scrivere codice per ovvie ragioni):

def media(lista_valori):

    ...
    return <valore>

def media_studente(stud_code, dbsize):
    ...
    return media(<lista_valori>)

Comunque sia va ancora in timeout, ma gli altri test li supera tutti senza problemi. Ho sempre fatto con funzioni esterne ausiliarie e se non sbaglio il prof ha espressamente detto che si può fare in una lezione. Smentitemi se sbaglio.

Comunque si sei stato di aiuto grazie   wink

AlessandroPy (690 points)
4 12 16
by (690 points)
Allora apposto, grazie anche a te, non avevo capito si potessero implementare funzioni esterne alle funzioni dell'HW..., Anche tu hai problemi con la funzione "with open()" per caricare i file ?
G
Gavino_Santu (210 points)
0 0 1
by (210 points)
No penso di avere pèroblemi solo con i timeout, ma alla fine ho capito che non dipende dalla media, bensì da due for annidati che ho implementato all'interno di una funzione che non so proprio come evitarli.

Però in passato ho avuto problemi simili sempre con with open() ma con la modalità 'w+'. Ho risolto utilizzando 'w' soltanto. Nel tuo caso non saprei...
AlessandroPy (690 points)
4 12 16
by (690 points)
credo di aver capito di quali for annidate parli, prova a vedere se i for loop in questa maniera ti risolvono il problema del timeout:

invece di fare la for così -->  for el in lista:

                                                   x = el[...]

fai così --> x = [el[...] for el in lista], se ti serve mettere una condizione per il riempimento della lista, puoi metterla alla fine --> x = [el[...] for el in lista if el[...] > 10]

spero di essere stato utile :)
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
La ricorsione c'è quando una funzione richiama se stessa (direttamente o indierettamente).

Gli esempi sopra non lo sono
G
Gavino_Santu (210 points)
0 0 1
by (210 points)
Si parli delle list comprhension, e ho già provato ad implementarle. Purtroppo oltre a non risolvere il problema  viene una riga lunghissima e illeggibile. Grazie lo stesso.