« first day (1424 days earlier)      last day (1691 days later) » 

7:01 PM
@abulafia entonces cuando una persona es integra es entera, caso contrario para las personas flotantes
 
@JackNavaRow XD
 
NaP Not a Person?
@abulafia voy aprendiendo mas mira lo que acabo de leer
"What about performances? For example in a list, operations such as insertion and membership can take O(n), while they are O(1) for a dictionary"
 
@JackNavaRow Sí. Los diccionarios python son muy eficientes
Entre otras cosas porque los usa internamente el intérprete para todo. Los atributos de un objeto, los métodos de una clase, las variables definidas en un entorno, el marco de pila... todo son diccionarios
 
@abulafia En argentina para nada
 
han refinado mil veces la implementación del diccionario para que sea ultra-eficiente
 
7:05 PM
siii
 
Cada nueva versión de python hace el diccionario un poco mejor
 
hice un switch con un diccionario
 
@abulafia :O, estoy asombrado, lo que es estudiar , y no aprender en el camino
 
En la última, encima, preserva el orden de inserción y esta característica ha pasado a formar parte oficial del lenguaje, de modo que no va a cambiar en futuras versiones
 
nose que tan eficiente es, pero me funciona:

def Switch(n):
    switch = {
        0: "CERO",
        1: "UNO",
        2: "DOS",
        3: "TRES",
    }
    return switch.get(n,None)
 
7:08 PM
@LucasDamian Sí es típico hacer algo así con diccionarios. Incluso cosas más raras como...
 
@LucasDamian el que llames una variable y una funcion lo mismo lo hace extraño
 
le puse minuscula
podría ponerle otro nombre, pero no se me ocurrió
 
def operacion(op, a, b):
    casos = { "+": sumar, "-": restar, "*": multiplicar, "/": dividir }
    operacion = casos.get(op, None)
    if operacion:
       return operacion(a,b)
    else:
       return "Operación no válida"
 
@abulafia hice algo asi en una respuesta de JavaScript
 
O siendo ya muy críptico:
 
7:10 PM
3
A: ¿como hacer operaciones aritméticas con un cadena?

JackNavaRowAlgo distinto a lo visto: Defines tu Operaciones que hacen (funciones) Asignas un objeto la operación que deseas hacer Llamas a la función la operación que quieres hacer Por ultimo para evitar buscar el primer valor lo asigno inicialmente con el calculo operaciones[arreglo[1]](arreglo[0],ar...

 
return {
   "+": sumar,
   "-": restar,
   "*": multiplicar,
   "/": dividir,
}.get(op, nullop)(a,b)
 
nice!!
 
@abulafia maravilloso
@abulafia lo que puede cambiar @LucasDamian con el switch
 
from operator import (add, sub, mul, truediv)

{
   "+": add,
   "-": sub,
   "*": mul,
   "/": truediv,
}.get(op)(a,b)
Ni siquiera hay que escribir las funciones sumar, etc. están en el módulo operator
 
muy buenoo
 
7:22 PM
@abulafia no existe algo parecido en JavaScript :(
voy a ver en node
 
    estuve como media hora para poder resolver un ejercicio, y un monstruo lo resolvió en 2 lineas..
codewars.com/kata/578aa45ee9fd15ff4600090d/train/python

    from collections import deque

    def sort_array2(array):
        odd = deque(sorted(x for x in array if x % 2))
        return [odd.popleft() if x % 2 else x for x in array]
 
@JackNavaRow no he leído todo el código, pero imagino que está bien estructurado. Lamentablemente el OP no habla de una precedencia estándar, solo indica que las operaciones se realicen de izquierda a derecha. Eso hace sangrar mis ojos.
 
@MauricioContreras jajaja
 
@JackNavaRow igual te di mi +1. Yo porque soy matemático y estas cosas me parecen sumamente interesantes. Ya me monto un algoritmo para eso.
 
Entonces podrás ayudar a un humilde estudiante con matemática
:v
 
7:28 PM
"Chapter 3. Iterating and Making Decisions"
 
@LucasDamian a ver si puedo. Cuenta
 
siempre me confunde los for en python
@abulafia cuando empezaste no te paso lo mismo
 
@LucasDamian Bonita solución
@JackNavaRow Huuy.. ya no me acuerdo hijito :-))
 
