Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-12-2008, 02:42   #1
~FullSyst3m~
Senior Member
 
L'Avatar di ~FullSyst3m~
 
Iscritto dal: Mar 2007
Messaggi: 4683
[Python] Liste linkata

Come ho già detto in altre occasioni ultimamente il libro sul quale sto studianto è drasticamente calato dal punto di vista qualità e correttezza di informazione, sto passando più tempo a correggere gli errori e a capire che cosa vuole dire il libro, che a studiare.

Paragrafo 17.7:

Quote:
Cosa succede se invochi questo metodo e passi una lista composta da un solo elemento (elemento singolo)? Cosa succede se passi come argomento una lista vuota? C'è una precondizione per questo metodo? Se esiste riscrivi il metodo per gestire gli eventuali problemi.
Il metodo è il seguente:
Codice:
def RimuoviNodo(Lista):
    if Lista == None: return
    Secondo = Lista.ProssimoNodo
    # Il primo nodo deve riferirsi al terzo
    Lista.ProssimoNodo = Secondo.ProssimoNodo
    # Separa il secondo nodo dal resto della lista
    Secondo.ProssimoNodo = None
    return Secondo
E questa è la classe Nodo, le varie assegnazioni e chiamate:

Codice:
class Nodo:
    def __init__(self, Contenuto=None, ProssimoNodo=None):
        self.Contenuto = Contenuto
        self.ProssimoNodo = ProssimoNodo

    def __str__(self):
        return str(self.Contenuto)
    
    def StampaLista(Nodo):
        Lista = []
        while Nodo:
            Lista.append(Nodo.Contenuto)
            Nodo = Nodo.ProssimoNodo
        print Lista

Nodo1 = Nodo(1)
Nodo2 = Nodo(2)
Nodo3 = Nodo(3)

Nodo1.ProssimoNodo = Nodo2
Nodo2.ProssimoNodo = Nodo3

StampaLista(Nodo1)
Rimosso = RimuoviNodo(Nodo1)
StampaLista(Rimosso)
StampaLista(Nodo1)
Io ho provato a lasciare il Nodo1 soltanto e ho tolto Nodo1.ProssimoNodo e Nodo2.ProssimoNodo. Nonostante ci sia il controllo iniziale, il controllo viene bypassato e ovviamente mi viene restituito l'errore che None non ha un attributo ProssimoNodo. Poi ho modificato Nodo1 in Nodo1 = Nodo() cosi da provare il secondo caso che ha detto il libro e ottengo anche qua lo stesso errore.
Premesso tutto questo, non capisco perchè dovrei riscrivere il metodo (come dice il libro) visto che quando viene spiegata la precondizione c'è messo chiaramente che in questi casi viene usata per imporre una limitazione ai parametri, infatti nel codice successivo non c'è nessuna correzione per gestire gli eventuali problemi.
Potrei usare un try/except magari, ma il punto non è questo. Spero si sia capito cosa voglio dire.
Dopo che ho riavviato non dà più l'errore di prima(solo con la funzione RimuoviNodo ovviamente dà errore), però il controllo non viene eseguito lo stesso perchè anche se il nodo che passo vale None viene stampato il valore (None), e per stamparlo dovrebbe entrare nell'if, che però ha come condizione != da None, quindi non dovrebbe essere eseguito. Mi riferisco a questo:

Codice:
def StampaInversa(Nodo):
        if Nodo == None: return
        StampaInversa(Nodo.ProssimoNodo)
        print Nodo,

def StampaInversaFormato(Lista):
    print "[",
    if Lista != None:
        Coda = Lista.ProssimoNodo
        StampaInversa(Coda)
        print Lista,
    print "]",

Nodo1 = Nodo()
StampaInversa(Nodo1)
StampaInversaFormato(Nodo1)
Output:

Codice:
None [ None ]
Ma indovinate un pò? Dopo aver modificato il codice come scriverò tra poco sotto non mi stampa più None perchè ora il controllo viene eseguito e funziona. L'unica soluzione che mi viene in mente è che possa essere un problema di IDE (sono sul portatile e uso PyScripter).

Infine, sempre tratto dal libro:

Quote:
Creiamo innanzitutto una nuova classe chiamata ListaLinkata. I suoi attributi sono un intero che contiene la lunghezza della lista e il riferimento al primo nodo. Gli oggetti ListaLinkata ci serviranno per gestire liste di oggetti Nodo:

