<p>你需要的是数字而不是字符串。您还可以使用字典来调用函数,而不是使用大型if-elif构造,从而使代码成为“snappier”。使用函数请求数字/输入也是减少重复编码的一个好方法(干-不要重复自己):</p>
<p>在dict中固定数字(或直接使用数字):</p>
<pre><code>stock = {
'3AB': {'Name': 'Telcom', 'Purchase Date': '12/12/2018',
'Price': float('1.55'), 'Volume': int('3000')},
'S12': {'Name': 'S&P', 'Purchase Date': '12/08/2018',
'Price': float('3.25'), 'Volume': int('2000')},
'AE1': {'Name': 'A ENG', 'Purchase Date': '04/03/2018',
'Price': float('1.45'), 'Volume': int('5000')} }
</code></pre>
<p>不要重复:</p>
<pre><code>def inputNumber(text,r):
"""Handles numeric input - input must be inside r (f.e. a range/set/list)."""
while True:
try:
choice = int(input(text))
if choice in r:
return choice
except ValueError:
print("Wrong choice - try again.")
def inputTextUpper(r):
"""Handles text input - text must be inside r (a list/set/...) and is returned as
upper(). If nothing is inputted the function returns None."""
while True:
try:
choice = input("Choose one: {} - return to skip.".format(str(r))).upper()
if choice in r:
return choice
elif not choice:
return None # empty input
except ValueError:
print("Wrong choice - try again.")
</code></pre>
<p>将函数映射到输入并调用它们:</p>
<pre><code>def buy():
input1 = inputTextUpper([x for x in stock.keys()])
what = stock.get(input1) # get the inner dict or None if empty input
if not what:
print("Back to main menue")
return
# using , instead of + to avoid errors when print numbers - you should probably
# read about str.format() or f""-strings to make formatting "better"
print("\nCode: ", input1)
print("Name: ", what['Name'])
print("Last Purchase Date: ", what['Purchase Date'])
print("Average Price: ", what['Price'])
print("Volume: ", what['Volume'])
print("Investment Cost ($): ", what['Volume']*what['Price'])
def dummy():
print("Not implemented")
def menu():
# map an input to a function call (the name of the function to be called)
funcMapp = {1:buy, 2:dummy, 3:dummy, 4:dummy,5:dummy} # lots of dummies
while True:
menuChoice = inputNumber("""
Menu
1. List Holding and Sold details for a Stock
2. Buy Stock
3. Sell Stock
4. list Holdings
5. list Sold Stock
0. Exit
""", range(6))
if menuChoice == 0:
break
# execute the function choosen
funcMapp[menuChoice] () # this gets the function from the dict and calls it
menu()
</code></pre>
<hr/>
<p>一次运行的输出:</p>
<pre><code> Menu
1. List Holding and Sold details for a Stock
2. Buy Stock
3. Sell Stock
4. list Holdings
5. list Sold Stock
0. Exit
Dunno
Wrong choice - try again.
Menu
1. List Holding and Sold details for a Stock
2. Buy Stock
3. Sell Stock
4. list Holdings
5. list Sold Stock
0. Exit
2
Not implemented
Menu
1. List Holding and Sold details for a Stock
2. Buy Stock
3. Sell Stock
4. list Holdings
5. list Sold Stock
0. Exit
1
Choose one: ['3AB', 'S12', 'AE1'] - return to skip.None
Choose one: ['3AB', 'S12', 'AE1'] - return to skip.asdf
Choose one: ['3AB', 'S12', 'AE1'] - return to skip.3ab
Code: 3AB
Name: Telcom
Last Purchase Date: 12/12/2018
Average Price: 1.55
Volume: 3000
Investment Cost ($): 4650.0
Menu
1. List Holding and Sold details for a Stock
2. Buy Stock
3. Sell Stock
4. list Holdings
5. list Sold Stock
0. Exit
1
Choose one: ['3AB', 'S12', 'AE1'] - return to skip.
Back to main menue
Menu
1. List Holding and Sold details for a Stock
2. Buy Stock
3. Sell Stock
4. list Holdings
5. list Sold Stock
0. Exit
0
</code></pre>
<p>请参阅<a href="https://stackoverflow.com/questions/11041405/why-dict-getkey-instead-of-dictkey">Why dict.get(key) instead of dict[key]?</a>了解如何避免KeyError和<a href="https://docs.python.org/3/library/string.html#custom-string-formatting" rel="nofollow noreferrer">string formating</a>了解更多格式化选项</p>