Как использовать целочисленную переменную в качестве параметра для функции? - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь создать фрагмент кода, который будет подсчитывать голоса для трех разных кандидатов, и я использую функцию, которая использует имя переменной (либо A, B, либо C) в качестве параметра.

Я пытаюсь сделать так, чтобы каждый раз, когда подсчитывался голос за этого кандидата, он вызывал функцию, чтобы увеличить переменную для этого кандидата на 1. Тем не менее, каждый раз, когда я пробовал, все 3 кандидата всегда будут 0 подсчитанных голосов, если я полностью не уберу функцию.

Я пробовал несколько разных способов сделать переменные глобальными переменными, но все они дали одинаковые результаты.

A = 0
B = 0
C = 0

def after_vote(letter):
    letter = letter + 1
    print("Thank you for your vote.")

def winner(winner_letter, winner_votes):
    print("The winner was", winner_letter, "with", str(winner_votes), "votes.")

while True:
    vote = input("Please vote for either Candidate A, B or C. ").upper()
    if vote == "A":
        after_vote(A)
    elif vote == "B":
        after_vote(B)
    elif vote == "C":
        after_vote(C)
    elif vote == "END":
        print("Cadidate A got", str(A), "votes, Candidate B got", str(B), "votes, and Candidate C got", str(C), "votes.")
        if A > B and A > C:
            winner("A", A)
            break
        elif B > A and B > C:
            winner("B", B)
            break
        elif C > A and C > B:
            winner("C", C)
            break
        else:
            print("There was no clear winner.")
            break
    else:
        print("Please input a valid option.")

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Самый простой способ сделать это - использовать dict, если нет двух кандидатов с одинаковыми именами.

candidates = {"A":0, "B":0, "C":0}

Оттуда вы можете настроить функцию для поиска значения всловарь и увеличивайте его:

def update_vote(candidate):
    candidates[candidate] += 1

Или, черт возьми, вы можете просто обновить голоса на месте, а не вызывать функцию с помощью:

candidates[candidate] += 1

Гораздо более питоническийспособ сделать это состоит в том, чтобы сделать каждого кандидата объектом, который может обновлять свой подсчет голосов.

class Candidate(object):
    def __init__(self):
        # This is the "constructor" for the object.
        # It is run whenever an instance of this object is created.
        # We want it to "spawn in" with zero votes.
        self.vote_count = 0
    def update_vote(self):
        self.vote_count += 1

Кажется, это ближе к тому, что вы получали в своем первоначальном посте.Вы должны создать объект следующим образом:

A = Candidate()
B = Candidate()
C = Candidate()

И затем в своем основном цикле вы просто скажете каждому объекту обновляться:

if vote == "A":
    A.update_vote()

Наконец, когда выДля подсчета голосов нужно просто попросить каждый объект подсчитать количество голосов:

if A.vote_count > B.vote_count and A.vote_count > C.vote_count
0 голосов
/ 18 мая 2018

Прежде всего, идея ошибочна.Вы не хотите обрабатывать глобальные переменные и передавать имена.Это может быть сделано, но это плохая идея.

Лучшим вариантом является передача переменной, которую нужно изменить, в функцию.Однако уловка с целыми числами заключается в том, что они являются неизменяемыми, поэтому вы не можете передать целое число, которое будет изменено функцией, как, например, в C.

Осталось либо:

  • передать значение в функцию, вернуть модифицированное значение из функции;или
  • передать изменяемый объект, содержащий значение, в функцию

Это была теория, вот как это сделать ...

Решение 1: пройтиодно значение, вернуть измененное значение

def after_vote(value):
    print("Thank you for your vote.")
    # Instead of modifying value (impossible), return a different value
    return value + 1

A = after_vote(A)

Решение 2: передать «изменяемое целое число»

class MutableInteger:
    def __init__(value):
        self.value = value

A = MutableInteger(0)

def after_vote(count):
    # Integers cant be modified, but a _different_ integer can be put
    # into the "value" attribute of the mutable count object
    count.value += 1
    print("Thank you for your vote.")

after_vote(A)

Решение 3: передать (изменяемый!) словарь всех голосов

votes = {'A': 0, 'B': 0, 'C': 0}

def after_vote(votes, choice):
    # Dictionaries are mutable, so you can update their values
    votes[choice] += 1
    print("Thank you for your vote.")

after_vote(votes, "A")

Решение 4 (худшее!): На самом деле делайте то, что вы просили

def after_vote(letter):
    # Global variables are kept in a dictionary. globals() returns that dict
    # WARNING: I've never seen code which does this for a *good* reason
    globals()[letter] += 1
    print("Thank you for your vote.")
0 голосов
/ 18 мая 2018

В вашей ситуации лучше определить 3 функции, по одной для каждого кандидата:

A = 0
B = 0
C = 0

def after_vote_A():
    global A
    A += 1
    print("Thank you for your vote.")

def after_vote_B():
    global B
    B += 1
    print("Thank you for your vote.")

def after_vote_C():
    global C
    C += 1
    print("Thank you for your vote.")

Не забудьте использовать ключевое слово global, иначе вы определите локальную переменную.

Альтернативой является сохранение голосов в dict:

votes = {'A': 0, 'B': 0, 'C': 0}

def after_vote(letter):
    votes[letter] += 1
    print("Thank you for your vote.")

Демонстрация:

after_vote('A')
after_vote('B')
after_vote('A')
after_vote('A')
print(votes)

Вы получаете:

Thank you for your vote.
Thank you for your vote.
Thank you for your vote.
Thank you for your vote.
{'A': 3, 'B': 1, 'C': 0}
0 голосов
/ 18 мая 2018

Вам нужно передать изменяемый тип данных в функцию, чтобы вы могли изменить его. Попробуйте добавить кандидатов в список или словарь.

candidates = {'A':0, 'B':0, 'C':0}

def after_vote(letter):
    global candidates
    if letter in candidates:
        candidates[letter] += 1
        print("Thank you for your vote.")
    else:
        print("No such candidate: Your vote is invalid.")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...