Em Python, as condicionais if, elif (uma contração de 'else and if') e else são usadas para controlar o fluxo da execução e tomar decisões num programa.
Ao contrário de muitas outras linguagens de programação, as versões 3.9 e anteriores do Python não oferecem uma instrução formal de comutação de casos; em vez disso, usam várias instruções elif para um propósito semelhante.
O Python 3.10 introduz uma variante da instrução de comutação de casos chamada structural pattern matching, que será abordada à parte, noutro conceito.
As condicionais usam expressões que têm de resultar em True ou False: quer devolvendo diretamente um tipo bool, quer sendo avaliadas como "truthy" ou "falsy".
x = 10
y = 5
# The comparison '>' returns the bool 'True',
# so the statement is printed.
if x > y:
print("x is greater than y")
...
>>> x is greater than y
Quando associado a um if, um bloco de código else opcional é executado quando a condição original do if for avaliada como False:
x = 5
y = 10
# The comparison '>' here returns the bool 'False',
# so the 'else' block is executed instead of the 'if' block.
if x > y:
print("x is greater than y")
else:
print("y is greater than x")
...
>>> y is greater than x
O elif permite várias avaliações e ramificações.
x = 5
y = 10
z = 20
# The 'elif' statement allows for the checking of more conditions.
if x > y:
print("x is greater than y and z")
elif y > z:
print("y is greater than x and z")
else:
print("z is greater than x and y")
...
>>> z is greater than x and y
As operações Boolean e as comparações podem ser combinadas com condicionais para fazer testes mais complexos:
>>> def classic_fizzbuzz(number):
if number % 3 == 0 and number % 5 == 0:
say = 'FizzBuzz!'
elif number % 5 == 0:
say = 'Buzz!'
elif number % 3 == 0:
say = 'Fizz!'
else:
say = str(number)
return say
>>> classic_fizzbuzz(15)
'FizzBuzz!'
>>> classic_fizzbuzz(13)
'13'
Neste exercício, vamos desenvolver um sistema de controlo simples para um reator nuclear.
Para que um reator produza potência, tem de estar num estado de criticalidade. Se o reator estiver num estado abaixo da criticalidade, pode sofrer danos. Se o estado do reator ultrapassar a criticalidade, pode sobrecarregar e provocar uma fusão do núcleo. Queremos reduzir a probabilidade de uma fusão do núcleo e gerir corretamente o estado do reator.
As três tarefas seguintes estão todas relacionadas com a escrita de código para manter o estado ideal do reator.
A primeira coisa que um sistema de controlo tem de fazer é verificar se o reator está equilibrado na criticalidade. Diz-se que um reator está equilibrado na criticalidade se cumprir as seguintes condições:
Implementa a função is_criticality_balanced(), que recebe temperature, medido em kelvin, e neutrons_emitted como parâmetros, e devolve True se as condições de criticalidade se verificarem e False se não.
>>> is_criticality_balanced(750, 600)
True
Assim que o reator começa a produzir potência, é preciso determinar a sua eficiência. A eficiência pode ser agrupada em 4 faixas:
green -> eficiência de 80% ou mais,orange -> eficiência inferior a 80%, mas de pelo menos 60%,red -> eficiência inferior a 60%, mas ainda 30% ou mais,black -> eficiência inferior a 30%.O valor percentual pode ser calculado como (generated_power/theoretical_max_power)*100,
em que generated_power = voltage * current.
Tem em atenção que o valor percentual normalmente não é um número inteiro, por isso certifica-te de que consideras o uso correto das comparações < e <=.
Implementa a função reactor_efficiency(<voltage>, <current>, <theoretical_max_power>), com três parâmetros: voltage, current e theoretical_max_power.
Esta função deve devolver a faixa de eficiência do reator: 'green', 'orange', 'red' ou 'black'.
>>> reactor_efficiency(200,50,15000)
'orange'
A tua última tarefa consiste em criar um mecanismo à prova de falhas para evitar sobrecargas e uma fusão do núcleo. Este mecanismo determina se o reator está abaixo, igual ou acima do limiar ideal de criticalidade. A criticalidade pode depois ser aumentada, reduzida ou interrompida através da inserção (ou remoção) de barras de controlo no reator.
Implementa a função chamada fail_safe(), que recebe 3 parâmetros: temperature, medido em kelvin, neutrons_produced_per_second e threshold, e devolve um código de estado para o reator.
Se temperature * neutrons_produced_per_second < 90% de threshold, devolve o código de estado 'LOW',
que indica que as barras de controlo têm de ser removidas para produzir potência.
Se o valor temperature * neutrons_produced_per_second estiver dentro de 10% de threshold (ou seja, 0-10% abaixo do limiar, exatamente no limiar, ou 0-10% acima do limiar), o reator está em criticalidade e deve ser devolvido o código de estado 'NORMAL', que indica que o reator está em condições ótimas e que as barras de controlo estão numa posição ideal.
Se temperature * neutrons_produced_per_second não estiver nos intervalos indicados acima, o reator está a entrar em fusão do núcleo e é preciso devolver o código de estado 'DANGER' para desligar imediatamente o reator.
>>> fail_safe(temperature=1000, neutrons_produced_per_second=30, threshold=5000)
'DANGER'
Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.