Topic: Livello di indentazione di blocchi if-else  (Letto 83 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline rai

  • python unicellularis
  • *
  • Post: 11
  • Punti reputazione: 0
    • Mostra profilo
Livello di indentazione di blocchi if-else
« il: Novembre 03, 2019, 17:06 »
Un saluto a tutt*
A partire da questa pagina di cui riproduco due funzioni

import itertools
import random

def attempt_board(m=3):
    """Make one attempt to generate a filled m**2 x m**2 Sudoku board,
    returning the board if successful, or None if not.

    """
    n = m**2
    numbers = list(range(1, n + 1))
    board = [[None for _ in range(n)] for _ in range(n)]
    for i, j in itertools.product(range(n), repeat=2):
        i0, j0 = i - i % m, j - j % m # origin of mxm block
        random.shuffle(numbers)
        for x in numbers:
            if (x not in board[i]                     # row
                and all(row[j] != x for row in board) # column
                and all(x not in row[j0:j0+m]         # block
                        for row in board[i0:i])):
                board[i][j] = x
                break
        else: # XXX
            return None
    return board
   

def make_board(m=3):
    """Return a random filled m**2 x m**2 Sudoku board."""
    n = m**2
    board = [[None for _ in range(n)] for _ in range(n)]

    def search(c=0):
        "Recursively search for a solution starting at position c."
        i, j = divmod(c, n)
        i0, j0 = i - i % m, j - j % m # Origin of mxm block
        numbers = list(range(1, n + 1))
        random.shuffle(numbers)
        for x in numbers:
            if (x not in board[i]                     # row
                and all(row[j] != x for row in board) # column
                and all(x not in row[j0:j0+m]         # block
                        for row in board[i0:i])):
                board[i][j] = x
                if c + 1 >= n**2 or search(c + 1):
                    return board
        else: # XXX
            board[i][j] = None
            return None
    return search()

   
vorrei capire la regola per la de-indentazione dell'else rispetto al costrutto if-else di cui fa parte. Non sono stato capace di trovare la relativa pagina di documentazione ufficiale
Grazie per l'attenzione.

Offline nuzzopippo

  • python habilis
  • **
  • Post: 90
  • Punti reputazione: 0
    • Mostra profilo
Re:Livello di indentazione di blocchi if-else
« Risposta #1 il: Novembre 04, 2019, 09:33 »
Un saluto a tutt*
...
vorrei capire la regola per la de-indentazione dell'else rispetto al costrutto if-else di cui fa parte. Non sono stato capace di trovare la relativa pagina di documentazione ufficiale
Grazie per l'attenzione.

Ciao @rai

per la domanda, mi sembra ovvio che è proprio il livello di identazione/de-identazione a stabilire di "cosa" faccia parte il costrutto else.

Nel caso specifico del codice proposto, il costrutto "else" non fa parte di una struttura if-else, bensì di un costrutto "for-else" e l'else viene eseguito alla fine del ciclo for, a meno che non intervenga una istruzione "break" che interrompa il ciclo. Ciò a meno che io non abbia preso cantonate (sono molto ignorante, in inglese particolarmente)

ho pensato un po' a come esemplificare la cosa ... un po' lunghetto ma guarda questo codice, vale mille parole:

>>> report = {}
>>> numeri = range(11)
>>> inp = input('Numero? ("A" per annullare) : ')
Numero? ("A" per annullare) : 3
>>> while inp != 'A':
try:
imm = int(inp)
inseriti.append(imm)
except ValueError:
pass
inp = input('Numero? ("A" per annullare) : ')


Numero? ("A" per annullare) : 12
Numero? ("A" per annullare) : 4
Numero? ("A" per annullare) : A
>>> inseriti
[3, 12, 4]
>>> for n in inseriti:
lst = []
for num in numeri:
if num == n:
lst.append('trovato')
if n % 2:
lst.append('dispari')
else:
lst.append('pari')
break
else:
lst.append("NON c'è")
report[str(n)] = lst


>>> for key in report.keys():
print(key, ' : ', report[key])


3  :  ['trovato', 'dispari']
12  :  ["NON c'è"]
4  :  ['trovato', 'pari']
>>>


Come vedi, ho costruito due cicli for per valutare la presenza delle immissioni in un range numerico definito, quando l'immissione esiste nel range il ciclo viene interrotto e lo "else" corrispondente al ciclo for non eseguito, diverso accade in caso non sia presente.
Ho cercato di evidenziare l'importanza della identazione con un secondo "else" presente nel ciclo di decisione se un numero è pari o dispari ... spero che ciò chiarisca quanto richiesto.

La ricerca da effettuarsi e su "for-else", trovato per Te questo tip

Offline rai

  • python unicellularis
  • *
  • Post: 11
  • Punti reputazione: 0
    • Mostra profilo
Re:Livello di indentazione di blocchi if-else
« Risposta #2 il: Novembre 10, 2019, 10:12 »
Ciao @nuzzopippo
Citazione
mi sembra ovvio che è proprio il livello di identazione/de-identazione a stabilire di "cosa" faccia parte il costrutto else.
non ricordo di aver mai utilizzato il for ... else la cui esistenza quindi era finita in un buco nero della memoria
grazie