How to add more options without indentation error? - python

Hello I am editing this code since I want to add a sub menu and a function in each selected option but whenever I add even a print it gives me an error and it is annoying I have tried in every way but the error is constant and annoying
import os
def menu():
"""
Función que limpia la pantalla y muestra nuevamente el menu
"""
os.system('clear') # NOTA para windows tienes que cambiar clear por cls
print ("Selecciona una opción")
print ("\t1 - primera opción")
print ("\t2 - segunda opción")
print ("\t3 - tercera opción")
print ("\t9 - salir")
while True:
# Mostramos el menu
menu()
# solicituamos una opción al usuario
opcionMenu = input("inserta un numero valor >> ")
if opcionMenu=="1":
print ("")
input("Has pulsado la opción 1...\npulsa una tecla para continuar")
elif opcionMenu=="2":
print ("")
input("Has pulsado la opción 2...\npulsa una tecla para continuar")
elif opcionMenu=="3":
print ("")
input("Has pulsado la opción 3...\npulsa una tecla para continuar")
elif opcionMenu=="9":
break
else:
print ("")
input("No has pulsado ninguna opción correcta...\npulsa una tecla para continuar")
for example in the first if
I want to add a sub menu like this
if opcionMenu=="1":
print ("Selecciona una opción")
print ("\t1 - primera opción")
print ("\t2 - segunda opción")
print ("\t3 - tercera opción")
print ("\t9 - salir")
n=input("Has pulsado la opción 1...\npulsa una tecla para continuar")
print(function(n))
if I wanted to do this inside it is useless is possible or some idea

Related

If always true when checking strings

I'm developing a chatbot project for college, and in the following code block, the first if is always going as a true value, no matter what. I really need help and don't know what to do, cause this project is due on monday.
def registeredClient():
print('Olá, bem-vindo a WE-RJ Telecom!')
userInputString = str(input('O que você precisa?\nCaso queira contratar ou trocar de plano escreva “Quero contratar” ou “Quero trocar de plano”.\nCaso esteja com problemas de conexão, escreva "suporte".\nCaso queira seu boleto, digite "boleto":\n'))
userInputString = userInputString.lower()
if 'contratar' or 'trocar plano' or 'aumentar velocidade' or 'mudar plano' or 'velocidade' or 'plano' in userInputString:
newPlanOption()
elif 'suporte' or 'lenta' or 'internet lenta' or 'internet esta lenta' or 'problema' or 'velocidade' in userInputString:
supportOption()
elif 'boleto' or 'segunda via' or '2ª via' or 'fatura' in userInputString:
billingOption()
else:
print('Não foi posível entender a sua mensagem, seu atendimento será encerrado.')
return False
I updated the conditions. In your case your conditions were checking if the strings themselves were truthly which is why your first case would result in true.
def registeredClient():
print('Olá, bem-vindo a WE-RJ Telecom!')
userInputString = str(input('O que você precisa?\nCaso queira contratar ou trocar de plano escreva “Quero contratar” ou “Quero trocar de plano”.\nCaso esteja com problemas de conexão, escreva "suporte".\nCaso queira seu boleto, digite "boleto":\n'))
userInputString = userInputString.lower()
if any(x in userInputString for x in ['contratar', 'trocar plano' , 'aumentar velocidade' , 'mudar plano' , 'velocidade' , 'plano']):
print("Case A")
elif any(x in userInputString for x in ['suporte', 'lenta' , 'internet lenta' , 'internet esta lenta' , 'problema' , 'velocidade']):
print("Case B")
elif any(x in userInputString for x in ['boleto' , 'segunda via' , '2ª via' , 'fatura']):
print("Case C")
else:
print('Não foi posível entender a sua mensagem, seu atendimento será encerrado.')
return False
registeredClient();
The first if block is understood by python as the following if block :
(if 'contratar') or ('trocar plano') or ('aumentar velocidade') or ('mudar plano') or ('velocidade') or ('plano' in userInputString):
which is always True as the strings are not vacant and thus truthy type.
What you need is this as the first if block :
if any(i in userInputString for i in ['contratar', 'trocar plano', 'aumentar velocidade', 'mudar plano', 'velocidade', 'plano']):
Similarly you need to change your elif statements too.
Try this :
def registeredClient():
print('Olá, bem-vindo a WE-RJ Telecom!')
userInputString = str(input('O que você precisa?\nCaso queira contratar ou trocar de plano escreva “Quero contratar” ou “Quero trocar de plano”.\nCaso esteja com problemas de conexão, escreva "suporte".\nCaso queira seu boleto, digite "boleto":\n'))
userInputString = userInputString.lower()
checkString = lambda l: any(i in userInputString for i in l)
if checkString(['contratar', 'trocar plano', 'aumentar velocidade', 'mudar plano', 'velocidade', 'plano']):
newPlanOption()
elif checkString(['suporte', 'lenta', 'internet lenta', 'internet esta lenta', 'problema', 'velocidade']):
supportOption()
elif checkString(['boleto', 'segunda via', '2ª via', 'fatura']):
billingOption()
else:
print('Não foi posível entender a sua mensagem, seu atendimento será encerrado.')
return False

