避免使用全局而不会混淆Python中的新编程学生?

Eli*_*ICA 12 python python-3.x

我已经教了8到9年级的基础计算机编程两周了,昨天我试着向他们展示如何用Python制作真正简单的文本冒险游戏.

场景是函数,(例如dragons_cave())由一些打印语句组成,然后调用input(),询问玩家他们想要去哪里,然后传递给globals()他们找到适当的函数,然后调用.我知道它不理想(在什么时候这个巨大的功能链会在什么时候开始变成一个问题?)但是,在我的脑海里,它似乎是最简单的,只涉及一点点的手工操作.

我的问题是全球状态 - 例如.玩家在一个场景中获得一个键,然后才能在另一个场景中解锁门.当我有像字符串或布尔值这样的全局不可变量时,Python希望我global在函数的开头使用关键字.

global hasKey
hasKey = True
Run Code Online (Sandbox Code Playgroud)

我对此非常好,但我有一种模糊的感觉(从互联网上其他地方的Stackoverflow中获取),这global是不赞成的,并且总是有一个优越的对手.我可以有一个全球字典或将所有内容包装在一个类中,但我不确定我是否能够清楚地向我的孩子们保护这些选项(他们仍在考虑变量的含义).

无论我使用什么,我希望能够直接向我的孩子解释为什么我们这样做,为什么这样做是必要的.global似乎有这两个属性,但它不好吗?

Jor*_*ley 10

我鼓励他们开始学习OO

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:")
Run Code Online (Sandbox Code Playgroud)

说实话,游戏是一个困难的概念(甚至是文本冒险).但我会直接从OO概念开始,从长远来看,他们将从中受益更多.

虽然这个例子非常小,但却留下了很多实现细节.

一个不相关但更好的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()
Run Code Online (Sandbox Code Playgroud)


Mic*_*rer 9

假设你想让事情尽可能简单(没有OO)并且想要避免引入global关键字,你可以使用状态字典并在那里分配变量.

state['hasKey'] = True
Run Code Online (Sandbox Code Playgroud)

由于访问dict不是变量赋值,您可以避免引入global关键字,同时可以教授如何使用dict(检查键等)

当然,您仍然使用全局变量,并没有真正解决良好编码风格的问题.但另一方面,它可以作为范围和命名空间的介绍.