[Python] Hilo general

CiudadanoEj

#1799 y por que usas el indice??
si es un diccionario con que pongas burger['burger'] ya tienes ternera con el indice lo unico que haces es coger la primera letra de la palabra ternera osea la t

1 respuesta
1mP

#1801 uso el índice porque burger tiene dos valores: Ternera y Pollo 😅

1 1 respuesta
CaNaRy_r00lz

#1802 eh y donde esta la opcion vegana? discriminando eh? xdd

1 2 respuestas
smarquezp

Buenas gente! Por aquí uno que se va a empezar a unir al maravilloso mundo de Python. Le llevo dando vueltas mucho tiempo con el tema de ciberseguridad y ahora que se ha juntado también con la IA, voy a darle un try a investigar a fondo.

Hace tiempo ya hice un curso de Python en Udemy pero era más aplicado a matemáticas y no me enteré de nada. Ahora quiero darle y pasarme poco a poco a este.

Empieza la aventura! A ver que tal me va con los 100 días de Heung-min Son.

1 respuesta
ercabesa

#1804 si te quieres tirar por ia/machine learning tirate directamente por las bibliotecas que se usan para ello en cuanto acabes las bases de python, claro.

Pero usar las librerías de scikitlearn, numpy, pandas, matplotlib, keras etc es casi como aprender un lenguaje nuevo

1
1mP

#1803 es mi hamburguesería y me la follo cuando quiero jajajajaja

1
1mP

.

1mP

Tengo un problemilla a la hora de importar un archivo en mi aplicación. Hasta ahora tengo dos archivos: app.py y archivo_funciones.py. En este ultimo tengo solo las funciones a pelo, no hay nada mas.

Creo que tengo localizado el problema pero no sé cómo arreglarlo. Estos son los errores:

line 85, in <module>
    adding_to_cart(burger_select, burger, "burger")
line 35, in adding_to_cart
    order.append(product[sub_product][0])
NameError: global name 'order' is not defined

Por lo que parece, es un error con la funcion de archivo_funciones.py llamada adding_to_car, y es tal que así:

def adding_to_cart(option_select, product, sub_product):
    global price
    global order
    global products_price
    if option_select == "1":
        order.append(product[sub_product][0])
        products_price.append(product["price"][0])
        price += product["price"][0]
    
if option_select == "2": order.append(product[sub_product][1]) products_price.append(product["price"][1]) price += product["price"][1]

Este código lo que hace es añadir los productos a dos listas vacías, ademas de ir sumando precios en una variable.

Creo que algo se está importando mal o le está faltando información a uno de los dos archivos. Pongo como empieza el inicio de app.py, porque creo que el problema está por ahi:

import sys
from archivo_funciones import *

#Precio final
price = 0
#Pedido
order = []
#factura
products_price = []

#Diccionario de productos
burger = {"burger" : ["Hamburguesa de ternera", "Hamburguesa de pollo"],
          "price" : [8.95, 7.95]}
chips = {"chips" : ["Papas Baston","Papas Gajo"],
         "price" : [1.95, 2.25]}
soda = {"soda" : ["Refresco de Naranja", "Refresco de Limon"],
        "price" : [2.45, 2.45]}
dessert = {"dessert" : ["Helado de chocolate", "Tiramisu"],
           "price" : [2.95, 3.95]}

De ahí es de dónde adding_to_cart esta cogiendo la información.

Le he tirado el codigo varias veces al chat de Bing y me ha dado diferentes soluciones:

  1. Poner global order dentro de la funcion, que ya estaba añadido.
  2. Añadir
    order = []
    al principio del codigo de app.py, pero nada.

He probado a meter las listas y variable vacias del prinicipio de app.py dentro del archivo de funciones, pero al final no me estaba sumando nada y el codigo se quebraba.

¿A alguien se le ocurre algo?

Si no tendré que meter todo en un unico archivo y a tomar por saco :sweat_smile:

Muchas gracias!

edit: Estoy usando Python 2.7. Si, deberia de usar Python3 pero es lo que me están pidiendo en el curso que estoy haciendo.

3 respuestas
Lolerpopler

#1808 El problema es que no usas bien global. Declarar una variable como global sirve para que una variable que creas dentro de una funcion sea global, que la puedes utilizar en otras partes.