I don't know why my Python code isn't working

Here's my code: I don't know why but I cant find my errors. It's a game that aims to remove pairs from your deck and have no more pairs. The name of the game is called mistrigry or lousy.
import random
def attend_le_joueur():
'''()->None
Pause le programme jusqu'au l'usager appui Enter
'''
try:
input("Appuyez Enter pour continuer. ")
except SyntaxError:
pass
def prepare_paquet():
'''()->list of str
Retourne une liste des chaines de caractères qui représente tous les cartes,
sauf le valet noir.
'''
paquet=[]
couleurs = ['\u2660', '\u2661', '\u2662', '\u2663']
valeurs = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
for val in valeurs:
for couleur in couleurs:
paquet.append(val+couleur)
paquet.remove('J\u2663') # élimine le valet noir (le valet de trèfle)
return paquet
def melange_paquet(p):
'''(list of str)->None
Melange la liste des chaines des caractères qui représente le paquet des cartes
'''
random.shuffle(p)
def donne_cartes(p):
'''(list of str)-> tuple of (list of str,list of str)
Retournes deux listes qui représentent les deux mains des cartes.
Le donneur donne une carte à l'autre joueur, une à lui-même,
et ça continue jusqu'à la fin du paquet p.
'''
donneur=[]
autre=[]
var = 1
for i in range(len(p)):
if var == 0:
donneur.append(p[i])
var = 1
elif var == 1:
autre.append(p[i])
var = 0
return(donneur,autre)
def elimine_paires(l):
'''
(list of str)->list of str
Retourne une copy de la liste l avec tous les paires éliminées
et mélange les éléments qui restent.
Test:
(Notez que l’ordre des éléments dans le résultat pourrait être différent)
>>> elimine_paires(['9♠', '5♠', 'K♢', 'A♣', 'K♣', 'K♡', '2♠', 'Q♠', 'K♠', 'Q♢', 'J♠', 'A♡', '4♣', '5♣', '7♡', 'A♠', '10♣', 'Q♡', '8♡', '9♢', '10♢', 'J♡', '10♡', 'J♣', '3♡'])
['10♣', '2♠', '3♡', '4♣', '7♡', '8♡', 'A♣', 'J♣', 'Q♢']
>>> elimine_paires(['10♣', '2♣', '5♢', '6♣', '9♣', 'A♢', '10♢'])
['2♣', '5♢', '6♣', '9♣', 'A♢']
'''
resultat=[]
if len(l) < 2:
return 1
l.sort()
l.append([''])
a = 1
while a < len(l):
if l[a-1][:-1] != l[a][:-1]:
resultat.append(l[a-1])
a = a + 1
else:
a = a + 2
random.shuffle(resultat)
return resultat
def affiche_cartes(p):
'''
(list)-None
Affiche les éléments de la liste p séparées par d'espaces
'''
for i in p:
print(p[i], end = ' ')
def entrez_position_valide(n):
'''
(int)->int
Retourne un entier du clavier, de 1 à n (1 et n inclus).
Continue à demander si l'usager entre un entier qui n'est pas dans l'intervalle [1,n]
Précondition: n>=1
'''
v = str(n)
s = int(input("S'il vous plait, veuillez entrer un entier de 1 à "+ v +":"))
while s > n or n < 1:
s = int(input("S'il vous plait, veuillez entrer un entier de 1 à "+ v +":"))
return (s)
def joue():
'''()->None
Cette fonction joue le jeu'''
p=prepare_paquet()
melange_paquet(p)
tmp=donne_cartes(p)
donneur=tmp[0]
humain=tmp[1]
donneur=elimine_paires(donneur)
humain=elimine_paires(humain)
print("Bonjour. Je m'appelle Robot et je distribue les cartes.")
print("Votre main est:")
affiche_cartes(humain)
print("Ne vous inquiétez pas, je ne peux pas voir vos cartes ni leur ordre.")
print("Maintenant défaussez toutes les paires de votre main. Je vais le faire moi aussi.")
attend_le_joueur()
tour = 0
while (tour <= 1 and tour >= 0):
if len(humain) == 0:
print("J'ai fini avec toutes mes cartes")
print("L'humain, vous avez gagné")
break
elif len(donneur) == 0:
print("J'ai fini avec toutes mes cartes")
print("Le robot à gagné")
break
else:
if tour == 0:
print("C'est à votre tour")
print("Vos cartes sont:")
affiche_cartes(humain)
v = len(donneur)
print("J'ai", n, "carte(s). Si 1 est ma première carte" + str(v), "la position de ma dernière carte, quelle carte voudriez-vous dans votre paquet?")
alt = entrez_position_valide(v)
if alt == 1:
print("voici la première carte que vous avez demandé")
else:
print("vous m'avez demandé cette n-ième carte:"+str(alt)+".")
print("voila" +donneur[int(alt)-1])
print(donneur[int(alt)-1], "votre nouvelle main est:")
humain.append(donneur[int(alt)-1])
donneur.remove(donneur[int(alt)-1])
affiche_cartes(humain)
print("Après avoir enlever les paires, votre main est:")
humain = elimine_paires(humain)
affiche_cartes(humain)
tour = 1
attend_le_joueur()
if tour == 1:
print("mon tour")
c = len(humain)
alt = random. randit(1, c)
if alt == 1:
print('Jai pris la première carte')
else:
print('Jai pris votre' + str(alt) + 'carte')
donneur.append(humain[int(alt) - 1])
humain.remove(humain[int(alt) - 1])
donneur = elimine_paires(donneur)
tour = 0
attend_le_joueur()
joue()
You have to change this
def affiche_cartes(p):
'''
(list)-None
Affiche les éléments de la liste p séparées par d'espaces
'''
for i in p:
print(p[i], end = ' ')
To
def affiche_cartes(p):
'''
(list)-None
Affiche les éléments de la liste p séparées par d'espaces
'''
for i in p:
print(i, end = ' ')
Your p Variable is a list of strings and you used a for each loop, which means i is an element of p and not an index.

