Equação deve ser entendida como float, mas é vista como string

72 views
Skip to first unread message

Murilo Fujita

unread,
Jan 15, 2024, 8:38:17 PMJan 15
to Python Brasil
Boa noite, programadores.

Estou desenvolvendo programas para cálculo numérico e preciso gerar valores para uma lista. O exemplo hard-coded abaixo funciona perfeitamente:

x_inicial = -5
x_final = 5
parOrdenado = []
for x in range(x_inicial, x_final+1):
    parOrdenado.append(x**2-5*x+6)   # Aqui funciona

for valores in parOrdenado:
    print(x_inicial,valores)
    x_inicial+=1




O problema acontece quando digito a equação pela linha de comando, ou seja, o programa recebe a equação, o valor inicial e valor final de forma parametrizada. O problema é que em vez de calcular os valores, a lista armazena a mesma equação.

import sys

def main():
    x_inicial = int(sys.argv[1])
    x_final = int(sys.argv[2])
    equacao = sys.argv[3]
    calcula(x_inicial, x_final, equacao)

def calcula(x_inicial, x_final, equacao):
    parOrdenado = []
    for x in range(x_inicial, x_final+1):
        parOrdenado.append(equacao)   # Não funciona

   
    for valor in parOrdenado:
        print(x_inicial, valor)
        x_inicial+=1

if __name__ == "__main__":

    main()


Aqui está a saída ao executar o último código:

C:\estudos\microsoft learn>parOrdenadoLineCommand.py -2 2 x**2-5*x+6
-2 x**2-5*x+6
-1 x**2-5*x+6
0 x**2-5*x+6
1 x**2-5*x+6
2 x**2-5*x+6


Ao usar  type(parOrdenado) retorna que trata-se de uma string. Já tentei usar
parOrdenado.append(float(equacao)) e retorna erro. 
O que deve ser feito para o Python entender que a lista deve armazenar os valores calculados?
Agradeço pela atenção.

Murilo Fujita
15/01/2024




Lucas Brahm

unread,
Jan 15, 2024, 10:51:45 PMJan 15
to python...@googlegroups.com
Boa noite,

Resposta curta:
Trocar:
 parOrdenado.append(equacao)   # Não funciona
Por:
 parOrdenado.append(eval(equacao))


Resposta longa:
No primeiro você está executando um programa em python que possui uma variáveis e realiza operações.
No segundo você está passando uma equação como um argumento para o seu programa. Essa equação vai ser apenas uma string e não vai ser executada.

Existe uma diferença bem grande. Por exemplo, vamos pensar que vamos fazer um programa que soma ou diminui dois números.
Seria feito facilmente um programa em python algo como "1+2" e no seu programa essa linha seria executada e o resultado retornado.
Agora vamos imaginar um caso que você deseja fazer um programa que leia de um arquivo esses números e sua operação.
O simples fato de um colocar "1+2" em um arquivo texto não vai fazer meu programa executar a operação. Na realidade, o programa inicialmente vai apenas ler a linha desse arquivo texto e armazenar como uma string. O arquivo poderia ter qualquer dado, como meu nome, meu número de telefone ou uma equação qualquer. Existiria uma complexidade em identificar que aquela string na realidade possui dois números e uma determinada operação aritmética.
A solução mais simples para seu problema foi fazer o python realmente converter aquela string para ser executada usando a função eval(). Ela não é recomendado usar em sistemas em produção, pois possui sérios problemas de segurança (daria pra injetar qualquer código malicioso e ele seria executado), mas para fins didáticos acho que resolve o seu problema.

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para acessar essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/d016eec6-8af1-4376-b30f-4ea4f6292525n%40googlegroups.com.

Murilo Fujita

unread,
Jan 16, 2024, 7:13:58 AMJan 16
to Python Brasil
A soluação apresentada pelo Lucas Brahm resolveu meu problema.
Agradeço também pela dia de segurança!
Reply all
Reply to author
Forward
0 new messages