[Python] Hilo general

KooPad

#180 Muchas gracias, no acababa de entender la funcionalidad de la expresión anterior al for.

Phatality

#179 Es una feature que Python copió en su momento a Haskell, un lenguaje más orientado al paradigma funcional. Se llama list (o dictionary, si se tercia) comprehension.

1 1 respuesta
Vashealer

#179 como bien te han dicho son list comprehension, te recomiendo que las estudies ya que son una de las herramientas más potentes de python. Una vez lo aprendas no podrás parar :P

Es muy similar a una expresión matemática. Te dejo un link interesante que habla sobre el tema : http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Comprehensions.html

Saludos !

1 respuesta
KooPad

.

Phatality

Hay alguien que haya usado funciones generadoras o generadores a secas? En qué situaciones a parte de cuando no quieres recorrer todo el iterable de golpe vale la pena usarlas?

2 respuestas
HeXaN

#185 Cuando quieres hacer un contador infinito o un contador que sea una función xD Pero vamos, eso cae uno mientras programa.

Vashealer

#185 Sin ir más lejos para hacer una clase iterable puedes utilizar un generador y controlar cómo se recorre definiendo la magic function :

__iter__()

Resumiendo, un generador es una función que te devuelve un objeto en el que puedes llamar a next() hasta que acaba la iteración. La forma de iterar es lazy, es decir, no guardas todo el resultado en memoria.

En muchos ORMs se usan generadores para recorrer resultados.

Esta respuesta de stackoverflow explica bastante bien el concepto :

Saludos!

Chupachota

Buenas a todos, tengo un problemilla y ya que no tengo ni idea de python, a ver si podriais echarme una mano.
El caso es que me estoy haciendo un invernadero automatizado para mi coleccion de plantas carnivoras, de momento solo le voy a poner control de la temperatura, mas adelante irán mas cosas y funcionará mediante una RPi.
El problema me viene porque tengo que crear unas bases de datos para almacenar las temperaturas en le interior y en el exterior del invernadero y que con un script se vayan llenando, como no tengo ni idea de Python he utilizado un script que encontre por internet, es este:

#!/usr/bin/python

import requests
import hashlib
import time

sensorids = ["28-00000523e071", "28-0000052391f2"]
avgtemperatures = []
for sensor in range(len(sensorids)):
temperatures = []
for polltime in range(0,3):
text = '';
while text.split("\n")[0].find("YES") == -1:
tfile = open("/sys/bus/w1/devices/"+ sensorids[sensor] +"/w1_slave")
text = tfile.read()
tfile.close()
time.sleep(1)

secondline = text.split("\n")[1]
temperaturedata = secondline.split(" ")[9]
temperature = float(temperaturedata[2:])
temperatures.append(temperature / 1000)

avgtemperatures.append(sum(temperatures) / float(len(temperatures)))

interior = avgtemperatures[0]
ambiente = avgtemperatures[1]

import MySQLdb
db = MySQLdb.connect("localhost","root","secreto","Temperaturas")
cursor = db.cursor()
cursor.execute("""INSERT INTO temps (temp1,temp2) VALUES (%s,%s) """,(interior,ambiente))
db.commit()import requests
import hashlib
import time

sensorids = ["28-00000523e071", "28-0000052391f2"]
avgtemperatures = []
for sensor in range(len(sensorids)):
temperatures = []
for polltime in range(0,3):
text = '';
while text.split("n")[0].find("YES") == -1:
tfile = open("/sys/bus/w1/devices/"+ sensorids[sensor] +"/w1_slave")
text = tfile.read()
tfile.close()
time.sleep(1)

secondline = text.split("n")[1]
temperaturedata = secondline.split(" ")[9]
temperature = float(temperaturedata[2:])
temperatures.append(temperature / 1000)

avgtemperatures.append(sum(temperatures) / float(len(temperatures)))

interior = avgtemperatures[0]
ambiente = avgtemperatures[1]

import MySQLdb
db = MySQLdb.connect("localhost","root","secreto","Temperaturas")
cursor = db.cursor()
cursor.execute("""INSERT INTO temps (temp1,temp2) VALUES (%s,%s) """,(interior,ambiente))
db.commit()

Está saado de aquí: http://www.tundra-it.com/raspberry-pi-termometro-y-control-web-de-la-casa/

Al no funcionarme con lo que yo había hecho decidí hacerlo todo tal cual estaba ahí, pero seguia sin funcionar, y el problema era el mismo, así que volvi a mi idea original de crear las bases de datos directamente con el script.

El error al ejecutarlo me lo da en la linea 10:

temperatures = []

A ver si podeis echarme una mano a solucionarlo. A partir de este pequeño proyecto espero aprender algo de python, pero si me podeis echar una mano y solucionar esto para poder continuar me hareis un gran favor.

Gracias.

2 respuestas
HeXaN

#188 ¿Tienes el código con los cuatro espacios de rigor?

1 respuesta
Chupachota

#189 Era eso, joder, no se me hubiera ocurrido en la vida que por no poner el sangrado no funcionase, muchisimas gracias.

1 respuesta
HeXaN

#190 Claro, es como si en C++ no pones los curly braces xD

1 respuesta
Chupachota

#191 Me dejas igual, a mi me sacas de HTML5/CSS y un poco de bash y estoy perdido.

1 respuesta
m4andg4

#192 es como si en bash no respetas los espacios de las sentencias if, for.... *fixed.

Phatality

#188 No uses esa librería para hablarle a MySQL, te recomiendo o bien pymysql o bien sqlalchemy. Luego, al margen de eso, te recomendaría que fueras metiendo las operaciones en funciones. Todo seguido ahí a saco queda como caótico. Y eso es todo echándole un vistazo diagonal.

