相关疑难解决方法(0)

Python:避免短路评估

这是在处理Django项目时遇到的问题.这是关于表单验证.

在Django中,当您有一个提交的表单时,您可以调用is_valid()相应的表单对象来触发验证并返回一个布尔值.所以,通常你在视图函数中有这样的代码:

if form.is_valid():
    # code to save the form data
Run Code Online (Sandbox Code Playgroud)

is_valid() 不仅验证表单数据,还将错误消息添加到表单对象,然后可以向用户显示.

在一个页面上,我一起使用两个表单,并且只有在两个表单都包含有效数据时才希望保存数据.这意味着我必须在执行代码保存数据之前在两个表单上调用is_valid().最明显的方式:

if form1.is_valid() and form2.is_valid():
    # ...
Run Code Online (Sandbox Code Playgroud)

由于逻辑运算符的短路评估,将无法工作.如果form1无效,则不会评估form2,并且将丢失其错误消息.

这只是一个例子.据我所知,没有贪婪替代and/ or在其他语言(如Smalltalk的).我可以想象在不同情况下(而不仅仅是在Python中)发生的问题.我能想到的解决方案都是笨拙的(嵌套ifs,将返回值赋给局部变量并在if语句中使用它们).我想知道解决这类问题的pythonic方法.

提前致谢!

python logical-operators

21
推荐指数
2
解决办法
4958
查看次数

如何在Python中检查float('nan')?

在我正在处理的一些数据中,我遇到了 类型的数据float,其中填充了“nan”,即float('nan')

然而,检查它并没有按预期工作:

float('nan') == float('nan')
>> False
Run Code Online (Sandbox Code Playgroud)

您可以使用 检查它math.isnan,但由于我的数据还包含字符串(例如:'nan',但也包含其他用户输入),所以不太方便:

import math
math.isnan(float('nan'))
>> True
math.isnan('nan')
>> TypeError: must be real number, not str
Run Code Online (Sandbox Code Playgroud)

在理想的情况下,我想检查一个值是否在所有可能的 NaN 值的列表中,例如:

import numpy as np
if x in ['nan', np.nan, ... ]:
    # Do something
    pass
Run Code Online (Sandbox Code Playgroud)

现在的问题是: 我怎样才能仍然使用这种方法,同时检查float('nan')值?以及为什么等于float('nan') == float('nan') False

python numpy

15
推荐指数
1
解决办法
3万
查看次数

python布尔表达式不是"短路"?

例如:

def foo():
    print 'foo'
    return 1
if any([f() for f in [foo]*3]):
   print 'bar'
Run Code Online (Sandbox Code Playgroud)

我认为上面的代码应该输出:

foo
bar
Run Code Online (Sandbox Code Playgroud)

代替 :

foo
foo
foo
bar
Run Code Online (Sandbox Code Playgroud)

为什么?我怎样才能产生"短路"效应?

python short-circuiting

10
推荐指数
2
解决办法
2199
查看次数

所有(列表)都使用短路评估吗?

我希望使用Python all()函数来帮助我计算某些东西,但是如果all()它没有在它命中时就进行评估,那么这个东西可能会花费更长的时间False.我想它可能是短路评估,但我只是想确定.另外,有没有办法告诉Python如何评估函数?

python evaluation short-circuiting

6
推荐指数
2
解决办法
1687
查看次数

为什么“any”和“all”在这里似乎没有使用短路求值?

all()在序列中找到 False 后是否立即返回 False?
尝试运行这段代码:

def return_true():
    print('I have just been printed')
    return True

print(all((False, return_true())))
Run Code Online (Sandbox Code Playgroud)

如您所见,I have just been printed即使前面有 False,也会打印出来。

另一个例子:

def return_false():
    print('I have just been printed')
    return False

print(any((True, return_false())))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,I have just been printed即使之前有 True,也会在此代码中打印。

python

5
推荐指数
1
解决办法
103
查看次数

可能会引用PyCharm警告局部变量

为什么PyCharm彰显boolean附近的变量returnLocal variable "boolean" might be referenced before assignment

此代码检查数字是否为素数:

import random
import math
import time
def prime_t(x):
    print x
    if x < 2:
        return False
    if x == 2:
        return True
    if x == 3:
        return True
    for i in range(2, int(math.sqrt(x))+1):
        if x % i == 0:
            boolean = False
            break
        else:
            boolean = True
    return boolean
random.seed()
how_much = input()
start = time.time()
for i in range(0, how_much):
    print(prime_t(random.randint(0, 1000)))
print time.time()-start …
Run Code Online (Sandbox Code Playgroud)

python variables function local pycharm

4
推荐指数
2
解决办法
2820
查看次数