Corso di Python - Novembre 2016

Caricate le nuove slide

Esercizio 2.1

import random
a = []
for x in range(10):
    a.append(random.randint(1, 100))
a.sort()
for i in range(10):
    if i==0:
        print("Il numero più basso è", a[i])
    elif i==9:
        print("infine il numero più alto è", a[i], ".")
    else:
        print("poi viene", a[i])
print("Fine.")

Esercizio 2.2

import random

mess = ["Per quanto posso vedere, sì", "È certo", "È \
decisamente così", "Molto probabilmente", "Le \
prospettive sono buone", "I segni indicano di sì", "Senza alcun \
dubbio", "Sì", "Sì, senza dubbio", "Ci puoi contare", "È \
difficile rispondere, prova di nuovo", "Rifai la domanda più \
tardi", "Meglio non risponderti adesso", "Non posso predirlo \
ora", "Concentrati e rifai la domanda", "Non ci contare", "La \
mia risposta è no", "Le mie fonti dicono di no", "Le \
prospettive non sono buone", "Molto incerto"]

# Giacchè si tratta di una VERA Magic8Ball, sa già la risposta
# prima ancora di porre la domanda
i = random.randint(0, 19)

input("Pensa intensamente ad una domanda e premi <INVIO>")
print("Il responso della Magica Palla 8 è...")
print(mess[i])

Esercizio 2.3

import random

lives = 3
resp = random.randint(0, 99)
while lives > 0:
    print("Indovina il numero tra 0 e 99 che ho pensato:")
    user = int(input())
    if user == resp:
        print("Grandioso! Sei un veggente migliore persino della Magica Palla 8!")
        break
    else:
        lives -= 1
        print("Peccato, non è il numero che avevo pensato.")
print("Hai terminato il gioco con", lives, "vite disponibili.")

Esercizi testati e funzionanti! :+1:

2 Mi Piace

Esercizio 3.1

import os

percorso = input('Inserisci un percorso da controllare sul disco: ')
if os.path.isdir(percorso):
    listafiles = os.listdir(path=percorso)
    for x in listafiles:
        print(x)
else:
    print('Percorso non valido.')

Esercizio testato e funzionante.

ottimo :slight_smile:

eh, 'nsomma…
ecco quel che ho fatto col secondo

import os
import re

trovato = []
#lo script si trova nella cartella superiore a ./dati
percorso = './dati'
lista = os.listdir(path=percorso)
for elem in lista:
        perc = percorso + '/' + elem
    	load = os.open(perc, 'r')
    	for linea in load:
    		if re.search('str', linea):
    			trovato.append(elem)
    	os.close(load)
    print('Sono stati trovati {} files contenenti la stringa "str" e sono stati rinominati come segue:'.format(len(trovato)))
    for i in trovato:
    	os.rename(trovato[i], 'trovato_' + i)
    	print('trovato_' + i)

Ora… il problema è che ricevo errore direttamente alla riga 9, per intendersi al comando open: sostiene che si aspetta un int e non uno str… Io ho ricontrollato più e più volte e non capisco perché mi dice così…

os.open non è open !
verifica con l’help:
help(os.open)
help(open)

1 Mi Piace

Sono uno str…
Ok… ecco la versione riveduta, corretta e funzionante:
import os
import re

trovato = []
percorso = './dati'
lista = os.listdir(path=percorso)
for elem in lista:
	load = open(percorso + '/' + elem, 'r')
	for linea in load:
		if re.search('str', linea):
			trovato.append(elem)
	load.close()
print('Sono stati trovati {} files contenenti la stringa "str" e sono stati rinominati come segue:'.format(len(trovato)))
for i in range(len(trovato)):
	os.rename(percorso + '/' + trovato[i], percorso + '/' + 'trovato_' + str(i))
	print('trovato_' + str(i))

P.S.: Avevo creato una lista perché, non avendo inizialmente letto lo script creami.py, avevo ipotizzato che potessi essere stato abbastanza canaglia da mettere più di un file con la stringa in questione… :innocent:

… e questo è il mio “David”… la mia “Gioconda”…
L’esercizio 3.3!

import os
import re

lista = []

