根据给定的输入执行触发器计算

2024-04-20 14:28:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个Python程序,它将执行the power triangle的计算,并且需要一些帮助来确定我选择公式的方法是否最有效。你知道吗

如果你不熟悉,这只是余弦定律的应用。在五个可能的输入中,我只需要两个,并且可以计算其他的。我还实现了matplotlib来可视化输出,但是现在,我只想运行数学。你知道吗

我用tkinter来获取输入,用字典来存储输入。你知道吗

fields = 'kW', 'kVA', 'kVAR', 'PF', 'Theta'
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

稍后,我将每个字典条目存储为一个变量,稍后将其转换为一个float。你知道吗

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

我是否为每个none组合创建一个函数,并根据我拥有的数据调用相应的函数?这似乎是最直截了当的,但我觉得一定有更好的办法。你知道吗


Tags: textinfieldforget字典entriesprint
2条回答

让我们先让你的一些代码更“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,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循环耗尽其iterable时,它运行else子句。因此,它是非常适合于一个块在中间休息语句。你知道吗

您可以使用一个简单的二进制映射来查看您的输入是什么,并应用适当的函数。举个例子:

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

相关问题 更多 >