En tu caso ya estas declarandola al principio del modulo, fuera de las funciones asi que no necesitas declarar la global dentro de adding_to_cart. Simplemente tienes que usar la variable que ya has definido.

Hago un pequeño edit:
No uses from x import * importa explicitamente lo que necesites
Me he dado cuenta al volver a mirar (si no lo he entendido mal) que la declarion y el uso es en diferentes modulos. Has importado la variable order en el segundo?

1 3 respuestas
Kaiserlau

#1808 que mas tienes en app?

Yo no aria asi. Si quieres los diccionarios hardcodeados yo los pondría en una .py aparte o mejor un json etc, tal vez recetas y precios separados, nuse. Luego en archivo_funciones.py solo funciones, y en app la lógica de tu app. Para eso no necesitas globales ni nada, es liarte para nada.

Also #1809. Importa unicamente solo las funciones que necesites, explícitamente. En archivo de funciones solo funciones.

(al hacer import te carga todo el archivete sin cargarte absolutamente nada de lo que te cae después)

1 1 respuesta
1mP

#1809 He quitado los global y aún persiste el problema :/

#1810 Esa era mi idea, empezar a desmontar el codigo en archivos a parte y estaba empezando con las funciones. Pero voy a hacer lo que dices a ver si tira. Y en app pues tengo 3 if principales, el que importa es el que lleva a la seleccion del menú. Y tengo estas cosas.

    select_product("hamburguesa", burger, "burger")
    burger_select = raw_input("-----> Su seleccion es: ")
    keep_until_right(burger_select)
    
# Anyadir producto y precio a factura - Hamburguesa adding_to_cart(burger_select, burger, "burger")

Como este codigo, tengo varios para papas, refresco y postre.

Luego varias cosas mas (calculo de descuento, la factura final y chorradillas). Pongo el codigo completo en un NSFW por si quieres echarle un vistazo más en profundidad (200 lineas):

app.py

Y de paso el

archivo_funciones.py
1mP

#1809 Si he importando la variable

order

en archivo_funciones? No :/

Y como seria el import? Es que voy a usar todas las funciones en app.py.

el import seria:
from archivo_funciones import adding_to_cart, etc, etc.. ? Y meto todas?

2 respuestas
1mP

Perdón por el triple post, pero he hecho lo que sugeríais y sigue pasando lo mismo. Exactamente los mismos errores :disappointed_relieved:

Kaiserlau

#1812 cuando tengas funciones así, que necesites hacer algo con X pasa ese X directamente. Y devuelve el resultado que sea que esperes.

pd: No he mirado el código. Lo digo porque cuanto mas inertes sean mejor.
pd: Todo el texto de los menús también puedes meterlos en archivo aparte.

1 respuesta
1mP

#1814 No problem, bastante es que ya me estáis respondiendo jajajaja.

Perdona mi torpeza, pero, te refieres a que si mi funcion adding_to_cart necesita la lista vacia, por ejemplo, order = [] se la meta en el archivo de las funciones?

1 respuesta
Lolerpopler

#1812 Si, tal cual, las importas una a una. Puede parecer coñazo o que es mucho "escribir" pero te va a facilitar la vida. SI importas todo, puedes pasarte un buen rato tratando de buscar un circular import que nunca encuentras porque has importado sin querer una funcion que no usas.

Mis recomendaciones:
1- Empieza a usar github o gists para compartir codigo, mediavida no es la mejor plataforma para leer tu codigo.
2- Creo que no necesitas globales o variables en global scope. En general, evita mutar (modificar variables que pasas a funciones) y simplemente asegurarte de que las funciones devuelven un resultado.

Creo que puede ser otro problema de la forma en que usas los imports.
Defines order en fichero A, pero las funciones que usan esa variable estan en el fichero B. Y lo que haces es importar las funciones de B en A pero B no sabe que es order, tendrias que hacer el import al reves para que funcionase. Tal como lo tienes tampoco puedes importar order en el fichero B porque te quedaria un circular import.

Lo mas facil. Cambia las funciones para que acepten la variable order en los parametros en vez de acceder a ella de forma global

1 1 respuesta
Kaiserlau

#1815 Si, que te haga la suma del precio de esa orden y devuelva el total, con la lista/diccionario nose de esa orden. Y vas sumando a un total de su pedido que tendrás en app con su factura completa. No se si me he explicado xd.

pd: es un buen ejercicio para aprender, keep going :muscle: :snake:.