Codice:
class ListaLinkata:
  def __init__(self) :
    self.Lunghezza = 0
    self.Testa = None
Una cosa positiva per quanto concerne la classe ListaLinkata è che fornisce un posto naturale dove inserire funzioni contenitore quale StampaInversaFormato e che possiamo far diventare metodi della classe:

Codice:
class ListaLinkata:
  ...
  def StampaInversa(self):
    print "[",
    if self.Testa != None:
      self.Testa.StampaInversa()
    print "]",

class Nodo:
  ...
  def StampaInversa(self):
    if self.ProssimoNodo != None:
      Coda = self.ProssimoNodo
      Coda.StampaInversa()
    print self.Contenuto,
Per rendere le cose più interessanti, rinominiamo StampaInversaFormato. Ora abbiamo due metodi chiamati StampaInversa: quello nella classe Nodo che è l'aiutante e quello nella classe ListaLinkata che è il contenitore. Quando il metodo contenitore invoca self.Testa.StampaInversa sta in effetti invocando l'aiutante dato che self.Testa è un oggetto di tipo Nodo
Dove lo vede l'oggetto di tipo Nodo?
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito.
~FullSyst3m~ è offline   Rispondi citando il messaggio o parte di esso
Old 16-12-2008, 12:09   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
Codice:
def RimuoviNodo(Lista):
    if Lista == None: return
    Secondo = Lista.ProssimoNodo
    # Il primo nodo deve riferirsi al terzo
    Lista.ProssimoNodo = Secondo.ProssimoNodo
    # Separa il secondo nodo dal resto della lista
    Secondo.ProssimoNodo = None
    return Secondo
Usando Lista.ProssimoNodo = Secondo.ProssimoNodo stai effettivamente dicendo: Lista.ProssimoNodo = Lista.ProssimoNodo.ProssimoNodo. Tu ti stai assicurando che Lista non sia None, ma chi ti dice che non lo sia anche Lista.ProssimoNodo? È per questo che con un solo nodo ti dava un errore perché provavi ad accedere ad un oggetto di tipo None, anche con quel controllo iniziale.

Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
Premesso tutto questo, non capisco perchè dovrei riscrivere il metodo (come dice il libro) visto che quando viene spiegata la precondizione c'è messo chiaramente che in questi casi viene usata per imporre una limitazione ai parametri, infatti nel codice successivo non c'è nessuna correzione per gestire gli eventuali problemi.
Potrei usare un try/except magari, ma il punto non è questo. Spero si sia capito cosa voglio dire.
In realtà no, non ho capito.

Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
però il controllo non viene eseguito lo stesso perchè anche se il nodo che passo vale None viene stampato il valore (None), e per stamparlo dovrebbe entrare nell'if, che però ha come condizione != da None, quindi non dovrebbe essere eseguito. Mi riferisco a questo:

Codice:
def StampaInversa(Nodo):
        if Nodo == None: return
        StampaInversa(Nodo.ProssimoNodo)
        print Nodo,

def StampaInversaFormato(Lista):
    print "[",
    if Lista != None:
        Coda = Lista.ProssimoNodo
        StampaInversa(Coda)
        print Lista,
    print "]",

Nodo1 = Nodo()
StampaInversa(Nodo1)
StampaInversaFormato(Nodo1)
Output:

Codice:
None [ None ]
Stai sempre attento a ciò che fai, il risultato è perfettamente corretto: solo che non te ne sei accorto.
Guarda:
Codice:
class Nodo:
    def __init__(self, Contenuto=None, ProssimoNodo=None):
        self.Contenuto = Contenuto
        self.ProssimoNodo = ProssimoNodo

    def __str__(self):
        return str(self.Contenuto)
Quando chiedi la stampa di un nodo lui ti restituisce come stringa da stampare la conversione in stringa del suo contenuto. Dal canto suo, il contenuto è inizializzato solo nel costruttore, e di default è impostato a None. Quando quel codice di prima attraversa la lista, trova che c'è effettivamente un nodo da stampare, e prova a stamparne il contenuto... che però è None (dal momento che a Nodo1 è stato assegnato un oggetto Node() senza un contenuto specifico, che quindi di default è None). In definitiva, ciò che viene stampato è:
Codice:
print str(None),
Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
Dove lo vede l'oggetto di tipo Nodo?
La classe ListaLinkata evidentemente aggiunge man mano oggetti di tipo Nodo a self.Testa quando tu le chiedi l'inserimento di un nuovo elemento. Così, quando vai a stampare tutto funziona come previsto (ad ogni nodo incontrato, l'oggetto di tipo ListaLinkata dice al nodo di stamparsi).
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!

