8000 Aggiunto Lab 13 · mathcoding/programming@a9b0831 · GitHub
[go: up one dir, main page]

Skip to content

Commit a9b0831

Browse files
committed
Aggiunto Lab 13
1 parent c3d43ca commit a9b0831

File tree

2 files changed

+698
-0
lines changed

2 files changed

+698
-0
lines changed

notebooks/Lab 13.ipynb

Lines changed: 346 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,346 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {},
6+
"source": [
7+
"# Cenni di programmazione funzionale\n",
8+
"\n",
9+
"### Calcolo di polinomio e sua derivata\n",
10+
"Si consideri un polinomio di ordine $n$ e la sua derivata prima:\n",
11+
"\n",
12+
"$$p(x) = a_0 x^0 + a_1 x^1 + ... + a_n x^n = \\sum_{i=0,..,n} a_i x^i$$\n",
13+
"\n",
14+
"$$p'(x) = q(x) = a_1 x^0 + 2 a_2 x^1 + ... + n a_n x^{n-1} = \\sum_{i=1,..,n} a_i x^{i-1}$$\n",
15+
"\n",
16+
"Scrivere una funzione che data la lista dei coefficienti del polinomio $[a_0, a_1, ..., a_n]$\n",
17+
"restituisca le due funzioni $p(x)$ e $q(x)$.\n",
18+
"\n",
19+
"Entrambe le funzioni restituite, prendono in input un valore $x$ e calcolano rispettivamente il valore del polinomio in $x$ e il valore della derivata prima."
20+
]
21+
},
22+
{
23+
"cell_type": "code",
24+
"execution_count": null,
25+
"metadata": {
26+
"collapsed": false
27+
},
28+
"outputs": [],
29+
"source": [
30+
"def MakePolyAndDerivate(As):\n",
31+
" def Poly(x):\n",
32+
" return sum(a*x**n for n,a in enumerate(As))\n",
33+
" def PolyDerivate(x):\n",
34+
" return sum((n+1)*a*x**n for n,a in enumerate(As[1:]))\n",
35+
" return Poly, PolyDerivate\n",
36+
"\n",
37+
"p, q = MakePolyAndDerivate([1, 0, 24])\n",
38+
"# NOTA: p e q in questo caso sono due funzioni\n",
39+
"print(p(0), q(0))\n",
40+
"print(p(1), q(1))"
41+
]
42+
},
43+
{
44+
"cell_type": "markdown",
45+
"metadata": {},
46+
"source": [
47+
"### Processare liste: `iter` e `next`\n",
48+
"La funzione builtin `iter(sequenza)` prende in input una sequenza (tupla, lista, stringa, dizionario,...) e restituisce un oggetto di tipo `generator`, ovvero un oggetto a cui si può chiedere il prossimo elemento, attraverso la funzione builtin `next(generator)`."
49+
]
50+
},
51+
{
52+
"cell_type": "code",
53+
"execution_count": null,
54+
"metadata": {
55+
"collapsed": false
56+
},
57+
"outputs": [],
58+
"source": [
59+
"a = \"qual'è\"\n",
60+
"c = iter(a)\n",
61+
"next(c)\n",
62+
"next(c)\n",
63+
"next(c)\n",
64+
"next(c)\n",
65+
"print(next(c)) # COSA STAMPA??"
66+
]
67+
},
68+
{
69+
"cell_type": "code",
70+
"execution_count": null,
71+
"metadata": {
72+
"collapsed": false
73+
},
74+
"outputs": [],
75+
"source": [
76+
"Ls = [1,2,3,4,3,2,1]\n",
77+
"a = iter(Ls)\n",
78+
"print('tipo di a: {}'.format(type(a)))\n",
79+
"next(a), next(a)\n",
80+
"A = next(a)\n",
81+
"print('A:', A) # COSA STAMPA??"
82+
]
83+
},
84+
{
85+
"cell_type": "markdown",
86+
"metadata": {},
87+
"source": [
88+
"Per sapere quando un oggetto di tipo iteratore ha iterato su tutta la lista conviene chiamare la funzione `next(iterator, default)` passandogli oltre all'itereratore un valore di default."
89+
]
90+
},
91+
{
92+
"cell_type": "code",
93+
"execution_count": null,
94+
"metadata": {
95+
"collapsed": false
96+
},
97+
"outputs": [],
98+
"source": [
99+
"a = iter(Ls)\n",
100+
"while True:\n",
101+
" stop = object()\n",
102+
" c = next(a, stop) \n",
103+
" if c == stop:\n",
104+
" break\n",
105+
" print(c)"
106+
]
107+
},
108+
{
109+
"cell_type": "markdown",
110+
"metadata": {},
111+
"source": [
112+
"Altrimenti si può prendere l'eccezione `StopIteration` (in cui `try .. exception` altro argomento da introdurre):"
113+
]
114+
},
115+
{
116+
"cell_type": "code",
117+
"execution_count": null,
118+
"metadata": {
119+
"collapsed": false
120+
},
121+
"outputs": [],
122+
"source": [
123+
"a = iter(Ls)\n",
124+
"while True:\n",
125+
" try:\n",
126+
" c = next(a)\n",
127+
" print(c)\n",
128+
" except:\n",
129+
" break"
130+
]
131+
},
132+
{
133+
"cell_type": "markdown",
134+
"metadata": {},
135+
"source": [
136+
"### Lazy evaluation e liste infinite\n",
137+
"\n",
138+
"**ESERCIZIO**: scrivere una funzione `Range(n)`che prende in input un numero naturale *n* e restituisce in output i numeri da *0* a *n-1*:"
139+
]
140+
},
141+
{
142+
"cell_type": "code",
143+
"execution_count": null,
144+
"metadata": {
145+
"collapsed": false
146+
},
147+
"outputs": [],
148+
"source": [
149+
"def RangeNaive(n):\n",
150+
" return [i for i in range(n)]\n",
151+
"\n",
152+
"print(RangeNaive(5))"
153+
]
154+
},
155+
{
156+
"cell_type": "code",
157+
"execution_count": 1,
158+
"metadata": {
159+
"collapsed": false
160+
},
161+
"outputs": [
162+
{
163+
"name": "stdout",
164+
"output_type": "stream",
165+
"text": [
166+
"range(0, 5)\n"
167+
]
168+
}
169+
],
170+
"source": [
171+
"print(range(5))"
172+
]
173+
},
174+
{
175+
"cell_type": "code",
176+
"execution_count": 2,
177+
"metadata": {
178+
"collapsed": false
179+
},
180+
"outputs": [
181+
{
182+
"name": "stdout",
183+
"output_type": "stream",
184+
"text": [
185+
"<class 'range'>\n"
186+
]
187+
}
188+
],
189+
"source": [
190+
"a = range(0, 5)\n",
191+
"print(type(a))"
192+
]
193+
},
194+
{
195+
"cell_type": "markdown",
196+
"metadata": {},
197+
"source": [
198+
"**DOMANDA**: cosa succede se chiamiamo `Range(100000000000)`? Ma se intanto utilizziamo solo un valore alla volta, perché costruire una lista di 100000000000 elementi?\n",
199+
"\n",
200+
"In Python esiste un'altra parola chiave: **`yield`** che e simile a `return`, ma ha un significato leggermente diverso, in quanto la fu F987 nzione non ritorna un singolo valore, ma un **generator**."
201+
]
202+
},
203+
{
204+
"cell_type": "code",
205+
"execution_count": null,
206+
"metadata": {
207+
"collapsed": true
208+
},
209+
"outputs": [],
210+
"source": [
211+
"def Range(n):\n",
212+
" i = 0\n",
213+
" while i < n:\n",
214+
" yield i\n",
215+
" i = i + 1"
216+
]
217+
},
218+
{
219+
"cell_type": "code",
220+
"execution_count": null,
221+
"metadata": {
222+
"collapsed": false
223+
},
224+
"outputs": [],
225+
"source": [
226+
"c = Range(5)\n",
227+
"print(c)"
228+
]
229+
},
230+
{
231+
"cell_type": "code",
232+
"execution_count": null,
233+
"metadata": {
234+
"collapsed": false
235+
},
236+
"outputs": [],
237+
"source": [
238+
"print(next(c))\n",
239+
"print(next(c))\n",
240+
"print(next(c))"
241+
]
242+
},
243+
{
244+
"cell_type": "code",
245+
"execution_count": null,
246+
"metadata": {
247+
"collapsed": false
248+
},
249+
"outputs": [],
250+
"source": [
251+
"print(next(c))\n",
252+
"print(next(c))\n",
253+
"print(next(c))"
254+
]
255+
},
256+
{
257+
"cell_type": "code",
258+
"execution_count": null,
259+
"metadata": {
260+
"collapsed": false
261+
},
262+
"outputs": [],
263+
"source": [
264+
"print([i for i in Range(5)]) "
265+
]
266+
},
267+
{
268+
"cell_type": "markdown",
269+
"metadata": {},
270+
"source": [
271+
"**DOMANDA:** come mai il codice precedente funziona senza dare un errore?\n",
272+
"\n",
273+
"**ESERCIZIO:** Come definire una funzione `Enumerate(Ls)` che restituisce una coppia di valori `(indice, elemento)` per ogni elemento di `Ls`, allo stesso modo della funzione builtin `enumerate`?"
274+
]
275+
},
276+
{
277+
"cell_type": "code",
278+
"execution_count": null,
279+
"metadata": {
280+
"collapsed": true
281+
},
282+
"outputs": [],
283+
"source": [
284+
"def Enumerate(Ls):\n",
285+
" i = 0\n",
286+
" it = iter(Ls)\n",
287+
" last = object()\n",
288+
" while True:\n",
289+
" item = next(it, last)\n",
290+
" if item == last:\n",
291+
" break\n",
292+
" yield i, item\n",
293+
" i = i + 1"
294+
]
295+
},
296+
{
297+
"cell_type": "code",
298+
"execution_count": null,
299+
"metadata": {
300+
"collapsed": false
301+
},
302+
"outputs": [],
303+
"source": [
304+
"Ls = [i for i in range(5, 20, 2)]\n",
305+
"print(Ls)"
306+
]
307+
},
308+
{
309+
"cell_type": "code",
310+
"execution_count": null,
311+
"metadata": {
312+
"collapsed": false
313+
},
314+
"outputs": [],
315+
"source": [
316+
"[(i,a) for (i,a) in Enumerate(Ls)]"
317+
]
318+
},
319+
{
320+
"cell_type": "markdown",
321+
"metadata": {},
322+
"source": []
323+
}
324+
],
325+
"metadata": {
326+
"kernelspec": {
327+
"display_name": "Python [default]",
328+
"language": "python",
329+
"name": "python3"
330+
},
331+
"language_info": {
332+
"codemirror_mode": {
333+
"name": "ipython",
334+
"version": 3
335+
},
336+
"file_extension": ".py",
337+
"mimetype": "text/x-python",
338+
"name": "python",
339+
"nbconvert_exporter": "python",
340+
"pygments_lexer": "ipython3",
341+
"version": "3.5.3"
342+
}
343+
},
344+
"nbformat": 4,
345+
"nbformat_minor": 2
346+
}

0 commit comments

Comments
 (0)
0