Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
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


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
Nintendo Switch 2: risultati sotto le at...
Weekend con tante sorprese su Amazon: to...
HONOR non si ferma più: il 2025 &...
Speciale best seller: EUREKA J15 Evo Ult...
Roborock Q10 X5+ da 10.000 Pa a 199€ &eg...
E-mail reset password di Instagram: la c...
La NASA ha discusso le problematiche del...
Il razzo spaziale NASA SLS e la capsula ...
Stazione Spaziale Internazionale: Crew-1...
Samsung Galaxy S26 Ultra: la ricarica de...
Apple ha un nuovo partner per la sua App...
Trenitalia introduce il prezzo dinamico ...
OnePlus non si ferma più: c'&egra...
DAZN sconta il piano Full per 6 mesi, se...
L'uso dell'IA nei giochi è cancer...
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: 10:14.


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