Ultima modifica di DanieleC88 : 16-12-2008 alle 12:11.
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 16-12-2008, 13:17   #3
~FullSyst3m~
Senior Member
 
L'Avatar di ~FullSyst3m~
 
Iscritto dal: Mar 2007
Messaggi: 4683
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Usando Lista.ProssimoNodo = Secondo.ProssimoNodo stai effettivamente dicendo: Lista.ProssimoNodo = Lista.ProssimoNodo.ProssimoNodo. Tu ti stai assicurando che Lista non sia None, ma chi ti dice che non lo sia anche Lista.ProssimoNodo? È per questo che con un solo nodo ti dava un errore perché provavi ad accedere ad un oggetto di tipo None, anche con quel controllo iniziale.
Che significa Lista.ProssimoNodo.ProssimoNodo? Comunque questo, come ho già scritto, è normale che dà l'errore se passo ad esempio solo Nodo(1)
Quote:
In realtà no, non ho capito.
In poche parole gli errori che mi davano le funzioni StampaInversa e StampaInversaFormato dopo che ho riavviato non me li dava più nè con la lista vuota nè con un nodo singolo


Quote:
Stai sempre attento a ciò che fai, il risultato è perfettamente corretto: solo che non te ne sei accorto.
Guarda:
Codice:
class Nodo:
    def __init__(self, Contenuto=None, ProssimoNodo=None):
        self.Contenuto = Contenuto
        self.ProssimoNodo = ProssimoNodo

    def __str__(self):
        return str(self.Contenuto)
Quando chiedi la stampa di un nodo lui ti restituisce come stringa da stampare la conversione in stringa del suo contenuto. Dal canto suo, il contenuto è inizializzato solo nel costruttore, e di default è impostato a None. Quando quel codice di prima attraversa la lista, trova che c'è effettivamente un nodo da stampare, e prova a stamparne il contenuto... che però è None (dal momento che a Nodo1 è stato assegnato un oggetto Node() senza un contenuto specifico, che quindi di default è None). In definitiva, ciò che viene stampato è:
Codice:
print str(None),
Fattostà che sempre dopo il famoso riavvio non c'è più traccia di nessun None

Quote:
La classe ListaLinkata evidentemente aggiunge man mano oggetti di tipo Nodo a self.Testa quando tu le chiedi l'inserimento di un nuovo elemento. Così, quando vai a stampare tutto funziona come previsto (ad ogni nodo incontrato, l'oggetto di tipo ListaLinkata dice al nodo di stamparsi).
E' vero, pensavo che il metodo per aggiungere un nodo era nella classe Nodo. Mi sta dando non pochi problemi sto libro ultimamente
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito.

Ultima modifica di ~FullSyst3m~ : 16-12-2008 alle 15:01.
~FullSyst3m~ è offline   Rispondi citando il messaggio o parte di esso
Old 16-12-2008, 14:32   #4
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
Che significa Lista.ProssimoNodo.ProssimoNodo?
È l'oggetto puntato dal campo ProssimoNodo dell'oggetto puntato dal campo ProssimoNodo dell'oggetto Lista. Detto così sembra una cosa contorta, prova a farti un piccolo disegno su carta dei collegamenti tra gli oggetti e lo capirai in un batter d'occhio.
Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
E' vero, pensavo che il metodo per aggiungere un nodo era nella classe Nodo. Mi sta dando non pochi problemi sto libro ultimamente
Non è il libro, sono i concetti che sono un po' più complessi. Devi imparare a "pensare ad oggetti".
Se invece della classe ListaLinkata (che colleziona oggetti Nodo) ci fosse stata una classe GenereUmano (che colleziona oggetti EssereUmano), quale delle due avrebbe dovuto gestire l'aggiunta di un nuovo essere umano? GenereUmano o EssereUmano?