@abulafia :'(
 
@JackNavaRow because they are there for a reason
 
7:29 PM
son ejercicios de trigonometria por el momento
 
No, en serio, llevo muchos años con python. Para mi los for del python son más "naturales" que los del C. Esos sí que son artificiales
 
puede ser por eso, cuando veo for como [x in for xxx]
 
for (int i=0;... agg q feo
 
nos vemos hermanos, regreso más tarde
me quedé con 90MB de espacio libre x.x
 
@fredyfx sudo reboot now
 
7:30 PM
El for del python es casi una traducción directa a código del símbolo matemático ∀
 
[i for i in eso] es lo mejor
El otro día hice un loop horrible, me daba asco leerlo, debería buscarlo
 
@abulafia no lo habia visto de esa forma
 
En matemáticas cómo dirías por ejemplo "todos los elementos x del conjunto C", pues así: ∀ x ∈ C
ponlo en inglés: for x in C
y el conjunto de todos los cuadrados perfectos? En matemáticas sería { x² | ∀ x ∈ N }
En python: [x**2 for x in N]
El C en cambio es artificial al obligarte a iterar por los indices en vez de por los elementos
 
claro, yo lo veía como el foreach de c#
o sea, yo solo vi c, c++ c# en la facultad
y lo tenía más asimilado con foreach, es más, habia visto ejemplos que decia for each in elements
 
@abulafia guardando en mi archivo tu grandiosa explicacion , hasta que me la aprenda
@LucasDamian es distinto
porque el orden de declaracion es recorrido iteracion fin.
en este caso comprendiendo un poco mas con la explicacion seria "iteracion de iteracion para todo el recorrido"
bueno.. algo asi, el orden es distinto a lo que venimos programando for (){..}
 
7:41 PM
@LucasDamian Yo no conocía C#, y el resto de lenguajes que usaba no tenían foreach. Echaba de menos esa funcionalidad. Luego se lo añadieron a Java (y creo que a JavaSript también)
 
JavaScript tiene for in forEach y for of
por alli hay una respuesta buena explicando cual es mas rapido
2
Q: ¿Existe una diferencia de rendimiento entre el For clásico y For-in?

n128Sólo quería saber eso, si existe una diferencia significativa entre utilizar un for normal y un for-in al momento de recorrer un Array. Me surgió la cuestión debido a que estaba realizando una revisión a un viejo proyecto (donde utilizaba for-in) y estaba leyendo el articulo de una web que lo p...

 
@JackNavaRow de todas formas cuidado con for. Es un caso de reusar un mismo keyword para dos cosas diferentes. Uno de los usos es para hacer bucles. O sea for variable in iterable: que luego va seguido del cuerpo. Esto es como el foreach de otros lenguajes
El otro uso es para comprensiones de listas que es eso de [x for x in C]. Eso no es un bucle. Es una expresión
una expresión que produce como resultado una lista. Han usado la misma palabra for porque es la que mejor encaja ahí, pero conceptualmente es otra cosa. El primer caso de for es una sentencia, pero este es una expresión de un tipo especial
también el for puede aparecer en lo que se llaman expresiones generadoras
expresion_generadora = (x**2 for x in range(100))
for dato in expresion_generadora:
   print(dato)
observa que hay paréntesis y no corchetes alrededor de la expresión generadora. El resultado no es ahora una lista, sino un generador, Los elementos no se crean y se guardan en la primera línea, sino que se van creando a medida que se van extrayendo luego en el for
es lazy
el generador de este modo no consume memoria. En vez de range(100) podría haber puesto range(10000000) y funcionaría ocupando la misma memoria
no así si fuera una list comprehension, pues la lista resultante tendría 100 elementos en el primer caso, pero 1000000 en el segundo
 
@abulafia entonces lo que me enreda son los conceptos y no el bucle
las expresiones
 
@JackNavaRow Ah, eso puedo comprenderlo. El concepto de comprehension no estaba originalmente en python. Yo también tardé un poco en pillarlo
pero cuando lo pillas te enamora
 
7:49 PM
>>> expresion_generadora = (x**2 for x in range(100))
>>> type(expresion_generadora)
<class 'generator'>
:O ya vi el generador
next(expresion_generadora)
 
es mecánico... al principio cuesta
[i.a['href'] for i in soup.find_all(class_='algo')]
 
siempre he leido que el for implicitamente hace el next(), por supuesto tenia que intentarlo @abulafia ahora lo veo
 
@JackNavaRow bueno, pues aprovechemos que ves la expresión generadora para cerrar. Una list comprehension no es más que una expresión generadora, convertida en lista. Es decir [x**2 for x in range(100)] equivale a list(x**2 for x in range(100))
Esto causa internamente que el constructor de list() haga next() sobre la expresión generadora para ir obteniendo elementos y los va guardando todos en una lista que es lo que finalmente retorna
 
@abulafia es una generador con una conversion a list al final ?
 
@JackNavaRow Si
lista = [expresion_generadora] equivale a
 
7:55 PM
tu defines el generador (x**2 for x in range(100)) luego lo llevas a lista [(x**2 for x in range(100))]
 
Por eso devuelve none?
lista = []
[lista.append(i) for i in range(100)]


lista =[i for i in range(100)]
 
lista = []
for x in expresion_generadora:
   lista.append(x**2)
 
quitando los parentesis que no hacen nada queda [x**2 for x in range(100)]
 
@LucasDamian No, cuidado, esas dos cosas no son equivalentes
[lista.append(i) for i in range(100)] equivale a esto otro
 
pero alli no conviene hacer el append, si retorna una lista
 
7:57 PM
lista = []
dummy = []
for i in range(100):
     elemento = lista.append(i)
     dummy.append(elemento)
return dummy
 
seria mejor lista +=[i for i in range(100)]
 
@JackNavaRow Depende de lo que quieras hacer
 
Bueno, hoy si me voy a dormir temprano. Como dicen en Chile @JuanPerez: Me voy a la ruca ruca
 
En realidad creo que lo que quieres hacer es simplemente
 
lista = ya lo hace
 
7:58 PM
lista = [i for i in range(100)]
 
Hasta mañana muchachos, se me cuidan.
 
pense que era equivalentes
 
@abulafia pero si tiene datos un "+"
 
hasta mañana @MauricioContreras . yo también me voy para la facultad
 
@MauricioContreras duerme
 
7:58 PM
más tarde vuelvo
 
@LucasDamian con el += extiendes la lista original para añadirle la que generas
 
@abulafia es lo que dije profe
 
equivale a lista.extend([i for i in range(100)])
 
1 min ago, by JackNavaRow
seria mejor lista +=[i for i in range(100)]
 
1 min ago, by abulafia
@JackNavaRow Depende de lo que quieras hacer
:-)
 