while True:
	os.system('clear')
	print('1 - Inserisci nuovi contatti in rubrica')
	print('2 - Visualizza i contatti')
	print('3 - Cancella un contatto')
	print('4 - Salva su file')
	print('5 - Carica file')
	print('6 - Esci')
	print()
	menu1 = int(input())
	
	if menu1 == 1:
		os.system('clear')
		cog = input('Cognome: ')
		nom = input('Nome: ')
		tel = input('Numero di telefono: ')
		lista.append({'cognome': cog, 'nome': nom, 'telefono': tel})

	elif menu1 == 2:
		os.system('clear')
		print('Cognome\tNome\tTelefono')
		for elem1 in lista:
			stringa1 = elem1['cognome'] + '\t' + elem1['nome'] + '\t' + elem1['telefono']
			print(stringa1)
		input('Premi un tasto per continuare...')

	elif menu1 == 3:
		os.system('clear')
		print('Inserisci la posizione del contatto da cancellare ({}-{})'.format(1, len(lista)))
		menu2 = int(input())
		print('Sei sicuro di voler eliminare', lista[menu2-1]['cognome'], lista[menu2-1]['nome'], '? (y/N)')
		menu3 = input()
		if menu3 == 'y' or 'Y':
			lista.pop(menu2-1)

	elif menu1 == 4:
		os.system('clear')
		name1 = input('Inserisci il nome del file: ')
		s = open(name1, 'w')
		for elem2 in lista:
			stringa2 = elem2['cognome'] + '\t' + elem2['nome'] + '\t' + elem2['telefono'] + '\n'
			s.write(stringa2)
		s.close()
		print('Salvataggio avvenuto con successo.')
		input('Premi un tasto per continuare...')

	elif menu1 == 5:
		os.system('clear')
		lista = []
		lista_file = []
		elenco = os.listdir('.')
		for i in elenco:
			if re.search('.rub', i):
				lista_file.append(i)
		print('Questi sono i file rubrica presenti nella cartella:')
		for i_file in lista_file:
			print(i_file)
		print()
		name2 = input('Inserisci il nome del file: ')
		l = open(name2, 'r')
		for linea in l:
			linea = linea.rstrip()
			dati = linea.split('\t')
			D = dict(zip(['cognome', 'nome', 'telefono'], dati))
			lista.append(D)
		l.close()
		print('Caricamento avvenuto con successo.')
		input('Premi un tasto per continuare...')

	elif menu1 == 6:
		os.system('clear')
		exit(0)

	else:
		input('Comando non riconosciuto. Premere un tasto per continuare...')

Devo imparare a mollare prima di fare queste ore IMPOSSIBILI… :flushed:

Timida richiesta per stasera: si potrebbe toccare anche lo statement with che ho trovato in molti esempi “googlati”?

A stasera (se sopravvivo…)!

Una maniera più efficace di percorso + '/' + elem di creare percorsi è usare os.path.join, che è in grado di operare in maniera consistente su diversi sistemi, ed anche se il percorso è complesso e contiene diversi .. o /.

1 Mi Piace

questo non lo conoscevo :slight_smile:
comunque nessun problema per il with se porti il codice di qualche esempio lo analizziamo!

sono contento del tuo tentativo di usare le regexp, ma questo funziona solo per fortuna, non perché fa quello che realmente pensi! ricordami dopo che dico due parole :wink:

Scusate stasera non posso passare impegni al lavoro

@Christian
Sono andato a cercare una spiegazione più sostanziosa su cosa sia un wrapper esattamente:
l’idea è che io ho un oggetto, ad esempio “file”, questo oggetto è comodo perché mi permette di scrivere e leggere sul file ma non fa tante altre cose, come ad esempio verificare i permessi di scrittura. Allora cosa faccio? costruisco un nuovo oggetto che è in relazione al precedente come " has a " ovvero il nuovo oggetto (che chiameremo wrapper per comodità) contiene a sua volta un oggetto tipo file. Adesso, aggiungendo metodi all’oggetto wrapper, possiamo aumentare l’interfaccia del vecchio oggetto e poi delego all’oggetto contenuto (file in questo caso) le cose che sa già fare.

Esempio di open:
open non è un wrapper ma può esserlo, mi spiego meglio (la cosa non è proprio entry level)
se apriamo con open un file binario

open (path, ‘b’)

