我正在编写一个将执行the power triangle计算的Python程序,需要一些帮助来确定我选择方程式的方式是否最有效。
如果你不熟悉,它只是应用余弦定律。在五个可能的输入中,我只需要两个,并且可以计算其他输入。我还实现了matplotlib来可视化输出,但是现在,我只想让数学运行。
我使用tkinter获取输入,使用字典存储输入。
kW = calcInputs.get('kW')
kVA = calcInputs.get('kVA')
kVAR = calcInputs.get('kVAR')
pF = calcInputs.get('PF')
theta = calcInputs.get('Theta')
稍后我将每个字典条目存储为变量,稍后我会将其转换为浮点数。
for i in calcInputs:
if i is not None:
print({i})
else:
pass
这是一个占位符,让我知道哪些是空的:
{{1}}
我是否为每个Nones组合创建一个函数,并根据我的数据调用适当的函数?这似乎是最直接的,但我觉得必须有更好的方法。
答案 0 :(得分:3)
让我们的代码更多一些" Pythonic"第一。你写道:
calcInputs = {}
def fetch(entries):
for entry in entries:
field = entry[0]
text = entry[1].get() # User input for each textbox
print('%s: %s' % (field, text)) # Print to stdout with name
if len(text) == 0:
pass # Don't update dictionary with nulls
else:
calcInputs.update({field:text}) # name : value updated to dictionary
这就存在calcInputs
将持续存在的问题 - 也就是说,它会一直存在到下一个周期(假设存在多个周期),因此可能会将数据保持一次到下一次。让我们在函数内初始化那个空字典,所以我们总是从一个干净的平板开始。 (注意:如果输入框保持其值从一个周期到另一个周期,那对我来说没问题 - 用户可以看到它并在需要时清理它。)
def fetch(entries):
inputs = {}
下一点似乎没问题,虽然我不熟悉Python下的TkInter:
for entry in entries:
field = entry[0]
text = entry[1].get()
这显然是调试代码 - 保持它直到你开心。
print('%s: %s' % (field, text)) # Print to stdout with name
下一部分是"错了。"它看起来像是来自Java - 这是一种很棒的语言。但是由于"truthiness"和句法糖,我们可以做得更清洁。在Python中,字符串是" true"如果它们不是空的,可以使用dict[key]
表示法对字典编制索引:
if text:
inputs[field] = text
就是这样。但由于我们没有使用全局变量,所以让我们继续并返回结果:
return inputs
现在你可以调用fetch,并使用结果。或者,如果您愿意,可以将结果重新分配给全局:
global calcInputs
calcInputs = inputs # instead of return inputs
获得输入后,请继续处理。你有一个问题,你实际上并不知道你给了哪些输入。一种简单的方法就是一系列涉及两个值的if / then语句,通过定义一些常量可以使我们更容易(因为不必一直输入引号):
KW = 'kW'
PF = 'PF'
THETA = 'Theta'
:
calcInputs = fetch(entries) # Or however you choose to init calcInputs
if KW in calcInputs and PF in calcInputs:
triangle_from_KWPF(calcInputs)
elif KW in calcInputs and THETA in calcInputs:
triangle_from_KWTHETA(calcInputs)
elif ...
:
else:
report_error("You didn't provide enough inputs! I need at least 2!")
Python in
运算符适用于字典,设置为键或成员资格测试,字符串作为子字符串搜索,并列为线性扫描。
这种方法是@Alden描述的二进制样式序列,其中包含所有内容。
另一种方法是创建一个可编程对象来编码您给定的参数,并使用字典来调度它们:
given_keys = []
for key in sorted(fields):
if key in calcInputs:
given_keys.append(key)
if len(given_keys) == 2:
break
else: # Fell through
report_error("You didn't provide enough inputs! I need at least 2!")
# given_keys has 2 field-names in it. Concatenate them.
calc_key = '_'.join(given_keys)
# calc_key looks like "KW_Theta"
dispatch = { # dictionary: string -> function
'KW_Theta' : triangle_from_KW_Theta,
'KW_PF' : triangle_from_KW_PF,
# etc....
}
calc_function = dispatch[calc_key]
calc_function(calcInputs)
注意: for...else
是一种有效的Python表单。当for循环耗尽其可迭代时,它运行else
子句。所以它几乎是为一个在中间带有break语句的块量身定做的。
答案 1 :(得分:1)
您可以使用简单的二进制映射来查看输入内容并应用正确的函数。这是一个例子:
kW = input('kW')
kVA = input('kVA')
kVAR = input('kVAR')
pF = input('PF')
theta = input('Theta')
inputs = (kW, kVA, kVAR, pF, theta)
def cmp(t):
z = zip(inputs, t)
z = [a and b for a, b in z]
return sum(z) == sum(t) # 2
if cmp((1,1,0,0,0)):
pass # kW and kVA given
elif cmp((1,0,1,0,0)):
pass # kW and kVAR given
elif cmp((1,0,0,1,0)):
pass
elif cmp((1,0,0,0,1)):
pass
elif cmp((0,1,1,0,0)):
pass
elif cmp((0,1,0,1,0)):
pass
elif cmp((0,1,0,0,1)):
pass
elif cmp((0,0,1,1,0)):
pass
elif cmp((0,0,1,0,1)):
pass
elif cmp((0,0,0,1,1)):
pass