1 1 respuesta
1mP

#1816 #1817

Muchisimas gracias!!!! Lo he arreglado. He hecho lo de meter las variables price, order y products_price en archivo_funciones. Me daba problemas a la hora de hacer la suma (resultado 0) y he hecho que price fuese una lista vacia, y he metido los precios ahí. Luego un sum(price) y ya está todo correcto. He quitado los globals y genial.

1
werty

#1808 yo reescribiría el código, sinceramente, para hacerlo más simple.

El concepto más básico de una función es:
dame X y te devuelvo Y.

Aquí veo que esta un poco más enrevesado (se asemeja más al tipo de función que hay dentro de una clase)
Tus funciones no devuelven nada en sí, modifican una variable global.
La entrada a tus funciones es un mix de inputs + variables globales.

Por otro lado simplificaciones:
1.
los "checker_while = True" los veo feos.
Haría solo un while True:

Y cuando quieras salir, metes un break.

2.

 
def adding_to_cart(option_select, product, sub_product):
if option_select == "1":
order.append(product[sub_product][0])
products_price.append(product["price"][0])
price += product["price"][0]


if option_select == "2":
    order.append(product[sub_product][1])
    products_price.append(product["price"][1])
    price += product["price"][1] 

Sin haberme leído todo el código, ¿no suena mejor algo como?:

def adding_to_cart(option_select, product, sub_product):
item = option_select - 1
order.append(product[sub_product][item])
products_price.append(product["price"][item])
price += product["price"][item]
1 1 respuesta
1mP

#1819 Y si te digo que gracias a ti sé para qe es una funcion realmente? Así es mi nivel de Python jhajajajaja.

Pero si, tienes toda la razón. Ahora mismo me está funcionando el codigo no sé ni como. Tengo un pequeño problema que intentaré resolver mañana, pero seguramente acabe haciendo los cambios que dices.

Muchisimas gracias por comentarlo!

1 respuesta
werty

#1820 lol 🤣, pues sí, lo primero que se aprende sobre una función es el "return".

Lo típico:
función que multiplica X e Y y te devuelve la X*Y

Luego, obviamente, se puede complicar mucho más. Pero yo creo que en tu caso, especialmente siendo funciones definidas en otro módulo que estás importando, es importante que trabajen con variables locales, para que se puedan reutilizar.

1 mes después
fkdlzh

por que cuando me ordena la lista me pone un jim en index 0 y otro en index 3?

friends = ["Kevin", "Karen", "Jim", "Oscar", "Tobby", "Jim"]
friends.reverse()
print(friends)

1 respuesta
eondev

#1822 estás haciendo un reverse

1 respuesta
fkdlzh

#1823 crei que era el opuesto a ".sort" y que lo ordenaria a la inversa alfabeticamente.

gracias por la aclaracion

1
7 meses después
yeallow

¿Sabéis de algún curso interesante para iniciarse en el tema?
Estudié algo de programación en su día, pero lo tengo bastante olvidado y quería ponerme de nuevo para actualizar conocimientos.
He visto que hay cursos gratuitos a patadas, pero el problema es que al no tener conocimientos del tema no sé discernir lo que vale y no vale la pena hacer.

2 respuestas
Dr_Manhattan

#1825 https://www.udemy.com/course/100-days-of-code/?couponCode=LETSLEARNNOWPP

De aquí a un año me cuentas

1 1 respuesta
gonya707

#1825 el curso que te recomienda #1826 tiene su propio hilo y puedes leer impresiones ahi de gente que lo ha hecho

https://www.mediavida.com/foro/dev/100-days-of-code-the-complete-python-pro-bootcamp-for-2022-679391

Yo te lo recomendaría si es tu primer contacto con la programación, así en general

2
21 días después
R

Estoy intentando crear un scrsper con beautifulsoup pero la web me está tirando 403 todo el rato(detecta que es un bot) no se cómo porque solo estoy haciendo 1 petición.

He probado meter simular una conexión real con los headers como he visto por stackoverflow pero no consigo que funcione.

Alguno ha tenido un problema similar

1 respuesta
eondev

#1828 usa cookies tuyas de navegador con header de tu navegador, 99% sirve para saltarse el bloqueo xD

1 1 respuesta
gawain

#1829

mmmh no se, yo con idealista, por ejemplo, no he podido. Creo que tienen algún otro tipo de script por encima

2 respuestas