7:59 PM
explicame que diferencia tiene el extend
 
Vaya me quitaron una válida. Ni idea del porqué. No dejaron mensaje. :(
1
A: realizar esta petición AJAX desde Node.js

Mauricio ContrerasPara armar la petición usando http.request de NodeJS debes entender la solicitud AJAX para poder replicarla en Node. Básicamente realizas una solicitud de tipo GET, a una URL dada. En dicha solicitud envías una cabecera de autorización personalizada la cual contiene el token. Además esperas que ...

 
extend sólo puedes hacerlo sobre una lista
le añade elementos a esa lista
 
@abulafia y el + no lo hace?
 
lista = [1,2,3]
lista.extend([4,5])
por ejemplo
Sí, lista += otralista es "syntactic sugar" para lista.extend(otralista)
 
ahora comprendo las expresiones generadoras!
 
8:01 PM
pero si quieres generar una lista con los números del 1 al 10, por ejemplo, basta lista = [i for i in range(10)]. No veo sentido el += ahí
 
no son los for
 
ya que el segundo miembro de la asignación ya es una lista con 10 elementos
 
@abulafia asumiendo que tenga mas datos
 
no es un for que los vaya añadiendo uno a uno. Es una expresión que directamente genera la lista completa
también es azucar sintáctico en realidad, ya que lo mismo puedes hacer con un bucle for corriente y lista.append()
en general lista = [expresion for variable in iterable if condicion] (que es la forma más general de una list_comprehension) no es más que azúcar sintáctico para el bucle más convencional siguiente:
lista = []
for variable in iterable:
   if condicion:
      lista.append(expresion)
así, para generar una lista con los múltiplos de 3 menores de 100, harías [x for x in range(100) if x%3==0]
no me digas que no mola!
 
ahora @abulafia tu puedes definir tu generador generador = (x **2 for x in lista)
y como no tienes lista cargada no lo vas a llamar hasta que la lista cargue
 
8:05 PM
lista podría ser a su vez otro generador!
 
@abulafia ya estas hablando parsel
vamos mas despacio
 
mira, un generador de los múltiplos de 3 menores de 100:

gen1 = (x for x in range(100) if x%3 == 0)
Y ahora otro que eleve al cubo los elementos de otro iterable
gen2 = (x**2 for x in gen1)
y ahora un bucle normal que lo imprima:
for dato in gen2: print(dato)
 
genial
 
la evaluación es lazy
la operación x%3 no se ha hecho todavía ni una sola vez hasta que no llegas al último for que escribí
 
javascript tiene algun metodo similar al isUpper() isLower()
?
como puedo saber si un caracter es mayuscula o minuscula
 
8:09 PM
y for dato in gen2: print(dato) no puede ser otro iterable intente [x for x in gen2]y nada
 
cuando ese último for hace next()para obtener el siguiente elemento, es cuando se evalúa por primera vez el x%3, se genera el primer elemento del primero generador, que sale 0, luego se evalúa el x**2 del segundo, que sale 0, se imprime el 0, y luego se descarta todo antes de pasar a la siguiente iteración. Ninguno de esos datos está ocupando memoria más allá de una iteración
 
@IsraelGonzález si tiene el ToUpperCase
 
@JackNavaRow Sí ,claro
también puedes hacer list(gen2)
y eso creará una lista con los resultados de iterar sobre gen2
 
q hago comparo con el toUpperCase()
si quiero saber si es mayuscula o minuscula como hago
 
@IsraelGonzález expresiones regulares
 
8:11 PM
si hago toUpp.. no se su estado anterior
mm
 
@IsraelGonzález if letra == letra.toUpperCase() no vale?
 
@abulafia no me funciona la expresion :(
 
@JackNavaRow Cuál
@JackNavaRow Ah! Cuidado. Ya sé qué puede pasarte
una expresión generadora no puede "reciclarse". Una vez lo has consumido, se acabó
si iteraste sobre gen2 y luego haces list(gen2), te sale la lista vacía
 
si
funciona asi
 
@abulafia ya vi el error!, era yo
como ya hizo el iterador supongo que al ejecutarlo nuevamente esta en la ultima posicion
 
8:14 PM
por eso a menudo se prefiere usar una list comprehension para guardar los resultados en una lista, sobre la que puedes iterar cuantas veces quieras
@JackNavaRow Efectivamente
 
>>> [x for x in reversed(gen2)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not reversible
@abulafia , queria tomar un atajo a ver
 
@JackNavaRow Claro, no puedes dar la vuelta a un generador porque es lazy
Pero esto sí: [x for x in reversed(list(gen2))]
 
@abulafia en temas de optimizacion , no es mejor hacerlo al final?
reversed([x for x in gen2])??
o es lo mismo?
claro eso depende que operacion hago antes o despues
 
abulafia
ustedes estan siempre online en la pagina?
 
@IsraelGonzález mira este enlace
en la parte derecha esta la hora que habitualmente se conecta la persona
o en la parte de abajo
 
8:20 PM
@JackNavaRow Pues sí, depende. Si usas "filtro" (lo de poner un if dentro de la expresión), la lista final tendrá menos elementos, así que vale más convertirlo en lista al final y no al principio, para ahorrar memoria
 
@JackNavaRow Por cierto, antes te dije que las "list comprehension" eran simple syntactic sugar equivalente a un for "normal" que hiciera .append() para ir añadiendo a la lista. No es del todo cierto. La "list comprehension" es más rápida por la forma en que se convierte a bytecode
 
ya veo esta bueno eso
tienen un seguimiento de la persona
 
@abulafia supuse que me dijiste para comprender mejor, porque si vez el codigo evitas declaraciones de variables
segun el grafico @abulafia procrastina mas los Lunes
 
@JackNavaRow Bueno, la variable la vas a usar al final, porque el resultado de la list comprehension querrás asignarla a algo. Si no se pierde
 
8:23 PM
serian los martes en la zona horaria que se encuentra stackoverflow
 
así que siempre tendrás algo como lista = [ expresion generadora ]
 
@abulafia claro, por eso y que trabaja en bytecode tiene que ser mas rapido
al fin comprendo mejor las expresiones generadoras ; me confundia con los for
 
Un antipatrón que he visto por ahi bastante, entre quienes acaban de descubrir las list comprehension y se emocionan demasiado con ellas (y quizás las confunden con los for), es el siguiente:
[ print(x) for x in lista ]
en vez de
for x in lista:
   print(x)
¿por qué es un antipatrón? (ejercicio para el lector)
 
es que lo que he leido que es una abreviatura del for
pero no lo es, es algo distinto
@abulafia pero alli no trae nada la lista o si?
si hipoteticamente asignamos algo aqui [ print(x) for x in lista ]
 
Supon que lista tiene [1,2,3,4] y el usuario hizo esa comprensión para imprimir los valores, en vez de un bucle for normal ¿por qué no es (formalmente) correcto?
aunque funcionaría...
@JackNavaRow Inténtalo y verás
 
8:27 PM
@abulafia es para que esta hecho , me imagino que es una herramienta distinta
@abulafia lo acabo de hacer , coloca None a los valores
 
lista = [1,2,3,4]
[ print(x) for x in lista ]
@JackNavaRow Claro! Porque lo que está generando esa expresión es la lista de valores retornados por print() para cada elemento de la lissta
Y print() es void...
piensa en [math.sqrt(x) for x in lista]
puedes usar llamadas a funciones en la expresión, si lo que quieres es los resultados devueltos por esas funciones. Pero no tiene sentido con print() porque no devuelve nada
y la expresión [print(x) for x in range(1000000)], imprimirá un millón de números, sí. Pero también creará una lista con un millón de None, para nada
desperdicio de memoria
 
en cambio la forma habitual no ocupara memoria
 
efectivamente
 
@abulafia el primero mientras itera va cargando en memoria, el otro no
 
@JackNavaRow El primero tiene como objetivo fundamental crear una lista. ¿Con qué valores? Con los que vayan saliendo al evaluar la expresión que se da tras abrir corchete. Esa expresión es print(), que devuelve None, así que irá guardando todos esos None en una lista
El objetivo es crear listas, pero en este caso lo estábamos usando mal, pues no queremos crear una lista, sino imprimir los contenidos de otra
 
8:36 PM
@abulafia vi como se incrementaba la memoria, hice la prueba de los 1000000
 
casualmente funcionaba para nuestra meta (imprimir) pero con un efecto secundario invisible. La memoria se va consumiendo durante el bucle
por suerte una vez terminado se libera, porque esa lista no se asigna
el recolector de basura detecta que no hay variables que la usen, y la borra
 
@abulafia imagina que este trabajando en una raspberry pi 3A
solo tienen 500 megas de RAM
 
puede ocurrir que te quedes sin memoria a mitad del bucle
y todo porque, aunque ambas formas usan la palabra for, no son para nada lo mismo
 
@abulafia es mas de comprensión del for
de hecho en la raspberry 3A me pasa mucho quedarme sin memoria, claro tiene interfaz grafica
ya vi algo que no se debe hacer
 
I'm back!
 
8:40 PM
bueno me tengo que ir, gracias por explicarme @abulafia ya comprendi bien la diferencia, sin tener que leer el capitulo 3
 
@JackNavaRow ;-)
Yo también me voy
 
igual lo voy a leer, @abulafia asi dice el grafico ya es la hora de irnos, y tu estaras oculto en tu madriguera
@fredyfx hola y chao
 
como puedo hacer para saber de un arreglo de numero todas las combinaciones q sumadas dan un numero
@JackNavaRow @abulafia ustedes saben gg
 
@JackNavaRow nos vemos hermano, que te vaya cheeere :D
@IsraelGonzález ¿matemáticamente ya lo hiciste?
 
no
estoy preguntando me hace falta
 
8:59 PM
no, estoy preguntando, me hace falta
vs
no estoy preguntando, me hace falta
----
El poder de una coma cambia mucho
 
@fredyfx jaja, gracias.. el problema que comente, sabes algo; por casualidad...
 
@IsraelGonzález backtracking?
 
@gbianchi ni idea
 
@IsraelGonzález google es tu amigo...
 
vale vale buscare
 
9:18 PM
@IsraelGonzález con cariño hermano :D
@gbianchi y tu mejor espía :v
 
@fredyfx :)
 
9:40 PM
@Aritzbn Y porque no hombre :v
Buenas tardes gente
 
9:51 PM
saludos @DanielAlejandroIglesiasFerm
 
10:48 PM
@fredyfx hola seguis por aqui?
 
@FRANCISCOJ.BLANCO afirmativo
 
que bien hombre
Me vas a ayudar con algo
?
no se demora
:D
@fredyfx Tengo un proyecto que tiene data, bussines, Entities y Los controladores en C# las vistas las manejo en angular que tipo de arquitectura sera ese proyecto ?
 
N-Layer
¿Hay alguna capa que diga "dominio"?
 
ummm no
señor
 
hay 2 cosas que tienen que quedar claro
 
uno es la arquitectura del sistema
 
y el otro es la arquitectura de la capa de presentación
 
me refiero es to
mira
 
tienden a confundirse
 
10:56 PM
ok
En las carpetas de Bussines, Data, y Entities (Base de datos) solo hay bibliotecas de clase
 
de los sistemas más crítico que he visto, 2 capas: datos y presentación, a veces en la capa de datos la lógica de negocio, a veces en la presentación... y aún así funcionaba esa empresa
¿Hay repositorio?
 
si Git
y subversion
 
bien
hay interfaces?
 
si claro , cada carpeta tiene interfaz y implementacion
 
perfecto
eso es bueno
 
ahora, ¿por qué me preguntas sobre la arquitectura?
 
Tengo una visita se la supersolidaria , mejor dicho un auditor a nivel empresarial y no se como se llama este tipo de arquitectura
@fredyfx
 
Puedes decir que estás usando N-Capas
 
para dar el tipo de arquitectura que utiliza mi empresapor si preguntan
una arquitectura a N capas ?
 
La programación por capas es un modelo de desarrollo software en el que el objetivo primordial es la separación (desacoplamiento) de las partes que componen un sistema software o también una arquitectura cliente-servidor: lógica de negocios, capa de presentación y capa de datos. De esta forma, por ejemplo, es sencillo y mantenible crear diferentes interfaces sobre un mismo sistema sin requerirse cambio alguno en la capa de datos o lógica. La ventaja principal de este estilo es que el desarrollo se puede llevar a cabo en varios niveles y, en caso de que sobrevenga algún cambio, solo afectará al…
revisa hermano
 
11:01 PM
@fredyfx Muchas gracias Men
voy a revisar
 
revisa este enlace también
 
Listo men muchas gracias
 
con cariño hermano
si algo puedo ayudar, ahí estoy
 
11:47 PM
@fredyfx hermano :D andas por acá?
Andaba bastante perdido estos dias, me bloquearon el chat de SOes en el trabajo XD
O alguien que me resuelva una pequeña duda, me propusieron un proyecto, en el cual quieren una aplicación de escritorio responsiva...
 
@L.Ronquillo afirmativo o/
 
Sé que WPF me sirve para eso, quiero hacerlo con MVC, consulté con un compañero del trabajo y me dice que la única forma de hacer eso es con silverlight, pero que no es nada recomendable
Pd: en c#, olvidé ese pequeño detalle
 
Silverlight?
Brother, eso es legacy
fue una tecnología muy buena, muy prometedora
perdió contra la simplicidad de javascript y el team HTML5
por el simple hecho que tenía que haber un plugin
vas a tener que evaluar muchas cosas
por cierto @FRANCISCOJ.BLANCO este enlace también te ayudará, es vital que lo leas
 
Ya es legado? Jajaja, estoy de camino a casa, no he investigado al respecto
 
silver para escritorio??? why?!?!?!??????
 
11:58 PM
Quiero usar un patrón de diseño adecuado para una aplicación de escritorio, es todo
Pues eso me comento un Sr de donde trabajo, pero pues el me dijo que no tire por ahí, que busque otra cosa
 
y si wpf cumple con eso porque necesitarias otra cosa?
que no tires por ahi?? yo tengo una hermosa app de escritorio hecha en wpf con material design.. que es re linda visualmente...
 

« first day (1424 days earlier)      last day (1691 days later) »