ci viene ritornato un oggetto tipo io.io.BufferedIOBase o similari che non è un wrapper e che analizzeremo dopo. (in realtà bufferedIObase non è banale ma facciamo la facile per capirci, se sei curioso tutti i dettagli sono nella documentazione)

se apriamo un file di tipo testo invece

open(path, ‘rw’)

ci viene tornato un io.TextIOWrapper che è un wrapper come suggerisce il nome. Ovvero è un oggetto che contiene al suo interno un altro oggetto e ne estende le funzioni. Nella docuementazione possiamo vedere qual’è l’oggetto contenuto: BufferedIOBase. Quindi TextIOWrapper estende le funizioni di BufferedIOBase che funziona solo in binario aggiungendo tutta la logica necessaria a gestire il testo.

Qua finisce la risposta alla domanda, ma se sei curioso, oltre alla relazione “has a” fra gli oggetti esiste anche la relazione “is a” e le due cose non sono esclusive.
Per capirci TextIOWrapper “is a” TextIOBase ovvero: impara tutto quello che c’è da sapere da TextIOBase. Banalemente leggere una riga fino al carattere \n.

1 Mi Piace

Grazie della dritta!

In effetti, nell’eventualità di un prossimo corso di 2° livello, suggerirei di sviscerare un paio di librerie funzione per funzione: giusto quelle “di base” tipo appunto OS. E magari vedere nel dettaglio i metodi utilizzabili dai tipi built-in.:pray:

Io nel frattempo mi dedico alla lettura delle references, ma devo ammettere che faccio un po’ di fatica a leggere documentazione tecnica in lingua inglese; vederle insieme in aula, con la possibilità di soffermarsi su esempi pratici, è decisamente più immediato ed efficace.:yum:

Ecco, allora parliamo del corso di secondo livello, ci ho lavorato un po’ questa settimana e ho visto che il libro ripiega su argomenti veramente avanzati che vengono proposti quasi completamente fuori contesto ed è difficile capirne la potenza senza aver prima provato a lavorare con cose tangibili. Quindi stavo pensando di partire con un po’ di classi e programmazione ad oggetti e poi deviare e fare bene almeno uno o due framework (in prima battuta pensavo django, flask, tkiner o kivy). Questo però potrebbe risultare già troppo avanzato. Quindi preferireste un qualche cosa del genere (e nel qual caso avreste preferenze per qualche framework?) oppure preferireste come suggerisce christian una specie di laboratorio interattivo dove continuiamo a vedere python base, aggiungendo qualcosina ed esercitandoci su tutte le extra funzioni fornite di serie? (sto pensando anche a cose tipo pip, virutalenv magari personalizzare ulteriormente sublimetext etc)

La mia era una proposta eh…
Comunque io so troppo poco di questi framework per capire se mi possono essere utili e come…
Mi documento su cosa sono, a cosa servono, come si usano (anzi, se avessi qualche riferimento a un’introduzione a 'sti framework…) e poi so dare un parere più preciso.

Credo che comunque in medio stat virtus, quindi immagino che l’ideale sarebbe fare un po’ di questo e un po’ di quello.

Apro una piccola parentesi solo per ricordare che era stato citato anche Python come interfaccia di programmazione per un progetto di domotica tramite Raspberry Pi: non sarebbe male nemmeno prendere in considerazione questo “fork” (come argomento da toccare in una lezione o come corso a sé).

Io intanto ci rifletto su…

Indicativamente quando pensavate di proporre il nuovo corso?

P.S.: Nel caso avessi bisogno di dritte sui miei “esperimenti in Python”, posso chiedere qui o è meglio aprire un topic apposito?

Apri un topic apposito, se è legato ad un progetto o una idea apri in #projects-ideas altrimenti in Discussione tra soci.

1 Mi Piace

Io suggerirei, sedimenta bene le basi :slight_smile: chi ben incomincia è a metà dell’opera. Programmazione OOP e best practices, un po’ di object model e coding patterns. Come trovare aiuto e come usare l’help, imparare dai framework leggendo il sorgente. Come debuggare errori e lavorare con pacchetti esterni e virtualenv. Decoratori.

Direi che questo è il minimo per lavorare ad esempio con Django. In questa maniera puoi spendere meno tempo a spiegare i framework, perché sono in grado di lavorarci un po’ più in autonomia, senza arenarsi di fronte ad un object model oscuro che non sanno bene come estendere.