0

所以我试图在 python 的列表中找到一个项目。这是我的功能:

def operator(input):
    operatorlist = ['+', '-', '*', '/', '^', 'sin', 'cos']

    for i in operatorlist:
        if input is operatorlist[i]:
            return True

我的代码坏了,我不知道为什么……有什么想法吗?

我改变了我的代码:

def operator(input):
    if input is '+' or input is '-' or input is '*' or input is '/' or input is '^' or input is 'sin' or input is 'cos':
    return True

因为有人告诉我,从本质上讲,这样写在风格上是愚蠢的。

4

6 回答 6

11

一条线 :

return input in operatorlist

这里不需要做条件,in 操作符已经返回一个布尔值。

于 2012-04-14T00:43:32.750 回答
3

这里有几件事:

  • 函数定义行需要以冒号结尾。
  • 缩进很重要。
  • 你几乎从不想使用'is'。
  • 您可以检查对象是否在列表中,而无需使用“in”运算符显式循环它。
  • 如果你没有找到你要找的东西,你可能应该返回 False;大多数情况下你会侥幸逃脱,因为如果你没有明确返回,一个函数会返回 None ,并且 None 不是“真实的”。

所以试试:

def operator(input):
    operatorlist = ['+', '-', '*', '/', '^', 'sin', 'cos']

    if input in operatorList:
        return True

    return False

或者更简洁:

def operator(input):
    operatorlist = ['+', '-', '*', '/', '^', 'sin', 'cos']
    return input in operatorList
于 2012-04-14T00:39:15.787 回答
2

使用in运算符:

return (input in operatorlist)

(括号不是必需的,我已经将它们包括在内以使其更清楚。)

您可能需要通过教程书籍来开始使用 Python。

于 2012-04-14T00:40:56.410 回答
2

for i in operatorlist不会遍历 operatorlist 的索引,而是遍历实际元素。所以i'+'在第一个循环中,'-'在第二个循环中,依此类推。

所以这if input is operatorlist[i]应该是这样的if input is i

最后,实际上这整个函数都可以用逻辑运算来代替input in operatorlist。因此,您可以执行以下操作:

def operator(input):
    return input in ('+', '-', '*', '/', '^', 'sin', 'cos')
于 2012-04-14T00:42:27.983 回答
1
def operator(x):
    return x in {'+', '-', '*', '/', '^', 'sin', 'cos'}

不过,您可能希望避免为每个函数调用创建一个新集合,在这种情况下,您可以...

def operator_check(*operators):
    operators = set(operators)
    def checker(x):
        return x in operators
    return checker

math_operator = operator_check('+', '/', '*', '^', '-')

if math_operator('+'):
    print "it's a math operator!"
于 2012-04-14T02:09:13.953 回答
0

更改for i in operatorlistfor i in range(len(operatorlist))

当您只要求 时i in operatorlist,每次迭代i实际上将是该条目的元素,而不是索引。或者,您可以重新格式化循环的主体以反映它i是包含相关运算符的实际字符串,而不是索引。

于 2012-04-14T00:39:12.153 回答