<p>听起来你只是想查字典</p>
<pre><code>pKey = 1
pChoice = choices[pKey] # rock
</code></pre>
<p><code>dict.values</code>用于创建包含字典所有值的列表(实际上是一个<code>dict_values</code>对象)。它不用作查找。你知道吗</p>
<hr/>
<p>就您的代码结构而言,它可能需要一些工作。石头/布/剪刀的选择对于一个<code>Enum</code>来说是完美的,但这可能是你现在有点无法理解的。让我们试着作为顶级模块常量。你知道吗</p>
<pre><code>ROCK = "rock"
PAPER = "paper"
SCISSORS = "scissors"
def get_choice():
"""get_choice asks the user to choose rock, paper, or scissors and
returns their selection (or None if the input is wrong).
"""
selection = input("1. Rock\n2. Paper\n3. Scissors\n>> ")
return {"1": ROCK, "2": PAPER, "3": SCISSORS}.get(selection)
</code></pre>
<p>将它们作为常量进行寻址可以确保它们在代码中的任何地方都是相同的,否则会出现非常明显的NameError(而不是因为执行了<code>if comChoice == "scisors"</code>而导致if分支未执行)</p>
<hr/>
<p>枚举的最小示例如下所示:</p>
<pre><code>from enum import Enum
Choices = Enum("Choices", "rock paper scissors")
def get_choice():
selection = input(...) # as above
try:
return Choices(int(selection))
except ValueError:
# user entered the wrong value
return None
</code></pre>
<p>您可以通过使用更详细的枚举定义来扩展这一点,并教每个Choice实例如何计算赢家:</p>
<pre><code>class Choices(Enum):
rock = ("paper", "scissors")
paper = ("scissors", "rock")
scissors = ("rock", "paper")
def __init__(self, loses, beats):
self._loses = loses
self._beats = beats
@property
def loses(self):
return self.__class__[self._loses]
@property
def beats(self):
return self.__class__[self._beats]
def wins_against(self, other):
return {self: 0, self.beats: 1, self.loses: -1}[other]
s, p, r = Choices["scissors"], Choices["paper"], Choices["rock"]
s.wins_against(p) # 1
s.wins_against(s) # 0
s.wins_against(r) # -1
</code></pre>
<p>不幸的是,没有什么好的方法可以在这方面失去抽象性(抽象出“纸”到选择.纸张每次调用它)因为你不知道当<code>Choices.rock</code>被实例化时<code>Choices["paper"]</code>是什么。你知道吗</p>