first commit
This commit is contained in:
commit
167cad6cd9
6 changed files with 1441 additions and 0 deletions
15
Makefile
Normal file
15
Makefile
Normal file
|
@ -0,0 +1,15 @@
|
|||
PDFDIR=pdf
|
||||
MDS=$(wildcard *.md)
|
||||
PDFS=$(patsubst %.md,$(PDFDIR)/%.pdf, $(MDS))
|
||||
TEMPLATE_ARGS=-V titlepage=true -V titlepage-text-color=000000 -V titlepage-color=B2DFEE -V titlepage-background=./background.pdf
|
||||
PANDOC_ARGS=-N -V lang=it --template default.latex -s --listings --toc
|
||||
|
||||
.PHONY : all
|
||||
|
||||
all : $(PDFS)
|
||||
|
||||
$(PDFDIR):
|
||||
mkdir $(PDFDIR)
|
||||
|
||||
$(PDFDIR)/%.pdf: %.md $(PDFDIR)
|
||||
pandoc $(TEMPLATE_ARGS) $(PANDOC_ARGS) $< -o $@
|
8
README.md
Normal file
8
README.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Introduzione al coding
|
||||
|
||||
La dispensa introduce ai concetti fondamentali del coding attraverso
|
||||
il dialogo con un LLM (Large Language Model). Il percorso formativo
|
||||
parte dalla descrizione di un semplice script Python che implementa un
|
||||
cifrario di Cesare. Il modello di linguaggio utilizzato è
|
||||
**phind_v10_model**.
|
||||
|
69
background.pdf
Normal file
69
background.pdf
Normal file
|
@ -0,0 +1,69 @@
|
|||
%PDF-1.5
|
||||
%µí®û
|
||||
3 0 obj
|
||||
<< /Length 4 0 R
|
||||
/Filter /FlateDecode
|
||||
>>
|
||||
stream
|
||||
xœeŽKÂ@@÷s
|
||||
. Â8†GpaÛE]¨÷OdÒØÖ4,ø=^x†ï ®w‚éS\=@C±šÁeí“yÀ˜kBsX²p1ÒèÇLHÄðÜ*†a
ßr<C39F>¹œøÕ¬VUb/ÒLPÝ1D®È<ì¢?ç‘\u¢Þ³·jÚmlŽœïp$Ž$Š“~.g~,·òž·>å
|
||||
endstream
|
||||
endobj
|
||||
4 0 obj
|
||||
150
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/ExtGState <<
|
||||
/a0 << /CA 1 /ca 1 >>
|
||||
>>
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<< /Type /Page
|
||||
/Parent 1 0 R
|
||||
/MediaBox [ 0 0 595.275574 841.889771 ]
|
||||
/Contents 3 0 R
|
||||
/Group <<
|
||||
/Type /Group
|
||||
/S /Transparency
|
||||
/I true
|
||||
/CS /DeviceRGB
|
||||
>>
|
||||
/Resources 2 0 R
|
||||
>>
|
||||
endobj
|
||||
1 0 obj
|
||||
<< /Type /Pages
|
||||
/Kids [ 5 0 R ]
|
||||
/Count 1
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<< /Creator (cairo 1.14.8 (http://cairographics.org))
|
||||
/Producer (cairo 1.14.8 (http://cairographics.org))
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<< /Type /Catalog
|
||||
/Pages 1 0 R
|
||||
>>
|
||||
endobj
|
||||
xref
|
||||
0 8
|
||||
0000000000 65535 f
|
||||
0000000564 00000 n
|
||||
0000000264 00000 n
|
||||
0000000015 00000 n
|
||||
0000000242 00000 n
|
||||
0000000336 00000 n
|
||||
0000000629 00000 n
|
||||
0000000756 00000 n
|
||||
trailer
|
||||
<< /Size 8
|
||||
/Root 7 0 R
|
||||
/Info 6 0 R
|
||||
>>
|
||||
startxref
|
||||
808
|
||||
%%EOF
|
1048
default.latex
Normal file
1048
default.latex
Normal file
File diff suppressed because it is too large
Load diff
301
introduzione_al_coding.md
Normal file
301
introduzione_al_coding.md
Normal file
|
@ -0,0 +1,301 @@
|
|||
---
|
||||
title: Introduzione al coding
|
||||
subtitle: Dialoghi con un modello di linguaggio
|
||||
author: Andrea Fazzi
|
||||
date: 10.02.2024
|
||||
urlcolor: blue
|
||||
---
|
||||
|
||||
# Introduzione
|
||||
|
||||
Attraverso il dialogo con un LLM (Large Language Model) si
|
||||
introdurranno i concetti fondamentali del coding a partire da un
|
||||
semplice script Python che implementa un cifrario di Cesare. Il
|
||||
modello di linguaggio utilizzato è **phind_v10_model**.
|
||||
|
||||
# Lo script
|
||||
|
||||
**Io:** In che linguaggio è scritto il seguente programma?
|
||||
|
||||
```python
|
||||
def cesar_cipher(text, key):
|
||||
result = ""
|
||||
|
||||
for i in range(len(text)):
|
||||
char = text[i]
|
||||
|
||||
if char.isupper():
|
||||
result += chr((ord(char) - 65 + key) % 26 + 65)
|
||||
else:
|
||||
result += chr((ord(char) - 97 + key) % 26 + 97)
|
||||
|
||||
return result
|
||||
|
||||
text = input("Inserisci il testo da cifrare: ")
|
||||
key = int(input("Inserisci la chiave: "))
|
||||
|
||||
print("Testo cifrato: ", cesar_cipher(text, key))
|
||||
```
|
||||
|
||||
**llm**: Il programma è scritto in Python.
|
||||
|
||||
# Il linguaggio Python
|
||||
|
||||
**Io**: Parlami in maniera succinta del linguaggio di programmazione
|
||||
Python (massimo 100 parole).
|
||||
|
||||
**llm**: Python è un linguaggio di programmazione ad alto livello,
|
||||
interpretato e orientato agli oggetti. Creato da Guido van Rossum nel
|
||||
1991, è noto per la sua sintassi leggibile e semplice, simile al
|
||||
linguaggio inglese, con influenze matematiche. È dinamicamente
|
||||
tipizzato e gestisce l'allocazione della memoria. Supporta vari stili
|
||||
di programmazione, tra cui procedurale, funzionale e orientato agli
|
||||
oggetti. Python è spesso utilizzato per lo sviluppo rapido di
|
||||
applicazioni, l'automazione, l'elaborazione dei dati e l'apprendimento
|
||||
automatico. Ha una vasta gamma di librerie standard e un'ampia
|
||||
comunità di sviluppatori.
|
||||
|
||||
# Descrizione dello script
|
||||
|
||||
**Io**: Descrivimi lo script. Cosa fa?
|
||||
|
||||
**llm**: Lo script Python che hai fornito è un'implementazione di un
|
||||
cifrario di Cesare, un metodo di crittografia di sostituzione molto
|
||||
semplice. Il cifrario di Cesare sposta ogni lettera dell'alfabeto di
|
||||
un numero fissato di posizioni. Ad esempio, con una chiave di 1, 'A'
|
||||
diventa 'B', 'B' diventa 'C', ecc.
|
||||
|
||||
Ecco come funziona lo script:
|
||||
|
||||
- La funzione `cesar_cipher` prende due argomenti: `text`, la stringa
|
||||
da cifrare, e `key`, la chiave di cifratura.
|
||||
- Per ogni carattere nel testo, controlla se è maiuscolo o minuscolo e
|
||||
calcola il nuovo carattere cifrato sommando la chiave alla posizione
|
||||
numerica ASCII del carattere originale, poi modulando per il numero
|
||||
di lettere nell'alfabeto (26).
|
||||
- Restituisce la stringa cifrata.
|
||||
- All'utente viene chiesto di inserire il testo da cifrare e la
|
||||
chiave.
|
||||
- Infine, lo script stampa il testo cifrato.
|
||||
|
||||
# Variabili
|
||||
|
||||
**Io**: Nello script sono utilizzati diversi concetti relativi al
|
||||
coding in generale. Sono presenti, ad esempio, alcune variabili alle
|
||||
quali vengono assegnati dei valori. A partire dallo script, spiegami in maniera succinta
|
||||
|
||||
1. Cosa sono le variabili
|
||||
2. Come si assegna un valore ad una variabile
|
||||
3. I diversi tipi di variabile utilizzati nello script
|
||||
|
||||
**llm**:
|
||||
|
||||
1. Le variabili sono locazioni di memoria con un nome e un valore
|
||||
associato. In Python, le variabili non devono essere dichiarate prima
|
||||
dell'uso; si creano semplicemente assegnando un valore ad un nome con
|
||||
l'operatore `=` [0][1].
|
||||
2. Per assegnare un valore ad una variabile, si utilizza l'operatore
|
||||
di assegnazione `=`. Ad esempio, `result = ""` assegna una stringa
|
||||
vuota alla variabile `result`. In Python, è possibile assegnare
|
||||
valori di diversi tipi di dati a una variabile e il tipo di dato
|
||||
verrà determinato automaticamente [0][1].
|
||||
3. Nel tuo script, ci sono vari tipi di variabili:
|
||||
- `text`: è una stringa, poiché contiene testo che l'utente
|
||||
inserirà tramite l'input.
|
||||
- `key`: è un intero, poiché l'input dell'utente viene convertito
|
||||
in un numero intero con `int()`.
|
||||
- `char`: è un carattere, poiché estrai singoli caratteri dalla
|
||||
stringa `text`.
|
||||
- `result`: è anch'essa una stringa, poiché accumula i caratteri
|
||||
cifrati [0][2].
|
||||
|
||||
|
||||
## Esercizio
|
||||
|
||||
**Io**: Proponimi un esercizio per mettere in pratica l'utilizzo delle
|
||||
variabili in Python. L'esercizio dev'essere coerente con quanto mi hai
|
||||
spiegato in precedenza. Insieme alla traccia dell'esercizio, genera
|
||||
una soluzione in Python.
|
||||
|
||||
**llm**:
|
||||
|
||||
Esercizio:
|
||||
|
||||
Scrivi uno script Python che calcoli l'area di un cerchio dato il
|
||||
raggio. Utilizza una variabile per memorizzare il raggio e un'altra
|
||||
per memorizzare l'area. Stampa l'area sul terminale.
|
||||
|
||||
Soluzione:
|
||||
```python
|
||||
# Assegnazione del raggio alla variabile 'raggio'
|
||||
|
||||
raggio = 5
|
||||
|
||||
# Calcolo dell'area del cerchio utilizzando la formula:
|
||||
# area = pi * raggio^2
|
||||
# Nota: In Python, 'pi' è rappresentato come math.pi
|
||||
|
||||
import math
|
||||
area = math.pi * raggio ** 2
|
||||
|
||||
# Stampa dell'area sul terminale
|
||||
print("L'area del cerchio con raggio", raggio, "è", area)
|
||||
```
|
||||
|
||||
# Cicli
|
||||
|
||||
**Io**: Nello script è presente un ciclo `for`. Parlami di questo
|
||||
costrutto e di come viene utilizzato nello script.
|
||||
|
||||
**llm**: Nello script Python fornito, il costrutto `for` viene
|
||||
utilizzato per iterare su una sequenza, in particolare una
|
||||
stringa. Questo costrutto è comune in Python e funziona come un
|
||||
iteratore, consentendo di eseguire un blocco di codice per ogni
|
||||
elemento in una sequenza, come una lista, una tupla, un dizionario, un
|
||||
insieme o una stringa [0][1][2][3].
|
||||
|
||||
Ecco come viene utilizzato nel tuo script:
|
||||
|
||||
- `for i in range(len(text)):` - Il ciclo `for` itera sulla lunghezza
|
||||
della stringa `text` utilizzando la funzione `range()`, che genera
|
||||
una sequenza di numeri. In questo caso, `i` assume il valore di ogni
|
||||
indice nella stringa `text` durante l'iterazione [2][3].
|
||||
- All'interno del ciclo, `char = text[i]` assegna il carattere
|
||||
corrispondente all'indice `i` alla variabile `char`.
|
||||
- Successivamente, il codice controlla se il carattere è maiuscolo o
|
||||
minuscolo e calcola il nuovo carattere cifrato basandosi sulla
|
||||
posizione ASCII del carattere originale e sulla chiave fornita
|
||||
dall'utente.
|
||||
- Il risultato viene accumulato nella stringa `result`, che viene poi
|
||||
stampata alla fine dello script.
|
||||
|
||||
Quindi, il ciclo `for` in questo script è fondamentale per applicare
|
||||
la cifratura di Cesare a ciascun carattere del testo fornito
|
||||
dall'utente.
|
||||
|
||||
**Io**: Esistono altri modi per costruire in Python parti di codice
|
||||
iterative? Potresti prima elencarle e poi descrivermele succintamente?
|
||||
|
||||
**llm**: Esistono diversi modi per costruire parti di codice iterative
|
||||
in Python oltre al ciclo `for`. Ecco alcuni dei più comuni:
|
||||
|
||||
- Ciclo `while`: Si utilizza quando non si conosce in anticipo quante
|
||||
volte il ciclo deve essere eseguito, ma si sa solo quando deve
|
||||
terminare [1].
|
||||
- List comprehension: Una forma concisa per creare liste basate su
|
||||
espressioni e cicli for [1].
|
||||
- Funzioni ricorsive: Chiamano se stesse per risolvere problemi che
|
||||
possono essere scomposti in sottoproblemi più piccoli [1].
|
||||
- Generatori: Fanno parte delle iterazioni, ma sono più leggeri perché
|
||||
non memorizzano tutti gli elementi in memoria, ma li producono su
|
||||
richiesta [1].
|
||||
|
||||
**Io**: Potresti riscrivere lo script utilizzando un ciclo `while` al
|
||||
posto del `for`?
|
||||
|
||||
**llm**: Per riscrivere lo script utilizzando un ciclo `while` invece
|
||||
del `for`, puoi seguire questi passaggi:
|
||||
|
||||
1. Inizializza una variabile, ad esempio `i`, con valore 0.
|
||||
2. Imposta una condizione per il ciclo `while` che controlla se `i` è
|
||||
minore della lunghezza della stringa `text`.
|
||||
3. All'interno del ciclo `while`, esegui il codice che era
|
||||
precedentemente all'interno del ciclo `for`, assicurandoti di
|
||||
aggiornare il valore di `i` alla fine di ogni iterazione.
|
||||
4. Alla fine del ciclo, assicurati che `i` sia incrementato di 1.
|
||||
|
||||
Ecco come potrebbe apparire lo script modificato:
|
||||
|
||||
```python
|
||||
def cesar_cipher(text, key):
|
||||
result = ""
|
||||
i = 0
|
||||
|
||||
while i < len(text):
|
||||
char = text[i]
|
||||
|
||||
if char.isupper():
|
||||
result += chr((ord(char) - 65 + key) % 26 + 65)
|
||||
else:
|
||||
result += chr((ord(char) - 97 + key) % 26 + 97)
|
||||
|
||||
i += 1
|
||||
|
||||
return result
|
||||
|
||||
text = input("Inserisci il testo da cifrare: ")
|
||||
key = int(input("Inserisci la chiave: "))
|
||||
|
||||
print("Testo cifrato: ", cesar_cipher(text, key))
|
||||
```
|
||||
|
||||
In questo modo, il ciclo `while` continua a eseguire il blocco di
|
||||
codice fino a quando `i` è inferiore alla lunghezza del testo, che è
|
||||
equivalente al comportamento del ciclo `for` originale.
|
||||
|
||||
## Esercizio
|
||||
|
||||
**Io**: Proponimi un esercizio nel quale sia necessario utilizzare un
|
||||
ciclo `for`. Genera la soluzione dell'esercizio.
|
||||
|
||||
**llm**:
|
||||
|
||||
Esercizio:
|
||||
|
||||
Scrivi uno script Python che stampi la somma dei primi n numeri naturali, dove n è un numero intero fornito dall'utente.
|
||||
|
||||
Traccia dell'esercizio:
|
||||
|
||||
1. Chiedi all'utente di inserire un numero intero `n`.
|
||||
2. Utilizza un ciclo `for` per sommare i numeri da 1 a `n`.
|
||||
3. Stampa la somma ottenuta.
|
||||
|
||||
Soluzione in Python:
|
||||
|
||||
```python
|
||||
# Chiedi all'utente di inserire un numero intero
|
||||
n = int(input("Inserisci un numero intero: "))
|
||||
|
||||
# Inizializza una variabile per tenere traccia della somma
|
||||
somma = 0
|
||||
|
||||
# Utilizza un ciclo for per sommare i numeri da 1 a n
|
||||
for i in range(1, n + 1):
|
||||
somma += i
|
||||
|
||||
# Stampa la somma ottenuta
|
||||
print("La somma dei primi", n, "numeri naturali è", somma)
|
||||
```
|
||||
|
||||
**Io**: E' possibile scrivere un'implementazione ricorsiva dello
|
||||
stesso esercizio? Potresti eventualmente generarla e spiegarmi passo
|
||||
passo come funziona?
|
||||
|
||||
**llm**:
|
||||
|
||||
Esercizio: Scrivi uno script Python che, data un'intera positiva `n`,
|
||||
calcoli la somma dei primi `n` numeri naturali.
|
||||
|
||||
Soluzione in Python:
|
||||
|
||||
```python
|
||||
def sum_of_naturals(n):
|
||||
# Caso base per la ricorsione: se n è 0, la somma è 0
|
||||
if n == 0:
|
||||
return 0
|
||||
# Somma del numero corrente più la somma dei numeri successivi
|
||||
else:
|
||||
return n + sum_of_naturals(n - 1)
|
||||
|
||||
n = int(input("Inserisci un numero intero positivo: "))
|
||||
|
||||
print("La somma dei primi", n, "numeri naturali è", sum_of_naturals(n))
|
||||
```
|
||||
|
||||
In questa soluzione, la funzione `sum_of_naturals` è una funzione
|
||||
ricorsiva che calcola la somma dei primi `n` numeri naturali. La
|
||||
ricorsione avviene quando la funzione si chiama se stessa con un
|
||||
valore ridotto di `n` (da `n` a `n - 1`) fino a raggiungere il caso
|
||||
base in cui `n` è 0, altrimenti la somma viene calcolata sommando `n`
|
||||
al risultato della chiamata ricorsiva.
|
||||
|
BIN
pdf/introduzione_al_coding.pdf
Normal file
BIN
pdf/introduzione_al_coding.pdf
Normal file
Binary file not shown.
Loading…
Reference in a new issue