Избегайте использования глобальных, не запутывая новых студентов программирования на Python?

Я преподавал основному компьютерному программированию 8-9 классов в течение двух недель, и вчера я попытался показать им, как они могут сделать настоящие простые текстовые приключения в Python.

Сцены – это функции (например, dragons_cave() ), которые состоят из некоторых операторов печати, а затем вызова для input() , спрашивающего игрока, куда они хотят перейти далее, который затем передается в globals() чтобы найти соответствующую функцию, а затем называется. Я знаю, что это не идеальный (в какой момент огромная цепочка функций начнет становиться проблемой?), Но, из того, что перешло мне в голову, кажется, что это самый простой для них, хотя и включает лишь небольшую ручную работу.

Моя проблема связана с глобальным состоянием – например. игрок получает ключ в одной сцене, и только тогда они могут разблокировать ворота в другой сцене. Когда у меня есть глобальные immutables, такие как строки или логические значения, Python хочет, чтобы я использовал ключевое слово global в начале функции.

 global hasKey hasKey = True 

Я все в порядке с этим, но у меня есть смутное чувство (взятое из Stackoverflow среди других мест в Интернете), что на global хмурится и всегда имеет превосходный аналог. Я мог бы иметь глобальный словарь или обернуть все в классе, но я не уверен, могу ли я четко защитить эти варианты своим детям (которые все еще думают о последствиях переменных).

Независимо от того, что я использую, я хочу иметь возможность прямо объяснить моим детям, почему мы делаем это таким образом, и почему это так необходимо. global похоже, обладает обоими этими свойствами, но это плохо?

2 Solutions collect form web for “Избегайте использования глобальных, не запутывая новых студентов программирования на Python?”

Я бы посоветовал им начать изучать ОО

 class Location: name="a place" description = "A dark place. there are exits to the North and East" exits = "North","East" def __str__(self): return "%s\n%s"%(self.name,self.description) class Player: current_location = "Home" inventory = ["Blue Key","Magic Thumbtacks"] health = 100 name = "Unknown" def __init__(self,name): self.name = name player = Player("Player 1") loc = Location() print loc x = input("Input:") 

Честно говоря, игра – сложная концепция (даже текстовое приключение). Но я бы начал их непосредственно над концепциями ОО, они в большей степени выиграют от этого в долгосрочной перспективе.

Предоставленный этот пример очень мал и оставляет много деталей реализации.

Несвязанный, но лучший пример OO:

 class Animal: voice = '...' def speak(self): return "A %s Says '%s'"%(self.__class__.__name__, self.voice) class Dog(Animal): voice = "Bark, Bark" class Duck(Animal): voice = "Quack, Quack" print Dog().speak() print Duck().speak() 

Предполагая, что вы хотите сохранить все как можно проще (без OO) и хотите избежать введения ключевого слова global , вместо этого вы можете использовать словарь состояний и назначать переменные там.

 state['hasKey'] = True 

Поскольку доступ к этому dict не является назначением переменной, вы избегаете введения ключевого слова global и в то же время можете научить, как использовать dict (проверка ключей и т. Д.),

Конечно, вы по-прежнему используете глобальную переменную и на самом деле не решаете проблему хорошего стиля кодирования.

  • Как удалить '\ x' из шестнадцатеричной строки в Python?
  • python 3 map / lambda method с 2 входами
  • Вызывается неправильный интерпретатор python
  • Подавление обработки строки как iterable
  • Существует ли потолочный эквивалент оператора // в Python?
  • Проблемы с печатанием в PyCharm
  • Разница между zip (list) и zip (* list)
  • как добавить сопрограмму к запущенному циклу asyncio?
  • Python - лучший язык программирования в мире.