Я учусь использовать функции в циклах while. Моя цель — запросить у пользователя ввод данных внутри цикла while и использовать ввод в качестве аргумента в функции. Но если в любой момент ввод == 'q', цикл должен быть завершен.
Функция следующая:
def make_album(artist_name, album_name, tracks = None):
if tracks:
album = {
'artist': artist_name,
'album': album_name,
'number of tracks': tracks
}
return album
else:
album = {
'artist': artist_name,
'album': album_name,
}
return album
Он помещается внутри цикла while:
create_album = True
while create_album:
artist = input("Enter atrist's name: ").title()
if artist == 'q'.lower():
create_album = False
album = input("Enter album's name: ").capitalize()
if album == 'q'.lower():
create_album = False
number_of_tracks = input("(Optional) Enter number of tracks: ")
if number_of_tracks =='q'.lower():
create_album = False
elif number_of_tracks:
print(make_album(artist, album, number_of_tracks))
else:
print(make_album(artist, album))
Несмотря на то, что каждый ввод проверяется с помощью оператора if и должен изменить значение create_album на False, если ввод имеет значение «q», он работает правильно только в последней части кода:
number_of_tracks = input("(Optional) Enter number of tracks: ")
if number_of_tracks =='q'.lower():
create_album = False
Как исправить программу, чтобы она завершала цикл while в любой момент, если пользователь вводит «q»?
Я пытался изменить различные способы решения проблемы.
1)
if artist == 'q'.lower():
break
Результат:
Enter album's name:
2)
if artist == 'q'.title():
create_album = False
if artist == 'q':
create_album = False
if artist == 'Q':
create_album = False
Результат:
Enter album's name:
Вы вводите пользовательский ввод в заголовке или заглавными буквами, а затем сверяете его со значением в нижнем регистре…
Как только вы определите, что пользователь ввел «q», вы устанавливаете create_album
на False
, но затем переходите к следующему вводу.
Вы можете добавить break
или, в данном случае, даже continue
к телу if
тестов для 'q'
. Кроме того, artist == 'q'.lower()
не имеет смысла, поскольку 'q'
уже в нижнем регистре. Вместо этого вы хотите artist.lower() == 'q'
:
if artist.lower() == 'q':
create_album = False
break
Но для этого кода вообще нет смысла использовать create_album
. Вместо этого вы можете заменить все это на:
while True:
artist = input("Enter atrist's name: ").title()
if artist.lower() == 'q':
break
album = input("Enter album's name: ").capitalize()
if album.lower() == 'q':
break
number_of_tracks = input("(Optional) Enter number of tracks: ")
if number_of_tracks.lolwer()=='q':
break
elif number_of_tracks:
print(make_album(artist, album, number_of_tracks))
else:
print(make_album(artist, album))
Кстати, вместо того, чтобы требовать ручной ввод для каждого компакт-диска в вашей коллекции, вы можете изучить gnudb.org (у меня нет недавнего опыта, но раньше мне нравился FreeDB) или более современный MusicBrainz.