[cfinformatica-grup] Re: [cfinformatica-grup] Python i GS M03 UF1 Programació Estructurada : compartir i dubte

  • From: Daniel Herrera <dherrera@xxxxxxxx>
  • To: cfinformatica-grup@xxxxxxxxxxxxx
  • Date: Wed, 27 Feb 2019 16:39:38 +0100

Hola,

sóc un fan del python i fa anys que treballo amb ell. He impartit
programació amb C i amb Python. Com a bo del C / C++ diré que aprenen a
tipar i a gestionar la memòria (heap, stack, data, ... ) i com a bo del
python diré que és molt fàcil fer coses complicades, arma de doble tall,
perquè de vegades en comptes d'aprendre a programar estan aprenent python.

Dit això t'envio  un anti-pattern que potser resol el teu problema:

[dani@localhost ~]$ python3
Python 3.7.2 (default, Jan 16 2019, 19:49:22)
[GCC 8.2.1 20181215 (Red Hat 8.2.1-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.

class fakeClass(object):
...    pass
...
c1=fakeClass()
c1.a = 1
c1.b = "Adeu"
c2=fakeClass()
c2.a = 2
for c in [ c1, c2 ]:
...    print ( c.a )
...
1
2

I aquí un altre anti-pattern igual o pitjor de xungo:

class Estructura(object):
...     a = 1
...     b = 2
...
e1=Estructura();
e1.a
1
e2=Estructura();
e2.a=3
e1.a
1
e2.a
3

Et dic que aquest segon és més xungo perquè, si les propietats són
mutables, et trobaràs amb sorpreses com explica la documentació
<https://docs.python.org/3/tutorial/classes.html>:

class Dog:

    tricks = []             # mistaken use of a class variable

    def __init__(self, name):
        self.name = name

    def add_trick(self, trick):
        self.tricks.append(trick)
d = Dog('Fido')>>> e = Dog('Buddy')>>> d.add_trick('roll over')>>> 
e.add_trick('play dead')>>> d.tricks                # unexpectedly shared 
by all dogs['roll over', 'play dead']


Per aquest motiu és perillós ensenyar a programar amb Python, tot i que sóc
un fervent admirador del llenguatge, trobo avantatges a aprendre a
programar amb altres llenguatges més "formals", per exemple, el C#  o java
que també són multiplataforma (dotnet core), open source (openJdk, dotnet
core)  i on poden aprendre classes, classes abstractes, interfaces,
herència, structs pel cas de c#
<https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/struct>,
etc etc etc.

Tot i això, mai no saps el que és millor i pitjor perquè els alumnes són
diferents i perquè les coses canvien. Sóc de l'opinió que l'element més
determinant és el professor i a tu et veig molt motivat 👏👏👏

salut.


Missatge de l'adreça <alex@xxxxxxxxxxx> del dia dc., 27 de febr. 2019 a les
12:55:

Bon dia,

aquest curs estic fent ASIX-M03 emprant per primer cop Python com a
eina.

Volia compartir pels qui també la fan amb Python que Thonny ha estat un
entorn boníssim de desenvolupament per iniciar-se: tan senzill com Geany
però amb botons per depurar, executar ṕas per pas amb visualització de
variables. Per mi és imprescindible a classe.

I també volia compartir que he generat un dossier d'exercicis amb
solucions en Python prou gran per aquesta primera UF, per si algú el vol
que li enviï, malgrat Internet va plena d'exercicis de programació.

M'agradaria generar un nou dossier d'exercicis, més orientats a
sistemes, seguretat, jocs (amb PyGame), i fer coses amb el GPIO de la
Raspberry Pi, però no podré posar-me fins a final de curs. Si algú més
vol apuntar-se podem formar equip i compartir els materials que
elaborem.

Ara ve el dubte, per si algú més que fa aquesta UF amb Python s'ha
trobat:

A aquesta matèria hi ha un RA "Utilitza correctament tipus de dades
simples i compostes". Altres anys jo ensenyava tipus de dades compost
homogènies (vectors, matrius, ...) i també heterogènies (structs a C).
Com a exemple d'heterogènia, per explicar-me una mica, crear variables
d'un tipus de dades Alumne, formades per nom (string), nota (real) i
data de naixement, on la data de naixement està formada alhora per dia,
mes i any (enters).

Però quan he volgut ensenyar a Python com podem treballar amb variables
compostes heterogènies i com crear nous tipus de dades. he vist diverses
solucions i no sé si el que finalment he escollit és el més correcte i
pedagògic.

Primer vaig veure els diccionaris, que és una solució molt senzilla,
però no permet crear nous tipus de dades, i no "escala" bé quan hem de
crear estructures compostes molt complexes. Per exemple:

   persona1 = {'nombre':'Calico', 'edad':25}

Segon vaig probar la versió nova dels NamedTuples, però és inmutable. Un
cop es dona un valor a un camp, ja no es pot modificar. Per exemple:

   class Persona(NamedTuple):
     nombre: str
     edad: int

Tercer vaig descobrir el nou decorador DataClass, que es molt bonic i
semblava perfecte pel que volia:

   @dataclass
   class Persona:
     nombre: float
     edad: int

Però vaig pensar que a llarg termini els seria molt més útil que els
ensenyes a declarar estructures utilitzant classes, tot i que era més
complexe que l'anterior solució amb DataClass:

   class Persona:

     def __init__(self, nombre, edad):
       self.nombre = nombre
       self.edad = edad

     def __str__(self):
       return 'Persona: ' + self.nombre + ' - ' + str(self.edad) + '
años'

Però com que no veuen funcions fins la UF2, finalment vaig decidir
quedar-me amb classes que només tinguessin el constructor, i a més sense
paràmetres, i esperar a la següent UF que toca explicar funcions per
introduir els mètodes. Per exemple, vaig acabar amb això, que és més
senzill:

   class Persona:
     def __init__(self):
       self.nombre = ''
       self.edad = 0

Algú més s'ha trobat amb aquesta disjuntiva? Quina opció heu escollit?
Hi ha més opcions?

Salutacions


     Àlex






Other related posts: