Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Yidu

#41
Hola de nuevo!

Estoy haciendo alguna prueba con cx_freeze. Osea, para convertir archivos py a exe.

Con scripts sencillos me funciona. Por ejemplo (prueba_2.py):

Código (python) [Seleccionar]
for i in range(1, 100):
   print(i)
input()


Luego creo el script de cx_freeze (setup.py):

Código (python) [Seleccionar]
from cx_Freeze import setup, Executable


setup(name = "Plantilla",
     version = "0.1",
     description = "Crear ejecutable",  
     executables = [Executable("prueba_2.py")])


Esto me crea la carpeta build dentro del directorio de python. Y dentro de la carpeta build tengo el ejecutable prueba_2.exe y alguna carpeta mas.

El problema viene, cuando en algun script que creo, importo algun modulo. Por ejemplo, pickle. Creia que con esto bastaba:

Código (python) [Seleccionar]
from cx_Freeze import setup, Executable

build_exe_options = {"packages": ["pickle"]}

setup(name = "Plantilla",
     version = "0.1",
     description = "Crear ejecutable",  
     options = {"build_exe": build_exe_options},
     executables = [Executable("ejemplo.py")])


Pero no funciona. He leido algunos tutoriales pero sigue sin funcionar. Para construir el exe hago la tipica llamada:

Código (python) [Seleccionar]
C:\Python34>py setup.py build

Hay alguna plantilla de cx_freeze para poder utilizar los modulos standard de Python? En mi caso, la version 3.4
#42
Hola!

Profundizando mas en el tema de las clases, intento conocer un poco mas los operadores y metodos que seran utiles usando la sobrecarga.

La sobrecarga de operadores esta mas o menos clara:

Código (python) [Seleccionar]
class Persona:
   def __init__(self, nombre, edad):
       self.nombre = nombre
       self.edad = edad
       self.inventario = '1,2,3,4,5,6,7'.split(',')
   
   # metodos aritmeticos
   
   def __add__(self, other):
       # suma
       return self.edad + other.edad    
           
   def __sub__(self, other):
       # resta
       return self.edad - other.edad
   


Para sobrecargar la funcion standard de python pow(a, b):

Código (python) [Seleccionar]
def __pow__(self, valor):
       # potenciacion
       return self.edad ** valor


Luego instanciariamos:

Código (python) [Seleccionar]
p1 = Persona('Juan', 30)
p2 = Persona('Ivan', 20)


Y probariamos las sobrecargas:

Código (python) [Seleccionar]
print(p1 + p2) # 50 (__add__)
print(p1 - p2) # 10 (__sub__)
print(p1 ** 2) # 900 (__pow__)


¿Pero como se sobrecargaria, por ejemplo, la funcion standard len()? Seria para comprobar el numero de elementos del atributo self.inventario. Creo que asi seria erroneo:

Código (python) [Seleccionar]
def __len__(self):
       return len(self.inventario)


Aunque funcionar, funciona...

Código (python) [Seleccionar]
print(len(p1)) # 7

La duda es si sobrecargar funciones standard de Python consiste en meter la misma funcion dentro del metodo sobrecargado. Es que visto asi, suena a redundancia ¿No?

Por que cuando queremos utilizar la salida de print mediante la sobrecarga hacemos:

Código (python) [Seleccionar]
def __str__(self):
       # se ejecuta mediante print()
       return 'Nombre: {}'.format(self.nombre)


No esto:

Código (python) [Seleccionar]
def __print__(self):
        # se ejecuta mediante print()
        return 'Nombre: {}'.format(self.nombre)


Resumiendo, ¿Es mejor crear nuestros propios metodos y meter dentro de ellos las funciones standard?

Saludos!  :)
#43
Cita de: hsk75rv en  7 Enero 2017, 21:28 PM

hay elementos de más en el modelo POO que, si bien tienen su funcionalidad, aveces en mi opinión, esa funcionalidad está rebuscada  :rolleyes: .


Yo opino mas o menos igual. No es raro ver algun videotutorial por internet (y se lian mas que un gato con un ovillo de lana) donde demuestran la eficiencia y utilidad de alguna de estas cosas. Hace poco vi la demostracion para decorar una simple funcion. No se, vi demasiado codigo para algo tan simple. Aunque claro, cada cual tendra su opinion. Supongo para programas cortos toda esta programacion avanzada no se necesite. Por eso tampoco quiero decir que sea mala cosa este tipo de decoraciones en algunos casos.
#44
Cita de: ivancea96 en  8 Enero 2017, 01:33 AM

¿Qué es más legible?
Código (python) [Seleccionar]
x.value = x.value + 5
o
Código (python) [Seleccionar]
x.setValue(x.getValue() + 5)

Hombre...yo veo mas legible el primer codigo. En todo caso, nunca me ha convencido el hecho de este tipo de decoraciones. Incluso en el tema de las funciones. Lo que se llama decorar una funcion. A mi modo de ver, hace el codigo mas confuso. Pero claro, seguramente en un nivel mas avanzado de programacion deben ser utiles.

Y haciendo caso al zen de Python: Simple mejor que complejo.

#45
Como ha dicho el compañero de arriba es lo que se suele usar. En el caso de salida por consola. Si utilizas editores ya es otro asunto.

En el script que te paso, cada vez que pulsas una tecla, se borra el numero anterior y aperece el nuevo del ciclo for.

Código (python) [Seleccionar]
from os import system

for i in range(1, 20):
   print(x)
   input()
   system('cls')

#46
Hola de nuevo...

Igual la pregunta es una herejia. Si es asi, pido disculpas. Pero creo, que ha dia de hoy, aun no le encuentro un uso sustancial con las clases (me refiero al uso de las propiedades).

Supongo que como todo el mundo al estudiar la POO, uno se enfoca con los atributos, metodos, herencia, sobrecarga de metodos, polimorfismo y un poco menos encapsulacion. Digo un poco menos "encapsulacion" por que Python tampoco trata los metodos y atributos de forma privada al cien por cien.

Por lo que entiendo, una propiedad o property dentro de una clase, significa usar un metodo como si fuera un atributo. Pero cuando pasamos a llamar a ese metodo usando la propiedad solo obviamos los parentesis. Es por eso que tampoco veo tanto ahorro.

Pongo los ejemplos clasicos de una clase Circulo. Los dos primeros ejemplos son semejantes. Osea, en el primer ejemplo usamos el decorador @property. En el segundo, la funcion interna property()

1er EJEMPLO:

Código (python) [Seleccionar]
class Circulo_1:
   
    def __init__(self, radio):
        self.radio = radio
       
    @property
    def dameArea(self):
        return 3.14159 * (self.radio ** 2)


2do. EJEMPLO:

Código (python) [Seleccionar]
class Circulo_2:
   
    def __init__(self, radio):
        self.radio = radio       
   
    def dameArea(self):
        return 3.14159 * (self.radio ** 2)
   
    area = property(dameArea)


Y por ultimo sin usar las propiedades:

Código (python) [Seleccionar]
class Circulo_3:
   
    def __init__(self, radio):
        self.radio = radio       
   
    def dameArea(self):
        return 3.14159 * (self.radio ** 2)



Instanciamos y pasamos a correr el codigo en cada ejemplo:

Código (python) [Seleccionar]
# instanciamos:
c1 = Circulo_1(20)
c2 = Circulo_2(20)
c3 = Circulo_3(20)


Código (python) [Seleccionar]
c1.dameArea
1256.636
c2.area
1256.636
c3.dameArea()
1256.636


En el tercer caso, sin usar property, solo hemos de poner dos parentesis y punto. Tampoco lo veo nada del otro mundo. En el segundo ejemplo, podemos crear un variable asignandole los valores de metodo usando la funcion property(). Y en el primer caso, usando un decorador.

