Autor Tema: El return no define una lista de una función

0 Usuarios y 1 Visitante están viendo este tema.

22 Noviembre, 2020, 03:51 am
Leído 2739 veces

Quema

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,974
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
def whiles():
    name=''
    age=''
    lista=[]


    while name!='detener' and age!='detener':
        name=input('Ingrese nombre: ')
        age=input('Ingrese edad: ')
        if name!='detener' and age!='detener':
            edad=int(age)
            lista.append((name,edad))
    return lista
whiles()

dic=dict(lista)
dic

Cree una lista ingresando datos. Quiero afuera de la función crear un diccionario con la lista, pero me dice que no está definida, por más que haya puesto un return dentro de la función. El error que me aparece es

NameError: name 'lista' is not defined

22 Noviembre, 2020, 04:49 am
Respuesta #1

ingmarov

  • Moderador Global
  • Mensajes: 5,423
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Hola Quema e hija

Es bueno que nos avises si las respuestas que te hemos dado te han servido, si todo te ha quedado claro, etc.

def whiles():
    name=''
    age=''
    lista=[]


    while name!='detener' and age!='detener':
        name=input('Ingrese nombre: ')
        age=input('Ingrese edad: ')
        if name!='detener' and age!='detener':
            edad=int(age)
            lista.append((name,edad))
    return lista
whiles()   # Haces el llamado de la función "whiles", pero la función devuelve el resultado en este punto, no lo estás almacenando en ninguna variable para su posterior uso.

dic=dict(lista)
dic


Has vuelto a cometer el mismo error que en un hilo anterior, quieres acceder a la variable lista, que es local dentro de la función whiles. Fuera de la función whiles la variable lista no existe, es decir esta variable existe mientras la función está corriendo, al terminar de correr la función devuelve una lista pero no tiene nombre.

He dejado dentro de el spoiler algo en que estaba equivocado.

Spoiler
La tupla que retorna la función deber guardarla en una variable fuera de la función, y luego cuando quieres convertir la tupla en un diccionarios debe ser algo como

dic=dict([("Janine",29)])

El argumento de la función dict() debe ser una lista cuyos elementos son tuplas.
[cerrar]


En tu lugar, yo escribiría en lugar de la antepenúltima y penúltima linea: dic=dict(whiles())


Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

22 Noviembre, 2020, 09:17 am
Respuesta #2

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 11,319
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
def whiles():
    name=''
    age=''
    lista=[]


    while name!='detener' and age!='detener':
        name=input('Ingrese nombre: ')
        age=input('Ingrese edad: ')
        if name!='detener' and age!='detener':
            edad=int(age)
            lista.append((name,edad))
    return lista
whiles()

dic=dict(lista)
dic

Cree una lista ingresando datos. Quiero afuera de la función crear un diccionario con la lista, pero me dice que no está definida, por más que haya puesto un return dentro de la función. El error que me aparece es

NameError: name 'lista' is not defined

Lógicamente, porque aquí estás usando como global una variable local dic=dict(lista); si quieres que funcione fuera tienes que poner global lista dentro de la función y definirla fuera de la función; en algún programa de los que te he ido poniendo lo he usado yo mismo.

Ah, perdón, que ya había contestado Ingmarov, no lo había visto

Saludos.

22 Noviembre, 2020, 01:43 pm
Respuesta #3

Quema

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,974
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Si claro que nos ha servido muchas gracias. Pensé que en el foro está descontado que uno agradece los comentarios, no quise caer en un exceso de agradecimiento.

Yo prefiero, antes de definir una función, ver si el programa que escribo se ejecuta bien. Yo hice este

l=[]
name=''
age=''
a='stop'
while name!=a or age!=a:
    name=input('Ingrese nombre: ')
    age=input('Ingrese edad: ')
    if name!=a and age!=a:
        l.append((name,age))
else:
    print('Gracias')

Pero no entiendo pq tengo que poner el 'and' en while name!=a and age!=a: y no el 'or'.
Además que el loop no me para, me sigue pidiendo el nombre y edad a pesar de ponerle stop.


22 Noviembre, 2020, 01:52 pm
Respuesta #4

geómetracat

  • Moderador Global
  • Mensajes: 3,924
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
La condición name!=a or age!=a es falsa (y se sale del bucle) cuando se da a la vez name==a y age==a. Es decir, ese loop solamente parará cuando pongas 'stop' tanto en name como en age. Si alguno de los dos no es 'stop' continuará.

En cambio si pones and en vez de or, basta con que en uno de los dos hayas puesto 'stop' para que se salga del bucle.
La ecuación más bonita de las matemáticas: \( d^2=0 \)

22 Noviembre, 2020, 02:56 pm
Respuesta #5

ingmarov

  • Moderador Global
  • Mensajes: 5,423
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
def whiles():
    name=''
    age=''
    lista=[]


    while name!='detener' and age!='detener':
        name=input('Ingrese nombre: ')
        age=input('Ingrese edad: ')
        if name!='detener' and age!='detener':
            edad=int(age)
            lista.append((name,edad))
    return lista
whiles()

dic=dict(lista)
dic

Cree una lista ingresando datos. Quiero afuera de la función crear un diccionario con la lista, pero me dice que no está definida, por más que haya puesto un return dentro de la función. El error que me aparece es

NameError: name 'lista' is not defined

Lógicamente, porque aquí estás usando como global una variable local dic=dict(lista); si quieres que funcione fuera tienes que poner global lista dentro de la función y definirla fuera de la función; en algún programa de los que te he ido poniendo lo he usado yo mismo.

Ah, perdón, que ya había contestado Ingmarov, no lo había visto

Saludos.

Qué bueno que mencionas el tema de las variables globales.

Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

22 Noviembre, 2020, 03:03 pm
Respuesta #6

ingmarov

  • Moderador Global
  • Mensajes: 5,423
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Si claro que nos ha servido muchas gracias. Pensé que en el foro está descontado que uno agradece los comentarios, no quise caer en un exceso de agradecimiento.

Está bien.

...
Pero no entiendo pq tengo que poner el 'and' en while name!=a and age!=a: y no el 'or'.
Además que el loop no me para, me sigue pidiendo el nombre y edad a pesar de ponerle stop.

Ups, es verdad.
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

22 Noviembre, 2020, 05:09 pm
Respuesta #7

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 11,319
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Qué bueno que mencionas el tema de las variables globales.

Saludos

Al principio las usaba mucho, tenía vicio, hasta que leí que no era de buen programador porque era complicado para la máquina.

Esto para Quema

Spoiler
Pero ese programa se puede hacer perfectamente sin que "lista" sea global y sin imprimir el diccionario desde fuera; basta cambiar el return por break y darle la orden de impresión dentro de la función:

Código: [Seleccionar]
def whiles():
name=''
age=''
lista=[]

while name!='detener' and age!='detener':
name= input('Ingrese nombre: ')
age=  input ('Ingrese edad: ')
if name=='detener' and age=='detener':
break
lista.append(( name, int(age) ))
dic=dict(lista)
print (dic)
whiles()
[cerrar]

Saludos.