Я выполняю задание для курса Python — «слепой аукцион», где каждый пользователь вводит свое имя и ставку в пустой словарь.
Идея состоит в том, что вы просматриваете словарь и находите самый высокий ключ и значение («победитель» и «ставка»).
Видимо, согласно курсу, это нужно делать с помощью функции, которую я не совсем понимаю, так как я бы просто выполнял цикл for. Я пытался это сделать, но победителя не нашел.
Это код: «winner_bid» в pycharm говорит: значение локальной переменной «winner_bid» не используется.
empty_dictionary = {}
game_continue = True
def find_highest_bidder():
winner_bid = None
highest_bid = 0
for key in empty_dictionary:
if empty_dictionary[key] > highest_bid:
highest_bid = empty_dictionary[key]
winner_bid = key
while game_continue:
name = input("What is your name?\n")
bid = int(input("What is your price?\n"))
empty_dictionary[name] = bid
continue_input = input("Are there any more bidders? Type 'yes' or 'no'\n").lower()
if continue_input == "no":
game_continue = False
find_highest_bidder()
print(f"The winner is {winner_bid} with a bid of {highest_bid}")
else:
print("\n" * 20)
Ниже приведено правильное решение для контекста:
def find_highest_bidder(bidding_record):
highest_bid = 0
winner = ""
for bidder in bidding_record:
bid_amount = bidding_record[bidder]
if bid_amount > highest_bid:
highest_bid = bid_amount
winner = bidder
print(f"The winner is {winner} with a bid of ${highest_bid}")
bids = {}
continue_bidding = True
while continue_bidding:
name = input("What is your name?: ")
price = int(input("What is your bid?: $"))
bids[name] = price
should_continue = input("Are there any other bidders? Type 'yes or 'no'.\n")
if should_continue == "no":
continue_bidding = False
find_highest_bidder(bids)
elif should_continue == "yes":
print("\n" * 20)
PyCharm прав. Вы присваиваете значение winner_bid
, но оно локально для функции и больше нигде в функции не используется. Если бы вы обошли это и попытались напечатать его вне функции, оно было бы неопределенным.
Обратите внимание, что ваше «правильное решение» печатает результаты из функции.
В текущем коде winner_bid
— это локальная переменная внутри find_highest_bidder
, которая обновляется по ходу цикла, но вы никогда ничего с ней не делаете.
Поскольку вы ссылаетесь на него в game_continue
, похоже, вы хотели использовать его как глобальную переменную. Это сработало бы, но это не лучшая практика. Более надежный подход заключался бы в том, чтобы вернуть запись о самой высокой ставке и запись:
def find_highest_bidder():
winner_bid = None
highest_bid = 0
for key in empty_dictionary:
if empty_dictionary[key] > highest_bid:
highest_bid = empty_dictionary[key]
winner_bid = key
return (winner_bid, highest_bid)
а затем используйте их в game_continue
:
winner_bid, highest_bid = find_highest_bidder()
При этом функция find_highest_bidder
вам действительно не нужна. Вы можете использовать встроенный максимум Python для элементов ставок:
winner_bid, highest_bid = max(bids.items(), key=lambda x: x[1])
Ваша переменная является локальной для вашей функции. Однако вам вообще не обязательно делать его глобальным, возвращать из функции или писать функцию. max
— это функция, и она сделает всю работу за вас в одной строке. Мы просто используем параметр key
в max
, чтобы указать max
использовать второй индекс элементов вашей базы данных для определения максимума.
Вы не проверяете вводимые пользователем данные, но вам определенно следует это делать. Вместо того, чтобы печатать кучу новых строк, чтобы скрыть последнюю ставку, вы можете просто очистить терминал.
import os, sys
CLEAR = ('clear', 'cls')[sys.platform.startswith('win')]
db = {}
while True:
os.system(CLEAR)
# validate name
while len((user := input("What is your name? "))) < 1:
print("Your name must be at least 1 character.")
# validate bid
while not (bid := input("What is your price? ")).isdigit():
print("You must input an integer.")
# store
db[user] = int(bid)
# all we care about is "no" or "n" - anything else is considered "yes"
if input("Are there more bidders? ").lower() in ('no', 'n'):
os.system(CLEAR)
user, bid = max(db.items(), key=lambda item: item[1])
print(f"The winner is {user} with a bid of {bid}")
break