Supongo que muchos programadores avanzados le daran uso a las propiedades. Y mas aun con los getters y setters. Pero si no usamos atributos o metodos semi-privados ¿Es necesario usar las propiedades en python?

#47
Scripting / Re: (python) como ordenar matriz?
6 Enero 2017, 16:36 PM
Tampoco es mala cosa crear o definir una matriz sin utilizar una funcion. Osea, usando las listas por comprension (en el ejemplo 5 filas por 3 columnas):

Código (python) [Seleccionar]
matriz = [[0] * 3 for i in range(5)]

Salida:

Código (python) [Seleccionar]
matriz
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]


O tambien:

Código (python) [Seleccionar]
filas = 5
columnas = 3
matriz = [[0] * columnas for i in range(filas)]


#48
Scripting / Re: lista a traves de generador
31 Diciembre 2016, 19:55 PM
Tambien puedes utilizar el generador como se utilizan las listas por comprension (En el caso de generadores se usan parantesis).

Código (python) [Seleccionar]
generador = (elem for elem in range(1, 11))

Puedes accedar a sus elementos con la funcion integrada en Python next().

Código (python) [Seleccionar]
next(generador)
next(generador)
next(generador)


SALIDA:

1
2
3


O recorrerlo integramente mediante un ciclo for:

Código (python) [Seleccionar]
for i in generador:
   print(i)


SALIDA:

1
2
3
4
5
6
7
8
9
10

Tambien se pueden hacer filtros con los datos que se van generando. Por ejemplo, solo numeros pares:

Código (python) [Seleccionar]
generador = (elem for elem in range(1, 11) if elem % 2 is 0)

SALIDA:

Código (python) [Seleccionar]
next(generador)
2
next(generador)
4
next(generador)
6
next(generador)
8
next(generador)
10
next(generador)

Traceback (most recent call last):
 Python Shell, prompt 7, line 1
builtins.StopIteration:

Si, al final te saldra la advertencia de StopIteracion. Ya que el generador se ha vaciado. Aunque esto tambien se puede hacer con un range e indicando su paso a la salida de cada elemento.

Tambien tienes la opcion con la funcion iter()

Código (python) [Seleccionar]
a = (range(1, 101))
b = iter(a)


SALIDAS:

Código (python) [Seleccionar]
next(b)
1
next(b)
2
next(b)
3


(Si no usas la el IDE interactivo deberas aplicar la funcion print() para mostrar los resultados con next().

Espero que te haya ayudado. Saludos!  :rolleyes:



#49
Hola!

Bueno, esta claro que para gustos los colores. Yo suelo programar en Python, pero como un hobby y tal. Seguramente, que si uno se dedica a esto (programacion) de forma profesional, necesitara usar GUIs y ventanas. Osea, interfaces mas majos. La cosa es, de si uno puede hacer buenos programas en consola. Tampoco me refiero que sea solo linea de comandos. Si no, hacer menus y cambios de pantalla utilizando solo codigo. Sin utilizar ventanas, botones, lineas de desplazamiento, etc...

Es que, a veces veo,  que para poner un simple 'Hola Mundo' se debe picar relativamente bastante codigo para que solo se muestre una ventana. Supongo que porque se utilza la POO.

Resumiendo ¿Se es un raro por disfrutar la programacion espartana?
#50
Cita de: daryo en  5 Septiembre 2015, 13:52 PM
gracias :) aunque es algo basico pero no veo que toque modulos como pygame y todo lo hace desde la consola
esta bien para el que nunca haya programado y quiera aprender con ejemplos y juegos

Bueno, es que de eso se trata. De no empezar la casa por el tejado. Y en programacion muchas veces sucede eso. De todas formas, si que toca pygame. Aunque sea en sus primeros pasos. Mira a partir del capitulo 17.

Esta claro que en este tipo de libros no te van a enseñar hacer un juego triple A. Se trata de eso, de coger las bases y tal.

Saludos!