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
Related
I have a random graph and I want to check if in this graph the nodes are connected and show which are the strongly connected items, if any
#grafo 1
grafo1=erdosRenyi(5,0.7)
def not_in(x,y):
#RODA VETOR X SOBRE Y
for i in x:
#VERIFICA SE CADA ITEM DE X ESTA EM Y, SE ESTIVE, REMOVE DO Y
if i in y:
y.remove(i)
#RETORNA SO OS ELEMENTOS RESTANTES DE Y
return y
#VETOR TOTAL DE COMPONENTES | NOS VISITADOS | TOTAL TEMPORARIO
tc = []; visitado = []; tot =0;
#EXECUTA SOBRE TODOS OS NOS
for no in grafo1:
#ADICIONA NO ATUAL AOS VISITADOS
visitado.append(no)
print('BUSCANDO PELOS VERTICES DE ', no)
#ADICIONA AO TOTAL TEMPORARIO DE NOS DO COMPONENTE
tot=tot+1
# VERIFICA SE O NO FOI VISITADO E SE ELE NAO POSSUI NOVOS ELEMENTOS PARA SEREM VISITADOS
if no in visitado and len(not_in(visitado, list(grafo1[no]))) == 0:
#CASO POSITIVO, FINALIZA O COMPONENTE
#ADICIONA UM COMPONENTE NOVO COMPONENTE AO VETOR DE COMPONENTES COMO O SEU TOTAL DE NOS
tc = tc+[tot]
#ZERA A VARIAVEL TEMPORARIA DE NOS
tot=0
print("NOVO COMPONENTE\n")
print('\nTOTAL DE COMPONENTES ',len(tc))
print('MAIOR COMPONENTE CONEXO ', max(tc))
print('TAMANHO DE TODOS OS COMPONENTES ', tc)
I wanted to try to optimize the code but my idea is not working.
I will receive a value from the user, this value will be a number, this number I will choose a function to be executed. So I created an object with those same numbers and the value the name of the function that should be called. I tried a few ways here but none worked, does anyone know how to do this? code right away
def funcaoSerExecutada():
modules = {
1: "funcao1()",
2: "funcao2",
3: "funcao3",
4: "funcao4",
5: "funcao5",
}
userValue = 0
# Texto que será exebido na tela
print("===============================")
print("Escolha o módulo")
print("===============================")
print("1 - Estrutura: modelo_cantacom_vitrine_destinos_mod019_V3")
print("2 - Estrutura: cantacom_n_mod072_aereas_100_V2;")
print("3 - Estrutura: canta_destinos_vitrine_novo_modelo_estrutura;")
print("4 - Estrutura: canta_mod050_estrutura; Obs: Valores apenas para Clube Smiles")
print("5 - CANTACOM_100MILHAS-SMILESANDMONEY-VERTICAL_V1")
print("===============================")
# Pedir para o usuário digitar um valor, verificar se é um número e se essa opção digitada existe
while (isinstance(userValue, str) or not userValue in modules):
try:
userValue = int(input("Digite um número: "))
if(not userValue in modules):
print("===============================")
print("Essa opção não existe! Escolha uma das opções acima!")
print("===============================")
except:
print("===============================")
print("Ops, digite um número!")
print("===============================")
def funcao1():
print("oi")
def runFunction():
modules[userValue]
runFunction()
Based on the answers, I made my solution
You can leave the function name without the quotes, but the variable has to be declared after it.
So what I did was I took that value and put the parentheses.
def funcaoSerExecutada():
# Funcões
def funcao1():
print("oi")
userValue = 0
modules = {
1: funcao1,
}
# Texto que será exebido na tela
print("===============================")
print("Escolha o módulo")
print("===============================")
print("1 - Estrutura: modelo_cantacom_vitrine_destinos_mod019_V3")
print("2 - Estrutura: cantacom_n_mod072_aereas_100_V2;")
print("3 - Estrutura: canta_destinos_vitrine_novo_modelo_estrutura;")
print("4 - Estrutura: canta_mod050_estrutura; Obs: Valores apenas para Clube Smiles")
print("5 - CANTACOM_100MILHAS-SMILESANDMONEY-VERTICAL_V1")
print("===============================")
# Pedir para o usuário digitar um valor, verificar se é um número e se essa opção digitada existe
while (isinstance(userValue, str) or not userValue in modules):
try:
userValue = int(input("Digite um número: "))
if(not userValue in modules):
print("===============================")
print("Essa opção não existe! Escolha uma das opções acima!")
print("===============================")
except:
print("===============================")
print("Ops, digite um número!")
print("===============================")
def executarFuncao():
modules[userValue]()
executarFuncao()
Don't put the name in the dictionary, but a reference to the function itself.
modules = {
1: funcao1,
2: funcao2,
3: funcao3,
4: funcao4,
5: funcao5,
}
You need to put the function definitions before this. And you call it with ().
def funcaoSerExecutada():
userValue = 0
# Texto que será exebido na tela
print("===============================")
print("Escolha o módulo")
print("===============================")
print("1 - Estrutura: modelo_cantacom_vitrine_destinos_mod019_V3")
print("2 - Estrutura: cantacom_n_mod072_aereas_100_V2;")
print("3 - Estrutura: canta_destinos_vitrine_novo_modelo_estrutura;")
print("4 - Estrutura: canta_mod050_estrutura; Obs: Valores apenas para Clube Smiles")
print("5 - CANTACOM_100MILHAS-SMILESANDMONEY-VERTICAL_V1")
print("===============================")
# Pedir para o usuário digitar um valor, verificar se é um número e se essa opção digitada existe
while (isinstance(userValue, str) or not userValue in modules):
try:
userValue = int(input("Digite um número: "))
if(not userValue in modules):
print("===============================")
print("Essa opção não existe! Escolha uma das opções acima!")
print("===============================")
except:
print("===============================")
print("Ops, digite um número!")
print("===============================")
def funcao1():
print("oi")
modules = {
1: funcao1,
2: funcao2,
3: funcao3,
4: funcao4,
5: funcao5,
}
def runFunction():
modules[userValue]()
runFunction()
def funcaoSerExecutada(value: int) -> Callable:
modules = {
1: funcao1,
2: funcao2,
...
}
return modules[value]
user_value = 1
funcaoSerExecutada(user_value)()
So, i'm coding an discord bot for playing rpg with my friends, and i writed something about 1,3k lines, using pickle and some other librarys, and until my last function it's worked very well, but in this " Atualizar_inventario()" the pickle just dont' save my list " ITEM " in my " Abrir_Para_Escrita", and i dont have any ideia why.
def Autualizar_inventario():
# Booleano para quebrar o looping quando quisermos sair
Sair = False
# Variavel que vai receber nome para comparação
Nome = input("Qual inventario você deseja atualizar?")
print(Nome)
#Abrir arquivo para leitura
Abrir_Inv = open(f"Inventario/{Nome}.pickle", "rb")
Ler_Inv = pickle.load(Abrir_Inv)
# Lista que vai receber os itens que vamos adicionar depois
Item = [Ler_Inv]
# Sender_ID vai servir para só o dono do inventario poder alteralo
Sender_ID = "Jorge" # Yamo altera essa string pra um comando que recebe o ID do usuario
# Se o sender ID for o mesmo que o primeiro parametro " QUE NO CASO SERA O ID"
# if vai ser ativado, nos botando em um looping onde adicionaremos os itens
if Sender_ID == Ler_Inv[0] : # or Sender_ID == "350364616657862679" < -- Codigo para reconhecer o meu discord
while Sair == False:
Input_Item = input("Escreva o nome do item")
# Comando para sair do inventario
if Input_Item == "sair" or Input_Item == "Sair" or Input_Item == "SAIR":
break
# Se sair não for ativado começam as etapas de salvar os novos itens no inventario
else :
# Adiciona o item digitado pelo usuario na lista " ITEM "
Item.append(Input_Item)
# Mostra os parametros // serve apenas para configuração
print("printando item = ", Item)
Abrir_Para_Escrita = open(f"Inventario/{Nome}.pickle", 'wb')
pickle.dump(Item, Abrir_Para_Escrita)
Abrir_Para_Escrita.close()
print("printando arquivo ", Ler_Inv)
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
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.