根据给出的输入执行三角形计算

时间:2017-04-13 20:16:49

标签: python dictionary

我正在编写一个将执行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组合创建一个函数,并根据我的数据调用适当的函数?这似乎是最直接的,但我觉得必须有更好的方法。

2 个答案:

答案 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