Действие при изменении переменной в python

#python #variables

#питон #переменные #python

Вопрос:

Итак, я пытаюсь создать симулятор больницы (на основе текста), и есть возможность набрать больше персонала. Я выяснил, как ограничить количество раз, которое они могут набирать (ограничение в 350 сотрудников), и сумма, которую они получают, должна быть случайной (random.choice (staffrec), но как только случайное число генерируется из staffrec, оно остается прежним, и я хочу, чтобы код был запущен снова с другим результатом. Вот мой код. (Извините за длинноту, я поместил все это, чтобы ничего не пропустить)

 import time
import random

staff = 100
wards = 20
beds = 140
patients = 80

staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
staffrec = random.choice(staffrec)


option = ""

print("Welcome to Hospital Simulator!")

print("You have to manage the hospital with patients coming in,")
print("Staff recruitement and staff quitting,")
print("and how many beds and wards are available!")

Aopt = ["A", "a"]
Bopt = ["B", "b"]
Copt = ["C", "c"]
Dopt = ["D", "d"]
Eopt = ["E", "e"]
Fopt = ["F", "f"]

while staff <= 350:
    staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    staffrec = random.choice(staffrec)
    staff = staff   staffrec

while option != Fopt:
    option = input("""What would you like to do:
A: View number of patients
B: View number of beds
C: View number of wards
D: View number of staff
E: Recruit more staff
F: Quitn""")

    if option in Aopt:
        print("You currently have "   str(patients)   " patientsn")

    if option in Bopt:
        print("You currently have "   str(beds)   " bedsn")

    if option in Copt:
        print("You have "   str(wards)   " wardsn")

    if option in Dopt:
        print("You currently have "   str(staff)   " staffn")

    if option in Eopt:
        print("You try and recruit more staff. You recruit "   str(staffrec)   " staffn")
        if staff > 350:
            print("You cannot recruit any more staff!")

    if option in Fopt:
        print("Goodbye!")
        break
  

Были и другие сообщения, связанные с этой темой с использованием классов, но поскольку я довольно новичок в python, я не совсем понял их. : 3 Мы были бы очень признательны за любую помощь!
Питер

Ответ №1:

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

 prev_staffrec = None
staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]

def choose_staffrec():
    global prev_staffrec # to make sure you're accessing it in the global scope
    staffrec2 = random.choice(staffrec)
    if staffrec2 == prev_staffrec:
        choose_staffrec() # run the function again if it's the same
    return staffRec2
  

это устраняет необходимость создавать staffrec снова и снова
теперь везде, где у вас есть строки

 staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
staffrec = random.choice(staffrec)
  

вы можете заменить на:

 choose_staffrec()
  

Ответ №2:

Добро пожаловать на форум,

Мне бросается в глаза несколько особенностей вашего кода:

 staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
staffrec = random.choice(staffrec)
  

Эти две строки ничего не вносят, поскольку вы в любом случае заменяете значение staffrec позже. Кроме того, как правило, избегайте повторного использования имен переменных, особенно если вы переназначаете им совершенно разные типы ( staffrec был список, теперь это целое число).

Этот цикл:

 while staff <= 350:
    staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    staffrec = random.choice(staffrec)
    staff = staff   staffrec
  

Кажется избыточным, и на самом деле это не ограничивает staff максимум 350. При использовании этого подхода, когда цикл заканчивается, staff всегда будет между 351 и 359.
Каким вы хотите, чтобы был фактический диапазон? Зачем вам для этого нужен цикл? Просто используйте random.randint для генерации числа в фиксированном диапазоне.

Это условие:

 while option != Fopt:
  

Никогда не будет false. option всегда будет строкой, а строка никогда не будет равна кортежу. Поскольку вы все равно используете break позже для выхода из цикла, вы могли бы также превратить это в while True: .

Если я правильно понял вопрос, вы хотите знать, как сгенерировать новое значение для staff (путем повторного запуска цикла while из предыдущего). Вы могли бы обернуть это в функцию, но это кажется ненужным — просто используйте random.randint для генерации нового значения, как я упоминал ранее.

Ответ №3:

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

Я бы также предложил использовать randint метод over choice, поскольку он будет генерировать случайное число между любыми двумя значениями. Например, random.randint(0, 100) вернет случайное число от 0 до 100.

Смотрите ниже:

 if option in Eopt:
    staffrec = random.randint(1, 9)
    staff = staffrec

    print("You try and recruit more staff. You recruit "   str(staffrec)   " staffn")
    if staff > 350:
        print("You cannot recruit any more staff!")

  

Комментарии:

1. на самом деле, op присваивает значение staffrec более одного раза и 350 раз в цикле while

2. Это все равно происходит до того, как будет сделано что-либо еще, и остается неизменным на каждой итерации цикла выбора опции, поэтому оно никогда не изменяет значение staffrec