SOLVED: My Python code returns None instead of a list

the value which is supposed to be returned is valid!!!!
The print(self.affichage) just above shows that it works!!!!
Why does it not return it ??? (the very last return)
so this code is a Polish Reverse Notation calculus :
you read it from left to right, the numbers are stored in a pile, and the operands apply to the two upper numbers of the pile (the two most recent)
# here comes the actual code :
class Calculatrice():
# création de la mémoire de la calculatrice
def __init__(self):
self.pile = []
self.affichage = []
def traitement(self,element):
# opérateur
if element in "+-*/":
# on vérifie qu'il y a les nombres suffisants pour effectuer ces opérations
if len(self.pile) > 1:
# addition
if element == "+":
resultat = self.pile[-2] + self.pile[-1]
# soustraction
elif element == "-":
resultat = self.pile[-2] - self.pile[-1]
# multiplication
elif element == "*":
resultat = self.pile[-2] * self.pile[-1]
# division
elif element == "/":
resultat = self.pile[-2] / self.pile[-1]
# ATTENTION : dans les cas de ces opérations, seuls deux nombres sont nécessaire,
# donc on peut généraliser les deux actions suivantes, mais ça ne devrait pas forcément être le cas.
# on dépile les nombres traités
del self.pile[len(self.pile)-2:]
# on empile le résultat
self.pile.append(resultat)
return True
elif len(self.pile) == 1:
if element == "*":
# erreur : pas assez de nombres pour effectuer une multiplication
print("Erreur 03 : Pas assez de nombres pour effectuer la multiplication.")
return False
elif element == "/":
# erreur : pas assez de nombres pour effectuer une division
print("Erreur 04 : Pas assez de nombres pour effectuer la division.")
return False
# si c'est une addition, on considère qu'on ajoute le nombre à 0, donc la pile ne change pas
else:
# si c'est une soustraction, on empile son opposé à la place du nombre
if element == "-":
self.pile[-1] = (self.pile[-1] * (-1))
return True
# la taille de la pile = 0, c-à-d. qu'aucun nombre n'a été stocké au préalable
else:
print("Erreur 02 : Pas assez de nombres pour effectuer une opération.")
return False
else:
for car in element:
if car not in "0123456789.":
# erreur : caractère non reconnu
print("Erreur 01 : La commande n'a pas été comprise.")
return False
# si on est arrivé jusqu'ici, on va considérer que c'est bon et que c'est un nombre
# on empile l'élément
self.pile.append(float(element))
return True
def npi(self,chaine):
# si la récurrence n'est pas à sa limite
if len(chaine) != 0:
# on vérifie qu'il y a des espaces
if " " in chaine:
# on parcourt la chaine jusqu'à l'espace suivant
i = 0
temp = ""
while chaine[i] != " ":
temp = temp+chaine[i]
i += 1
# on a fini d'extraire cet élément : on le traite.
traitement = self.traitement(temp)
# si il y a eu des erreurs de traitement : on arrête tout.
if traitement == False:
return ["Erreur"]
else:
# on continue de traiter le reste de la chaîne
self.npi(chaine[i+1:])
else:
# il n'y a pas d'espace, donc il n'y a qu'un seul élément : on le traite.
traitement = self.traitement(chaine)
# si il y a eu des erreurs de traitement : on arrête tout.
if traitement == False:
return ["Erreur"]
# on a fini, on sort du if
self.npi("")
else:
# la chaîne est vide : tous les éléments ont été traités. On renvoie le résultat final et on réinitialise la pile.
self.affichage = self.pile.pop()
print(self.affichage)
return self.affichage
c = Calculatrice()
print(c.npi("2 3 + 4 -"))
# doit retourner 1
You are returning a value only in the base-case. For the recursive cases in npi you are not returning anything (i.e. returning None). The printed value comes from inside a recursive call, the return value from that call is lost once you go back to the calling method.
You need to add return statements for the recursive cases in npi
def npi(self,chaine):
# si la récurrence n'est pas à sa limite
if len(chaine) != 0:
# on vérifie qu'il y a des espaces
if " " in chaine:
# on parcourt la chaine jusqu'à l'espace suivant
i = 0
temp = ""
while chaine[i] != " ":
temp = temp+chaine[i]
i += 1
# on a fini d'extraire cet élément : on le traite.
traitement = self.traitement(temp)
# si il y a eu des erreurs de traitement : on arrête tout.
if traitement == False:
return ["Erreur"]
else:
# on continue de traiter le reste de la chaîne
return self.npi(chaine[i+1:]) # HERE
else:
# il n'y a pas d'espace, donc il n'y a qu'un seul élément : on le traite.
traitement = self.traitement(chaine)
# si il y a eu des erreurs de traitement : on arrête tout.
if traitement == False:
return ["Erreur"]
# on a fini, on sort du if
return self.npi("") # HERE
else:
# la chaîne est vide : tous les éléments ont été traités. On renvoie le résultat final et on réinitialise la pile.
self.affichage = self.pile.pop()
print(self.affichage)
return self.affichage
You call npi recursively. In the last call the traitement variable is True.
But your code looks like the following:
if traitement == False:
return ["Erreur"]
else:
# on continue de traiter le reste de la chaîne
self.npi(chaine[i+1:])
and exits the function without returning anything. Therefore, you get the None object, when trying to print.