Per quanto riguarda poi il fatto del riavvio, io escluderei una possibilità del genere, non si hanno risultati casuali su diverse esecuzioni dello stesso codice quando questo riceve gli stessi input ed esegue le stesse istruzioni. Penso quindi che ti sia sfuggito qualche dettaglio che modificava l'esecuzione prima di riavviare l'IDE, mi sembra l'unica possibilità.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 16-12-2008, 14:57   #5
~FullSyst3m~
Senior Member
 
L'Avatar di ~FullSyst3m~
 
Iscritto dal: Mar 2007
Messaggi: 4683
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
È l'oggetto puntato dal campo ProssimoNodo dell'oggetto puntato dal campo ProssimoNodo dell'oggetto Lista. Detto così sembra una cosa contorta, prova a farti un piccolo disegno su carta dei collegamenti tra gli oggetti e lo capirai in un batter d'occhio.

Non è il libro, sono i concetti che sono un po' più complessi. Devi imparare a "pensare ad oggetti".
Se invece della classe ListaLinkata (che colleziona oggetti Nodo) ci fosse stata una classe GenereUmano (che colleziona oggetti EssereUmano), quale delle due avrebbe dovuto gestire l'aggiunta di un nuovo essere umano? GenereUmano o EssereUmano?

Per quanto riguarda poi il fatto del riavvio, io escluderei una possibilità del genere, non si hanno risultati casuali su diverse esecuzioni dello stesso codice quando questo riceve gli stessi input ed esegue le stesse istruzioni. Penso quindi che ti sia sfuggito qualche dettaglio che modificava l'esecuzione prima di riavviare l'IDE, mi sembra l'unica possibilità.
Forse la stai contorcendo senza motivo la spiegazione. Io la vedo più semplice di come la dici tu.

Per quanto riguarda il libro io non ho detto che credevo che il metodo doveva andare nella classe Nodo, ma che avevo letto male io sul libro. In ogni caso il libro in questi ultimi capitoli ha un sacco di errori

E per il riavvio è cosi, ho salvato, riavviato e poi niente più errori. Io credo sia un problema di IDE che alle volte non salva le modifiche e continua ad eseguire il codice precedente
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito.

Ultima modifica di ~FullSyst3m~ : 16-12-2008 alle 15:00.
~FullSyst3m~ è offline   Rispondi citando il messaggio o parte di esso
Old 16-12-2008, 15:12   #6
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
Forse la stai contorcendo senza motivo la spiegazione. Io la vedo più semplice di come la dici tu.
Ok, allora come la vedi?
Non ho contorto niente più del necessario, ho solo spiegato a cosa tentasse di accedere il codice. Va bene vederla semplice, ma non la devi vedere nel modo scorretto, altrimenti non cogli l'errore.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 16-12-2008, 19:08   #7
~FullSyst3m~
Senior Member
 
L'Avatar di ~FullSyst3m~
 
Iscritto dal: Mar 2007
Messaggi: 4683
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Ok, allora come la vedi?
Non ho contorto niente più del necessario, ho solo spiegato a cosa tentasse di accedere il codice. Va bene vederla semplice, ma non la devi vedere nel modo scorretto, altrimenti non cogli l'errore.
Certamente, ma avevo capito a cosa accedeva il codice. Non era quella l'incertezza

In ogni caso ho dedicato il pomeriggio solo alle liste linkate, ho fatto qualche prova e con i miei strumenti ultra tecnologici (carta e penna) mi sono tolto tutti i dubbi
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito.
~FullSyst3m~ è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Il nuovo OnePlus Nord 6 è vicino al debu...
Tesla svela i risultati del Q4: conferma...
Nuova rimodulazione da Fastweb: fino a 3...
La NVIDIA RTX 5090 potrebbe presto costa...
ASUS non produrrà più smar...
CoopVoce sta per lanciare il 5G: ecco qu...
Factorial, azienda di batterie allo stat...
Le specifiche fuori di testa della Yangw...
I numeri incredibili di Xiaomi: nel 2025...
In Cina è pronto il parco fotovol...
Neuralink accelera: produzione di massa ...
Starlink abbassa l'orbita di migliaia di...
Dal MIT una nuova batteria per auto elet...
Adam Mosseri parla di IA su Instagram: l...
Suonerie personalizzate e Tone Store: il...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v