Corso di Python - Novembre 2016

Ci sarò.grazie

Presente.

confirmed

Ci vediamo venerdì :wink:

Bella lezione!
Ho già installato tanto SublimeText quanto il plugin per Python!
Fatti i primi due esercizi per casa!

Per giocare un po’, ho anche provato a fare una variazione sul tema Hello world:

print("Digita il tuo nome") input(a) print("Ciao", a, "!") input()

lanciato, mi dà errore: giustamente a non è definita…
Così ho aggiunto in testa:

a = ""

per provare a far allocare lo spazio per una stringa; sembra funzionare, ma in realtà l’output non stampa il nome che gli fornisco come input, ma lascia semplicemente uno ampio spazio vuoto in corrispondenza del nome… dove sbaglio? Immagino sia in relazione alla immutabilità della variabile… C’è un modo più corretto per allocare memoria per una variabile con valore iniziale null? Pensavo ad un type(a) = str ma mi suonava un po’ strano e non ho nemmeno provato…

Questo mi ricorda il funzionamento di scanf, che prende una reference ad una variable e la riempie con il valore.

Python però non funziona così :slight_smile: se provi a fare help(input) vedrai che l’argomento di input è il prompt, non la variabile in output. Il tuo codice è corretto se sostituisci quella riga con a = input().

Python è molto lontano dalle famiglie di linguaggi C; non c’è bisogno di preoccuparsi di preallocare la memoria (almeno non in questo esempio). Se vuoi dichiarare una variabile in modo che sia definita ma vuota usa a = None. Interessante come type(None) is NoneType come nullptr è un’istanza di nullptr_t in C++ ≥ 11.

@Aiace9 il docente sei tu, per cui dimmi se preferisci rispondere alle domande tu in modo da poter far riferimento al materiale didattico del corso (che non ho visto per cui potrei essere OT).

Danke!:+1:

@Taru ieri sera c’era la prima lezione di Python, abbiamo cercato di contattarti ma non siamo riusciti a raggiungerti. Mettiti d’accordo con @Aiace9 per recuperare la lezione!

No no va benissimo se rispondi anche tu, solo che non avevo ancora fatto ne l’help ne l’input che saranno nella prossima lezione.

Per tutti gli altri ho caricato il materiale in questa cartella:

1 Mi Piace

Questa è la mia versione per l’Esercizio 3:

import random

media = 0
n = 19

while (media != 50):
    n = n + 1
    x = 0
    for i in range(n):
        x = x + random.randint(0, 100)
    media = x % n
print("Per avere una media dei valori tra 0 e 100 pari a 50 è stato necessario randomizzare", n, "valori.")

Sublime mi dice che per la PEP8 l’ultima riga è troppo lunga, ma non mi pare che abbiamo ancora trattato l’interruzione di riga…
La media l’ho fatta in maniera molto empirica… pensavo (speravo) che ci fosse una funzione apposita in Math, ma nisba…
Ho messo un minimo di 20 valori in maniera del tutto arbitrale, giusto per evitare un po’ di cicli di controllo che più o meno inevitabilmente sarebbero andati a vuoto…
Cmq che la PEP8 voglia 4 spazi e non un semplicissimo TAB…
Avendo lanciato il mio script una decina di volte, con risultati variabili tra 54 e 214, ero quasi curioso di farne la media… :smiley:

Un grazie a @5p4k per la spiegazione di input(): ho anche provato ad usare help(...) dal prompt di Python; l’unico problema è che non so come uscirne quando arrivo alla fine della spiegazione del comando… ci sono riuscito solo con ctrl+Z, ma non mi pare il sistema più adatto, visto che mi esce anche da Python…

Un’ultima curiosità che mi è venuta adesso: come mai fintanto che usavo Python 2.x dovevo inserire nella prima riga qualcosa del tipo #! bin/bash (o qualcosa di simile…)?
Adesso che uso Python 3.5.2 non mi dà errore se non inserisco quell’incipit. A che serviva?

Torno a cazzeggiare con Python, visto che ho il giorno libero…

P.S.: Ho trovato la libreria statistics, ma credo che dovrei rivedere il mio script da zero per utilizzare la funzione mean()… per il momento passo e mi dedico ad altro…

