2

Descargue el programa Canopy para ocupar python (en Mac) y todo funcionaba bien hasta que al tratar ingresar una cadena mediante la función input, me manda mensaje de error del tipo:

NameError: name 'x' is not defined

No se que hacer, ¿que podrá ser?. Para una línea muy sencilla como, nombre= input("Ingrese el nombre: ") le escribo un nombre cualquiera (no numérico), pero salta el error diciendo que ese nombre no está definido.

Este es mi código:

Diez=10
Jota=11
Queen=12
Kaiser=13
c="corazones"
d="diamantes"
p="pica"
t="trebol"
a=[1,2,3,4,5,6,7,8,9,"Diez","Jota","Queen","Kaiser"]
b=[c,d,p,t]
def Cartas():
    ans = []
    for element in a:
        (str(element)+" de "+str(c))
        ans.append(str(element)+" de "+str(c))
        (str(element)+" de "+str(d))
        ans.append(str(element)+" de "+str(d))
        (str(element)+" de "+str(p))
        ans.append(str(element)+" de "+str(p))
        (str(element)+" de "+str(t))
        ans.append(str(element)+" de "+str(t))
    return ans
mazo = Cartas()
n=str(input("numero jugadores:  "))
if (int(n)<2 or int(n)>52):
    print("escribe otro numero entre 2 y 52")
else:
    nmbrs = []
    i=1
    while (i<int(n)+1):
        nombre_jug=str(input("nombre jugador "+str(i)+":"))
        i+=1
        nmbrs.append(nombre_jug)
    print(nmbrs)
import random
random.shuffle(mazo)
carta_x_jugador=len(mazo)//int(n)
cartas_sobran=len(mazo)%int(n)
nuevo_mazo=mazo[int(cartas_sobran):]

En la parte donde me pide el nombre de los jugadores:

nombre_jug=str(input("nombre jugador "+str(i)+":"))

solo me deja ingresar números.

FJSevilla
  • 55,603
  • 7
  • 35
  • 58

1 Answers1

0

Es prácticamnte seguro que estas usando Python 2.x e intentas usar sintaxis propia de Python 3. Puedes mirar el intérprete que usas en Canopy mediante:

import sys
print(sys.version)

En Python 2.x existen dos funciones para permitir la entrada de información desde la terminal:

  • raw_input: retorna la cadena ingresada en crudo, es decir, siempre retorna texto.

  • input: en su lugar espera que se le pasen expresiones Python válidas. Es decir, solo se le puede pasar código Python y la función lo evalua y procesa como tal.

Cuando usas input y le pasas un número lo evalua correctamente ya que un entero es una expresión Python válida. Tu puedes poner 2 en el intérprete interactivo lo acepta perfectamente. Cuando introduces una cadena de la forma Hola la función input lo intenta evaluar como código python, es decir, busca una función, variable o clase llamada de este modo en el namespace actual, como no existe retorna con un error diciendo que no está definida.

Para que input evalue algo como una cadena debes pasarle eso, una cadena. Es decir, debes pasarle el texto entre comillas:

>>> nombre= input("Ingrese el nombre: ")
>>> 'Hola'

De todas formas el uso de input en Python 2 está desaconsejado en la gran mayoría de casos. Para lo que quieres usa raw_input:

nombre_jug= raw_input("nombre jugador "+str(i)+":"))

En Python 3 raw_input no existe (su función la hace eval) e input equivale a raw_input en Python 2.

Puedes mirarte esta pregunta para más información:

Duda con raw_input()

Un ejemplo de lo explicado usando el intérprete interacivo de python 2.7:

>>> import sys
>>> print(sys.version)
2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)]
>>>
>>> nombre= input("Ingrese el nombre: ")
Ingrese el nombre: 'hola'
>>> nombre
'hola'
>>>
>>> nombre= input("Ingrese el nombre: ")
Ingrese el nombre: hola

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    nombre= input("Ingrese el nombre: ")
  File "<string>", line 1, in <module>
NameError: name 'hola' is not defined
>>>
>>> nombre= raw_input("Ingrese el nombre: ")
Ingrese el nombre: hola
>>> nombre
'hola'
>>>
>>> num= int(raw_input("Ingrese un entero: "))
Ingrese un entero: 12
>>> num
12
>>>
>>> 1245
1245
>>>
>>> hola

Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    hola
NameError: name 'hola' is not defined
>>>
>>> 'hola'
'hola'
FJSevilla
  • 55,603
  • 7
  • 35
  • 58