为什么不在字典中调用 input() 时激活?
Why does input() activate when not being called in dictionary?
在我的代码中,我有一个值字典以及一个名为 'custom'
的键,它允许我输入任意值。当我打印 NOT 'custom'
的键值时,它仍然命中 input()
字段:
Ip = {'argon':15.76,
'neon':21.56,
'krypton':14.00,
'xenon':12.13,
'helium':24.59,
'hydrogen':15.42,
'custom': float(input('Enter ionization potential (eV): '))}
print(Ip['argon'], Ip['helium'])
输出:
Enter ionization potential (eV): 1
15.76 24.59
我的印象是键及其相关值在调用之前一直被抑制,但显然我误解了字典的工作原理。
一种快速而肮脏的改进方法是创建一个条件语句,但是(出于某种原因)可能有多个 input()
字典定义,这样我就必须对条件语句进行硬编码为每一个。有没有更 Pythonic 的方式来做到这一点?
def func(key):
if key == 'custom':
Ip = {key:float(input('Enter ionization potential (eV): '))}
# Is there a way to remove the need for a conditional statement?
else:
Ip = {'argon':15.76,
'neon':21.56,
'krypton':14.00,
'xenon':12.13,
'helium':24.59,
'hydrogen':15.42}
return print(Ip[key])
func('argon')
输出:
15.76
它正在 被调用,如您所知。当您定义 dict 时,会评估调用并将其结果插入 'custom'
下的 dict 中,因此在该示例中,'custom': 1.0
。为避免调用,请将其改为函数。
现在提出了一个问题,即如何在字典中混合类型(浮点数和函数)以及如何对函数进行特殊封装。解决这个问题的一种方法是使用两个独立的指令:一个带有浮点数,另一个带有函数。例如:
def func(key):
ionization_potential = {
'argon': 15.76,
'neon': 21.56,
'krypton': 14.00,
'xenon': 12.13,
'helium': 24.59,
'hydrogen': 15.42}
functions = {
'custom': lambda: float(input('Enter ionization potential (eV): '))}
try:
v = ionization_potential[key]
except KeyError:
f = functions[key]
v = f()
return v
演示:
>>> func('argon')
15.76
>>> func('custom')
Enter ionization potential (eV): 1
1.0
最后,如果在任何一个字典中都找不到键,这将从 KeyError
引发 KeyError
,所以如果我是你,我会引发 ValueError from None
在这种情况下,因为问题出在参数的值上:
try:
f = functions[key]
except KeyError:
raise ValueError(f'key not found: {key!r}') from None
v = f()
演示:
>>> func('foobar')
Traceback (most recent call last):
...
ValueError: key not found: 'foobar'
在我的代码中,我有一个值字典以及一个名为 'custom'
的键,它允许我输入任意值。当我打印 NOT 'custom'
的键值时,它仍然命中 input()
字段:
Ip = {'argon':15.76,
'neon':21.56,
'krypton':14.00,
'xenon':12.13,
'helium':24.59,
'hydrogen':15.42,
'custom': float(input('Enter ionization potential (eV): '))}
print(Ip['argon'], Ip['helium'])
输出:
Enter ionization potential (eV): 1
15.76 24.59
我的印象是键及其相关值在调用之前一直被抑制,但显然我误解了字典的工作原理。
一种快速而肮脏的改进方法是创建一个条件语句,但是(出于某种原因)可能有多个 input()
字典定义,这样我就必须对条件语句进行硬编码为每一个。有没有更 Pythonic 的方式来做到这一点?
def func(key):
if key == 'custom':
Ip = {key:float(input('Enter ionization potential (eV): '))}
# Is there a way to remove the need for a conditional statement?
else:
Ip = {'argon':15.76,
'neon':21.56,
'krypton':14.00,
'xenon':12.13,
'helium':24.59,
'hydrogen':15.42}
return print(Ip[key])
func('argon')
输出:
15.76
它正在 被调用,如您所知。当您定义 dict 时,会评估调用并将其结果插入 'custom'
下的 dict 中,因此在该示例中,'custom': 1.0
。为避免调用,请将其改为函数。
现在提出了一个问题,即如何在字典中混合类型(浮点数和函数)以及如何对函数进行特殊封装。解决这个问题的一种方法是使用两个独立的指令:一个带有浮点数,另一个带有函数。例如:
def func(key):
ionization_potential = {
'argon': 15.76,
'neon': 21.56,
'krypton': 14.00,
'xenon': 12.13,
'helium': 24.59,
'hydrogen': 15.42}
functions = {
'custom': lambda: float(input('Enter ionization potential (eV): '))}
try:
v = ionization_potential[key]
except KeyError:
f = functions[key]
v = f()
return v
演示:
>>> func('argon')
15.76
>>> func('custom')
Enter ionization potential (eV): 1
1.0
最后,如果在任何一个字典中都找不到键,这将从 KeyError
引发 KeyError
,所以如果我是你,我会引发 ValueError from None
在这种情况下,因为问题出在参数的值上:
try:
f = functions[key]
except KeyError:
raise ValueError(f'key not found: {key!r}') from None
v = f()
演示:
>>> func('foobar')
Traceback (most recent call last):
...
ValueError: key not found: 'foobar'