Mi sembra un po’ strano, guarda bene quel codice… :wink:

Suggerimento

TL;DR: “÷” non è “%”, la divisione si fa con “/”, non con “%”.

Il simbolo di divisione ÷ si chiama obelo. Rappresenta una frazione: i due puntini sopra e sotto sono il numeratore e il denominatore. È maledetto: incorpora il simbolo moderno della divisione (i due punti “:”) e il simbolo di sottrazione (il meno “-”), ed assomiglia al percento ("%"). Tuttavia la divisione in qualsiasi linguaggio di programmazione si rappresenta con una barra “/”. Il percento è l’operatore modulo; di fatto, il codice che hai scritto genera un valore media casuale tra 0 e n :grin:

Ha gli stessi controlli di less; per uscire puoi premere q (che sta per quit).[quote=“Christian, post:30, topic:135”]
Un’ultima curiosità che mi è venuta adesso: come mai fintanto che usavo Python 2.x dovevo inserire nella prima riga qualcosa del tipo #! bin/bash (o qualcosa di simile…)?
Adesso che uso Python 3.5.2 non mi dà errore se non inserisco quell’incipit. A che serviva?
[/quote]
È uno shabang. Se tu lanci uno script manualmente chiamando python mioscript.py, non serve a niente.

Serve per rendere uno script eseguibile, dev’essere usato in combinazione con chmod +x mioscript.py, e ti permette di lanciarlo direttamente come ./mioscript.py senza specificare l’interprete (che è già nella prima riga dello script).

1 Mi Piace

Ma che pollo che sono! Volevo fare una divisione intera… CONVINTO io che fosse quello l’operatore giusto… :flushed:
Correggo subito!

Ho corretto con media = x // n
Poi mi sono lanciato nel tentativo di fare la media del numero di tentativi:
import random

media = 0
n = 19
m = 0

for idx in range(20):
    while (media != 50):
        n = n + 1
        x = 0
        for i in range(n):
            x = x + random.randint(0, 100)
        media = x // n
    print("Per avere una media dei valori tra 0 e 100 pari a 50 è stato necessario randomizzare", n, "valori.")
    input() #inserito per provare a variare il seedin
    m = m + n
    idx = idx + 1
print("Il numero di tentativi medio è", (m / 20))

Ora… il problema è che quando lancio lo script per ogni ciclo di idx il numero di tentativi è costante… rendendo inutile la media quindi…
Ho l’impressione che ci sia qualcosa di sbagliato nel seeding della randomizzazione…

Scusa se non ti ho risposto ma non ho avuto molto tempo e ho visto che @5p4k è stato fin troppo dettagliato :slight_smile:
Comunque domani vieni con una bella lista di dubbi che li risolviamo tutti!

Spoiler
  • Ti stai dimenticando di porre a 0 la variabile media in ogni ciclo
  • Idx non va incrementato, il ciclo for del python non funziona su una clausola come in C o in altri linguaggi.
    quello che fa è immaginabile come un ciclo su una sequenza di elementi che esiste ed è predefinita. In questo caso range(20). Questo non è del tutto esatto, ma rende l’idea.

Per tastare con mano su cosa stai ciclando prova:

print(list(range(20)))

e vedrai che attuti gli effetti range assomiglia ad una lista di numeri.

Stasera ore 19?

1 Mi Piace

certo!!

Segnalo, per chi non lo conoscesse, il wiki italiano su Python ed in particolare la pagina dedicata ai libri su Python, dalla quale è possibile scaricare “Pensare da informatico - Python” di cui parlavo durante l’ultima lezione, nonché leggere recensioni su quanto disponibile in lingua sia italiana (più adatta agli amatori come me) che inglese.

1 Mi Piace

Ottimo link, anche se dovete sempre prestare attenzione alla versione di python che viene trattata in questi contesti perché spesso i libri cartacei sono fermi a python 2 :slight_smile:
Io appena ho 10 minuti sistemo le slide e le carico. Probabilmente lo farò questa sera al mittelab!

Sì, infatti la pagina wiki è piuttosto precisa nel segnalare la versione di riferimento e l’eventualità che qualche manuale sia obsoleto. :wink:

1 Mi Piace

Slide caricate!

1 Mi Piace