这是在处理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方法.
提前致谢!
在我正在处理的一些数据中,我遇到了 类型的数据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
例如:
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 all()函数来帮助我计算某些东西,但是如果all()它没有在它命中时就进行评估,那么这个东西可能会花费更长的时间False.我想它可能是短路评估,但我只是想确定.另外,有没有办法告诉Python如何评估函数?
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,也会在此代码中打印。
为什么PyCharm彰显boolean附近的变量return用 Local 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)