Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Por que não se pode usar 2 vezes seguidas o comando "For in range"?

Prezados, boa tarde,

Estava treinado com os exercíos da lista no link (https://wiki.python.org.br/EstruturaSequencial), porém no exercíco 11 tentei colocar 2 vezes o comando "for in range", porém o pycharm só faz o primeiro. Segue o meu código abaixo:

# Faça um Programa que peça 2 números inteiros e um número real. Calcule e mostre:
#   a-) o produto do dobro do primeiro com metade do segundo .
#   b-) a soma do triplo do primeiro com o terceiro.
#   c-) o terceiro elevado ao cubo.


int_maximo = 2
real_maximo = 1
numeros_inteiros = []
numeros_real = []
print("***Bem-vindo ao Exercício 11 da Lista Python***")
print("Vamos precisar de 2 números inteiros e 1 número real")

for num in range(1,int_maximo+1):
    while(True):
        inteiros = input("Insira o {}° número {}: ".format(num,'inteiro'.upper()))
        if(inteiros.isdigit()):
            inteiros = int(inteiros)
            print("foi".capitalize())
            numeros_inteiros.append(inteiros)
            break
        else:
            print("Por favor, digite {} um número {}".format('apenas'.upper(), 'inteiro'.upper()))
            input("Aperte {} para continuar".format('enter'.upper()))
            print("",end='\n')
    pass

print("Os {} números {} foram {}".format(int_maximo, 'inteiros',numeros_inteiros))
print("",end='\n')
print("Agora digite o número real")


#                    Daqui para baixo o programa não executa
for num in range(1,real_maximo):
    while(True):
        real = input("Insira o {}° número {}: ".format(num,'real'.upper()))
        if(not real.islower()):
            real.replace(",",".")
            real = float(real)
            print("foi".capitalize())
            numeros_real.append(real)
            break
        else:
            print("Por favor, digite {} um número {}".format('apenas'.upper(), 'real'.upper()))
            input("Aperte {} para continuar".format('enter'.upper()))
            print("",end='\n')

print("Obrigado!")

Desda jpa obrigado por seu tempo.

Obs.: Fiz a modificação para colocar a pergunta dentro de um bloco de código.

7 respostas

Boa noite, se possível coloque seu código dentro de um bloco de código, é um símbolo </> aqui no editor onde escrevemos. Assim fica fácil a leitura do código

Blz Thiago, coloquei o código dentro de um bloco.

Obrigadão

O python não tem nenhuma limitação quanto a usar múltiplos loops for, o problema do seu código é que ele está em loop infinito na linha while(True), pois ele só sai de loop quando entra no primeiro IF, o que não acontece.

Oi Thiago, boa noite,

Primeiramente, muito obrigado pela resposta. mas fiquei com uma dúvida, pois o loop do "while(True)" é quebrado ao fim do "if", tanto é que quando altero o "for in range" por outro loop de "while" ele segue normalmente. Vide código abaixo:

# Faça um Programa que peça 2 números inteiros e um número real. Calcule e mostre:
#   a-) o produto do dobro do primeiro com metade do segundo .
#   b-) a soma do triplo do primeiro com o terceiro.
#   c-) o terceiro elevado ao cubo.


int_maximo = 2
real_maximo = 1
numeros_inteiros = []
numeros_real = []
print("***Bem-vindo ao Exercício 11 da Lista Python***")
print("Vamos precisar de 2 números inteiros e 1 número real")

for num in range(1,int_maximo+1):
    while(True):
        inteiros = input("Insira o {}° número {}: ".format(num,'inteiro'.upper()))
        if(not inteiros.islower()):
            inteiros = inteiros.replace(",", ".")
            inteiros = float(inteiros)
            if(inteiros - round(inteiros,0) == 0):
                inteiros = int(inteiros)
                print("foi".capitalize())
                numeros_inteiros.append(inteiros)
                break
            else:
                print("Por favor, digite {} um número {}".format('apenas'.upper(), 'inteiro'.upper()))
                input("Aperte {} para continuar".format('enter'.upper()))
                print("",end='\n')
        else:
            print("Por favor, digite {} um número {}".format('apenas'.upper(), 'inteiro'.upper()))
            input("Aperte {} para continuar".format('enter'.upper()))
            print("", end='\n')

print("Os {} números {} foram {}".format(int_maximo, 'inteiros',numeros_inteiros))
print("",end='\n')
print("Agora, digite o número real")

#  Troca de "for in range" para "while"

while(real_maximo == 1):
    while(True):
        real = input("Insira o {}° número {}: ".format(real_maximo,'real'.upper()))
        real = real.replace(",",".")
        if(not real.islower()):
            real = float(real)
            print("foi".capitalize())
            numeros_real.append(real)
            break
        else:
            print("Por favor, digite {} um número {}".format('apenas'.upper(), 'real'.upper()))
            input("Aperte {} para continuar".format('enter'.upper()))
            print("",end='\n')
    break
print("O {} números {} foram {}".format(real_maximo, 'real',numeros_real))
print("vamos aos cálculos")
input("Aperte {} para continuar".format('enter'.upper()))
print("",end='\n')

produto = (2 * numeros_inteiros[0]) * (0.5 * numeros_inteiros[1])
print("Questão a: O produto do dobro do primeiro número inteiro com metade do segundo número inteiro, é igual a {}.".format(produto))
input("Aperte {} para continuar".format('enter'.upper()))
print("",end='\n')

soma = (3 * numeros_inteiros[0]) + numeros_real[0]
print("Questão b: A soma do triplo do primeiro número com o terceiro, é igual a {}".format(soma))
input("Aperte {} para continuar".format('enter'.upper()))
print("",end='\n')

cubo = numeros_real[0] ** 3
print("Questão c: O terceiro elevado ao cubo é igual a {}".format(cubo))
input("Aperte {} para continuar".format('enter'.upper()))
print("",end='\n')

print("Resumo:")
print("Questão a = {} , Questão b = {}, Questão c = {}".format(produto,soma,cubo))

print("Obrigado!")

Abração,

solução!

Quando você chama o FOR, você está dizendo pra ele para fazer o loop de 1 até o 0

real_maximo = 1
for num in range(1,real_maximo):  #Isso é igual à range(1 à 1-1) ou range(1 à 0)

Como o valor 1 é MAIOR ou IGUAL ao valor de real_maximo (1), ele não passa na condição e não inicia o loop. Pois o valor do primeiro parâmetro de range() tem que ser MENOR do que o valor do segundo parâmetro para que ele execute o bloco do FOR.

A única forma de permitir que o segundo parâmetro de range() seja menor que o primeiro, é quando se usa o terceiro parâmetro para decrementar o contator for num in range(10, 1, -1): #de 10 à 2, pois quando o 10 valer 1, vai ser igual ao segundo parâmetro, aí não passa, fazendo uma contagem decrescente, aí nesse caso quando o segundo parâmetro for MAIOR ou IGUAL ao primeiro, ele para o loop. (note, a regra é a mesma, só inverte qual o parâmetro é estabelecido como "meta")

No for em questão, tente o seguinte:

for num in range(1,real_maximo +1):

O segundo parâmetro do "for" não é inclusivo. No primeiro laço vc acrescentou '1' corretamente. É só isso! :)

Vlw Ronaldo!!! Obrigadão!!!

Abraços,