Chupachota

Muchas gracias a todos, por las respuestas. El primer error era lo que HeXaN decía y está solventado sin problemas, ahora como bien ha indicado Phatality hay un problema con MySQL y no funciona, así que probare lo que me ha dicho, sobre lo de meterlo todo en operaciones tb tendre que estudiarlo a ver como va eso.

Gracias a todos, si tengo mas problemas pues ya os ire comentando.

1 respuesta
Phatality

#195 Es más, te recomendaría que usaras pandas, una librería de estructuras de datos que te va a facilitar muuuuucho la vida, sobretodo para manipular datos procedentes de bases de datos relacionales.

En concreto, en tu ejemplo podrías hacer

import sqlalchemy as sal
import pandas as pd

engine = sal.create_engine('mysql+mysqlconnector:meteaquituhost/nombredetubasededatos')

query="select * from blablabla;"
resultao_query=pd.read_sql(query,con=engine)

Y en resultao_query tendrás lo que se conoce como DataFrame, que básicamente una tabla muy fácilmente filtrable, agrupable, cruzable, etc etc. Un plagio (bendito plagio) al Data Frame de R, btw.

1 respuesta
Chupachota

#196 Al final he conseguido que funcione modificando un poquito algunas cosas, además de python no tengo ni papa y estoy aprendiendo, escapa a mis posibilidades de momento, pero lo tendre en cuenta para las proximas versiones ya que tengo pensado ir ampliando el invernadero poco a poco con otros sensores y mas cosas y seguramente empezare de nuevo.

mortadelegle

Acabo de ver este hilo, y no he leido nada de lo mio, ninguno hace Datascience?

Yo estoy este verano haciendo unas prácticas y estamos migrando el código de MATLAB a Python, y tras pasar el tipico código legacy horrible de cientificos a Numpy, Pandas y compañia resulta que iba como un 25% mas lento, y me puse a mirar posibles optimizaciones.

Probando al final opte por numba y, joder, es la leche, aunque quizás para producción no esté en el punto de madurez que debería si tienes localizados los bottlenecks pueden darte un empujón muy interesante, y los más importante, con un simple @jit.

Si necesitais ese extra de performance considerarlo, hay benchmarks de que da resultados similares o incluso mejores a cython sin el coste de escribir cython, f2py, weave, ctypes, etc.

2 respuestas
HeXaN

#198 ¿Estáis usando GPU o tiráis únicamente de CPU?

1 respuesta
mortadelegle

#199 Casi todo CPU, se que hay algo de código CUDA por ahí, pero no estamos haciendo Deep Learning/Redes neuronales y la mayoría de proyectos los corremos en un cluster propio.

Phatality

#198 Yo hago DS y estoy con python todo el día ;D Aunque uso python más para hacer pipelines que para tirar cálculos gordos. Para esto último estoy más acostumbrado a R, que tiene más librerías especializadas.

B

Os dejo esto por aqui que he encontrado en reddit.

10 interesting Python modules to learn in 2016
http://www.discoversdk.com/blog/10-interesting-python-modules-to-learn-in-2016

Tirik

¿Alguna forma fácil/rápida de instalar paquetes en un servidor sin acceso a internet?

Estoy a punto de cortarme las venas con las dependencias de Scrapy y las dependencias de sus dependencias y así hasta el infinito.

1 respuesta
HeXaN

#203 Échale un ojo a esta respuesta de SO: http://stackoverflow.com/a/11092043

1 respuesta
SillaSentada

#15 boa
edit.: paiton

Tirik

#204 es lo primero que probé, en cuanto se pone a buscar las dependencias, me dice que service_identity no lo encuentra, y es uno de los paquetes que tengo dentro de la carpeta de las dependencias. Si intento instalar service_identity solo, empiezo con el festival de dependencias.

Perrofeo

Estaba pensando en aprender python y tengo algunas dudas.

-¿2.7 o 3.5?
-¿Alguna IDE recomendada? Por comodidad, ya que he programado en android studio y tal he estado trasteando con pycharm, lo importante es que esté en linux, porque trabajo en linux normalmente.
-¿Alguna guía recomendada? Empecé con https://learnpythonthehardway.org/ pero es super repetitiva al principio y me bajaba la moral.

Gracias y un saludo.

1 respuesta
B

python 3+ a menos que necesites librerías que no tengan el port aún (que si estás aprendiendo raro sería el caso)

IDE pycharm si estás acostumbrado a android studio te va a venir bien, aunque por aquí también te dirán que uses intellij idea (el de java de jetbrains) con plugins para python

y guía si ya sabes orientada a objetos e imperativa no vas a necesitar, pero tampoco sé recomendarte tbh

HeXaN

#207 Python 3, PyCharm y si ya sabes programar en cualquier otro lenguaje puedes empezar algún proyecto e ir mirando la "pythonic way" de hacerlo.

Perrofeo

Yo he programado en android pero soy físico, hice las prácticas externas en una empresa y lo que me dio tiempo a aprender en el mes que he estado trabajando.

Yo tengo un problema en el sentido de que me das un método matemático y te hago lo que quieras, te lo programo y probablemente eficientemente, pero me falla toda la base de conexiones http, estructura de programación, usar librerías, bases de datos y tal, aunque la verdad, en las prácticas de android he aprendido un montón en ese aspecto, sigue siendo mi principal fallo.

Así que sobretodo busco eso, aprender a usar librerías y hacer proyectos que no sean solo implementar el método de runge-kutta o derivados.

3 respuestas

Usuarios habituales