8.8. Otros usos de while
8.8.1. Valores centinela
Los bucles indefinidos son mucho más comunes en el mundo real que los bucles definidos.
Si está vendiendo boletos a un evento, no sabe de antemano cómo Muchos boletos venderás. Sigues vendiendo boletos siempre que la gente venga a la puerta y hay espacio en el pasillo.
Cuando el equipo de equipaje descarga un avión, no saben de antemano cuántos Las maletas hay. Siguen descargando mientras quedan bolsas en el Hold de carga. (Por qué su maleta es siempre la última es un problema completamente diferente).
Cuando pasas por la línea de pago en el supermercado, los empleados no Sepa de antemano cuántos artículos hay. Siguen sonando artículos como Mientras haya más en la cinta transportadora.
Implementemos el último de estos en Python, pidiéndole al usuario los precios y mantener un total de funcionamiento y contar de artículos. Cuando se ingresa el último elemento, El programa ofrece el gran total, el número de artículos y el precio promedio. Necesitaremos estas variables:
total
- Esto comenzará en cerocount
- El número de elementos que también comienza en ceromoreItems
- Un booleano que nos dice si más artículos están esperando; Esto comienza como cierto
El pseudocódigo (código escrito mitad en inglés, mitad en Python) para el cuerpo del bucle se parece a esto:
>>while moreItems >> ask for price >> add price to total >> add one to count
Este pseudocódigo no tiene opción para establecer moreItems
a False
, entonces funcionaría para siempre.
En una tienda de comestibles, hay un poco
barra de plástico que coloca después de su último artículo para separar sus comestibles de
los de la persona detrás de ti; Así es como el empleado sabe que no tienes más elementos.
No tenemos un tipo de datos de "pequeña barra de plástico" en Python, así que haremos lo mejor:
usará un price
de cero para significar "Este es mi último artículo". En este programa,
Zero es un valor centinela , un valor utilizado para indicar el final del bucle. Aquí está el código:
>>def checkout():
>> total = 0
>> count = 0
>> moreItems = True
>> while moreItems:
>> price = float(input('Enter price of item (0 when done): '))
>> if price != 0:
>> count = count + 1
>> total = total + price
>> print('Subtotal: $', total)
>> else:
>> moreItems = False
>> average = total / count
>> print('Total items:', count)
>> print('Total $', total)
>> print('Average price per item: $', average)
>>checkout()
Todavía hay algunos problemas con este programa.
Si ingresa un número negativo, se agregará al total y se cuenta. Modificar el código para que los números negativos dan un mensaje de error (pero no finalice el bucle) sugerir:
elif
es tu amigo.Si ingresa cero la primera vez que se le pide un precio, el bucle finalizará y el programa Intentará dividir por cero. Usa un
if
/else
declaración fuera del bucle para evitar el división por cero y dígale al usuario que no puede calcular un promedio sin datos.Este programa no muestra las cantidades de dos decimales. En el próximo capítulo lo harás Vea el método de formato de cadena que hará el truco.
Quiz. Comprueba tu comprensión
Verdadero o falso: un bucle de tiempo continuará itando para siempre a menos que cumpla con una condición para detenerse.
Actividad: 8.8.1.2 Opción múltiple (CH07_SENTINEL_2)
8.8.2. Validación de la entrada
También puedes usar un while
bucle cuando desea validar la entrada; Cuando quieres hacer
Seguro que el usuario ha ingresado una entrada válida para un mensaje. Digamos que quieres una función
Eso hace una pregunta de sí o no. En este caso, debe asegurarse de que la persona que use
Su programa ingresa a una Y para sí o N para NO (en la caja superior o en minúsculas).
Aquí hay un programa que utiliza un while
Luce para seguir preguntando hasta que reciba una respuesta válida.
Como una vista previa de las atracciones que se avecinan, usa
el upper()
Método que se describe en los métodos de cadena para convertir una cadena en mayúsculas.
Cuando ejecute el siguiente código, intente escribir algo más que Y o N para ver cómo reacciona el código:
>> def get_yes_or_no(message):
>> valid_input = False
>> answer = input(message)
>> while not valid_input:
>> answer = answer.upper() # convert to upper case
>> if answer == 'Y' or answer == 'N':
>> valid_input = True
>> else:
>> answer = input('Please enter Y for yes or N for no. \n' + message)
>> return answer
>>response = get_yes_or_no('Do you like lima beans? Y)es or N)o: ')
>>if response == 'Y':
>> print('Great! They are very healthy.')
>>else:
>> print('Too bad. If cooked right, they are quite tasty.')
No hay comentarios.:
Publicar un comentario