How can I get the exact result of 10**20 + 10**-20 in Python? It gives me 1e+20

I am writing a code to solve second-grade equations and it works just well.
However, when I input the following equation:
x^2 + (10^(20) + 10^(-20)) + 1 = 0
(Yes, my input is 10**20 + 10**(-20)
I get:
x1 = 0 x2 = -1e+20
However, it is taking (10^(20) + 10^(-20) as 10e+20 while, if you do the math:
Here is the LaTeX formatted formula:
Which is almost 10^20 but not 10^20.
How can I get the exact result of that operation so I can get the exact value of the equation in x2?
My code is the following:
#===============================Función para obtener los coeficientes===============================
#Se van a anidar dos funciones. Primero la de coeficientes, luego la de la solución de la ecuación.
#Se define una función recursiva para obtener los coeficientes de la ecuación del usuario
def cof():
#Se determina si el coeficiente a introducir es un número o una cadena de operaciones
op = input("Si tu coeficiente es un número introduce 1, si es una cadena de operaciones introduce 2")
#Se compara la entrada del usuario con la opción.
if op == str(1):
#Se le solicita el número
num = input("¿Cuál es tu número?")
#Se comprueba que efectívamente sea un número
try:
#Si la entrada se puede convertir a flotante
float(num)
#Se establece el coeficiente como el valor flotante de la entrada
coef = float(num)
#Se retorna el valor del coeficiente
return coef
#Si no se pudo convertir a flotante...
except ValueError:
#Se le informa al usuario del error
print("No introdujiste un número. Inténtalo de nuevo")
#Se llama a la función de nuevo
return cofa()
#Si el coeficiente es una cadena (como en 10**20 + 10**-20)
elif op == str(2):
#La entrada se establece como la entrada del usuario
entrada = input("Input")
#Se intenta...
try:
#Evaluar la entrada. Si se puede...
eval(entrada)
#El coeficiente se establece como la evaluación de la entrada
coef = eval(entrada)
#Se regresa el coeficiente
return coef
#Si no se pudo establecer como tal...
except:
#Se le informa al usuario
print("No introdujiste una cadena de operaciones válida. Inténtalo de nuevo")
#Se llama a la función de nuevo
return cofa()
#Si no se introdujo ni 1 ni 2 se le informa al usuario
else:
#Se imprime el mensaje
print("No introdujiste n ni c, inténtalo de nuevo")
#Se llama a la función de nuevo
return cof()
#===============================Función para resolver la ecuación===============================
#Resuelve la ecuación
def sol_cuadratica():
#Se pide el valor de a
print("Introduce el coeficiente para a")
#Se llama a cof y se guarda el valor para a
a = cof()
#Se pide b
print("Introduce el coeficiente para b")
#Se llama cof y se guarda b
b = cof()
#Se pide c
print("Introduce el coeficiente para c")
#Se llama cof y se guarda c
c = cof()
#Se le informa al usuario de la ecuación a resolver
print("Vamos a encontrar las raices de la ecuación {}x² + {}x + {} = 0".format(a, b, c))
#Se analiza el discriminante
discriminante = (b**2 - 4*a*c)
#Si el discriminante es menor que cero, las raices son complejas
if discriminante < 0:
#Se le informa al usuario
print("Las raices son imaginarias. Prueba con otros coeficientes.")
#Se llama a la función de nuevo
return sol_cuadratica()
#Si el discriminante es 0, o mayor que cero, se procede a resolver
else:
#Ecuación para x1
x1 = (-b + discriminante**(1/2))/(2*a)
#Ecuación para x2
x2 = (-b - discriminante**(1/2))/(2*a)
#Se imprimen los resultados
print("X1 = " + str(x1))
print("X2 = " + str(x2))
sol_cuadratica()
Ignore the comments, I'm from a Spanish-speaking country.
The limitations of the machine floating point type is the reason why when adding a very small number to a very big number, the small number is just ignored.
This phenomenon is called absorption or cancellation.
With custom floating point objects (like the ones decimal module) you can achieve any precision (computations are slower, because floating point is now emulated, and not relying on the machine FPU capabilities anymore)
From the decimal module docs:
Unlike hardware based binary floating point, the decimal module has a user alterable precision (defaulting to 28 places) which can be as large as needed for a given problem
This can be achieved by changing the following global parameter decimal.getcontext().prec
import decimal
decimal.getcontext().prec = 41 # min value for the required range
d = decimal.Decimal(10**20)
d2 = decimal.Decimal(10**-20)
now
>>> d+d2
Decimal('100000000000000000000.00000000000000000001')
As suggested in comments, for the small number it's safer to let decimal module handle the division by using power operator on an already existing Decimal object (even if here, the result is the same):
d2 = decimal.Decimal(10)**-20
So you can use decimal.Decimal objects for your computations instead of native floats.

The ironic frustration with While and Pause on Python

Just discovered this forum and it's unbelievable how helpful its community is. Well, I have an issue trying to make a "while" loop on Python. I want the program's menu to repeat until you select Option 6 - Salir (Exit). Everything is fine at first, but after I select an option and the program prints x thing, I press enter to return to the menu or continue (just like when you use a pause on C) and get an error.
Juan es un empleado mexicano comun con poco salario minimo. Que quiere saber de el? MENU
1.Salario
2.Sombrero
3.Playera
4.Pantalones
5.Tenis
6.Salir
Seleccione una opcion 1 El salario de Juan es 7.5
MENU
1.Salario
2.Sombrero
3.Playera
4.Pantalones
5.Tenis
6.Salir
Seleccione una opcion Traceback (most recent call last): File "C:\Users\joguzman\Documents\Proyectos Eclipse\Clases\src\main.py", line 22, in <module>
opcion=int(input("\nSeleccione una opcion\n")) ValueError: invalid literal for int() with base 10: ''
I also want it to clear the screen, which doesn't happen at all. Here's my code:
import os class empleadoClass: #las propiedades que tendra cada empleado
salario=7.5
sombrero='nike'
playera='polo'
pantalones='patito'
tenis='adidas'
juanObject = empleadoClass() #'juanObjeto' esta "heredando" propiedades de empleadoClass
print ("Juan es un empleado mexicano comun con poco salario minimo. Que quiere saber de el?") opcion=1
while (opcion!=6):
print("MENU \n1.Salario \n2.Sombrero \n3.Playera \n4.Pantalones \n5.Tenis \n6.Salir")
opcion=int(input("\nSeleccione una opcion\n"))
if (opcion==1):
print ("El salario de Juan es ",juanObject.salario)
os.system('pause>nul')
os.system('cls')
elif (opcion==2):
print ("La marca del sombrero de Juan es ",juanObject.sombrero)
os.system('pause>nul')
os.system('cls')
elif (opcion==3):
print ("La marca de la playera de Juan es ",juanObject.playera)
os.system('pause>nul')
os.system('cls')
elif (opcion==4):
print ("La marca de los pantalones de Juan es ",juanObject.pantalones)
os.system('pause>nul')
os.system('cls')
elif (opcion==5):
print ("La marca de los tenis de Juan es ",juanObject.tenis)
os.system('pause>nul')
os.system('cls')
elif(opcion==6):
print ("Gracias por usar nuestro programa!")
else:
print ("Ingrese una opcion correcta")
os.system('pause>nul')
os.system('cls')
Thanks in advance! :D And sorry for any grammar mistakes, as you can see I'm not a native english speaker.
EDIT: It seems the code's structure got a messy when posting... Does anyone know how to solve this? :/
I think a simpler way to do a menu like this is to:
def print_menu():
# print stuff here, 6 exits
while True:
print_menu()
try:
choice = int(input('>>'))
if choice == 1:
blah
elif choice == 2:
more blah
elif choice == 6:
break
except ValueError:
handle_error()
As for clearing the screen that depends on what OS you are using and how you are running the program. See this question - how to clear the screen in python

Categories