如何在Python中与* args一起使用any()函数

时间:2019-02-19 09:26:12

标签: python-3.x

我正在尝试掌握python中的any()和all()函数。
我正在尝试编写代码来检查用户是否输入了任何非数字值。

def my_sum(*args):
    #args=[]
    if any([(type(arg)==int or type(arg)==float) for arg in args]):
        total=0
        for num in args:
            total+=(num)
        return total
    else:
        return "Please enter numerals only"
print (my_sum(1,45,87,36))
print (my_sum(1,25,45,75.85,"Newton","Pythagoras"))



我希望第一次调用将打印出所有数字的总和,而第二次调用函数以打印出消息。但是我收到了不支持的操作数类型的类型错误消息。

3 个答案:

答案 0 :(得分:0)

当至少一个元素为True时,

any()将返回True。这两个测试用例都是这种情况-您将永远不会执行else部分。 all()仅在所有元素均为True时才返回True。因此,在这种情况下,这就是您想要的-使用all(),而不是any()

请注意,如PEP8中所建议,要测试类型,最好使用isinstance(),而不是type(),例如isinstance(x, (int, float))

最后,使用try / except来捕获错误并处理错误,而不是进行类型检查,被认为是更pythonic。

答案 1 :(得分:0)

您应该将条件更改为以下之一:

<script type="text/javascript"> document.getElementsClassName('switch').addEventListener("change",function(){ if (this.checked) window.open("PDFS/CSS.pdf"); }); </script> <style> .switch { position: relative; display: inline-block; width: 60px; height: 34px; } .switch input {display:none;} .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; } .slider:before { position: absolute; content: ""; height: 26px; width: 26px; left: 4px; bottom: 4px; background-color: white; -webkit-transition: .4s; transition: .4s; } input:checked + .slider { background-color: #2196F3; } input:focus + .slider { box-shadow: 0 0 1px #2196F3; } input:checked + .slider:before { -webkit-transform: translateX(26px); -ms-transform: translateX(26px); transform: translateX(26px); } </style> <h2>Toggle Switch</h2> <label class="switch"> <input type="checkbox"/> <div class="slider"></div> </label>

# This is checking if all input in list are floats or ints if all([(type(arg)==int or type(arg)==float) for arg in args]):

答案 2 :(得分:0)

如果您坚持使用 any(),并且不更改 if 语句的顺序,那么最好检查一下 str 类型,并使用

def my_sum(*args):
    # if none of the args are str, then sum them up
    if not any([type(arg)==str for arg in args]):
        total=0
        for num in args:
            total+=num
        return total
     # otherwise return the message
    else:
        return "Please enter numerals only"
print (my_sum(1,45,87,36))
print (my_sum(1,25,45,75.85,"Newton","Pythagoras"))

但是,摆脱 not 而不是更改 if else 语句的顺序似乎更合乎逻辑:

def my_sum(*args):
    # if any of the args are string, then return the message
    if any([type(arg)==str for arg in args]):
        return "Please enter numerals only"
    # otherwise sum them up
    else:
        total = 0
        for num in args:
            total += num
        return total
print (my_sum(1,45,87,36))
print (my_sum(1,25,45,75.85,"Newton","Pythagoras"))