在js
(f1() || f2())
Run Code Online (Sandbox Code Playgroud)
将不执行f2,如果f1回报率true通常是除了当它是不是一件好事.有||没有短路的版本?
就像是
var or = function(f, g){var a = f(); var b = g(); return a||b;}
Run Code Online (Sandbox Code Playgroud) 一时兴起,我最近测试了这两种方法timeit,看看哪种评估方法更快:
import timeit
"""Test method returns True if either argument is falsey, else False."""
def and_chk((a, b)):
if not (a and b):
return True
return False
def not_or_chk((a, b)):
if not a or not b:
return True
return False
Run Code Online (Sandbox Code Playgroud)
......并得到了这些结果:
VALUES FOR a,b -> 0,0 0,1 1,0 1,1
method
and_chk(a,b) 0.95559 0.98646 0.95138 0.98788
not_or_chk(a,b) 0.96804 1.07323 0.96015 1.05874
...seconds per 1,111,111 cycles.
Run Code Online (Sandbox Code Playgroud)
效率的差异在1%到9%之间,总是有利于if not (a and b),这与我的预期相反,因为我理解if not a or not b它将按顺序评估其术语(if …
python if-statement micro-optimization logical-operators python-2.7
在C 中<<=和是什么意思|=?
我认识到<<是bithift等,但我不知道这些是什么组合.
为什么不subset()兼容&&两个条件的逻辑和运算符?
> subset(tt, (customer_id==177 && visit_date=="2010-08-26"))
<0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)
但它们各自独立工作:
> subset(tt, customer_id==177)
> subset(tt, visit_date=="2010-08-26")
Run Code Online (Sandbox Code Playgroud)
(想避免使用大型临时变量 - 我的数据集很大)
这是在处理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方法.
提前致谢!
我阅读了以下Stack Overflow问题,我理解了bitwise和logical之间的区别.
但是,没有一个解释我何时应该使用按位或逻辑.
什么时候应该使用按位运算符而不是逻辑运算符,反之亦然?
在哪种情况下我需要逐位比较?
我不是在问这些差异,但是当你需要使用按位运算符时我会问这种情况.
鉴于以下向量,
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
我需要识别其元素> = 4的"a"的索引,如下所示:
idx = [3, 4, 5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)
"idx"中的信息将用于删除另一个列表X中的元素(X具有与"a"相同数量的元素):
del X[idx] #idx is used to delete these elements in X. But so far isn't working.
Run Code Online (Sandbox Code Playgroud)
我听说numpy可能会有所帮助.有任何想法吗?谢谢!
我正在学习C#并且一直在搞乱Pex for fun网站.该站点向您提出重新实施秘密算法的挑战,方法是在站点中键入代码并检查输入和输出在您的实现和秘密实现之间的差异.
无论如何,我被困在一个名为XAndY的基本代码决斗上.
从名称来看,答案显而易见:
public static bool Puzzle(bool x, bool y)
{
return x && y;
}
Run Code Online (Sandbox Code Playgroud)
但是,这是不正确的,Pex告诉我,以下输入产生的结果与秘密实现不同:
输入:
x:true y:true(0x02)
输出:
我的实现:true(0x02)
秘密实施:假
不匹配你的拼图方法产生了错误的结果.
代码:Puzzle(true,PexSafeHelpers.ByteToBoolean((byte)2));
在尝试比较不同类型的true之后出现了很多困惑之后,我意识到Pex正在寻找的实现实际上只是使用了按位AND:
return x & y;
Run Code Online (Sandbox Code Playgroud)
我认为,出于语义和短路的原因,您应该使用逻辑&&来比较布尔值,但无论如何:
x & y并且对于所有可能的bool参数x && y最终没有相同的输出?(或者它可能是Pex中的一些东西吗?)trueC#中不同的bool值?如果是这样,怎么样?这里的每个人都应该知道'或'状态,通常粘在die()命令上:
$foo = bar() or die('Error: bar function return false.');
Run Code Online (Sandbox Code Playgroud)
大多数时候我们看到类似的东西:
mysql_query('SELECT ...') or die('Error in during the query');
Run Code Online (Sandbox Code Playgroud)
但是,我无法理解'或'语句究竟是如何工作的.
我想抛出一个新的异常而不是die(),但是:
try{
$foo = bar() or throw new Exception('We have a problem here');
Run Code Online (Sandbox Code Playgroud)
不起作用,也不起作用
$foo = bar() or function(){ throw new Exception('We have a problem here'); }
Run Code Online (Sandbox Code Playgroud)
我发现这样做的唯一方法是这个可怕的想法:
function ThrowMe($mess, $code){
throw new Exception($mess, $code);
}
try{
$foo = bar() or ThrowMe('We have a problem in here', 666);
}catch(Exception $e){
echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)
但是有一种方法可以在'或'语句之后直接抛出新的异常吗?
或者这种结构是强制性的(我完全不依赖于ThrowMe功能):
try{
$foo = bar();
if(!$foo){ …Run Code Online (Sandbox Code Playgroud) 例如,当我7>1用C语言写入时(如果这不是一直是特征,则说是C99),我可以期望结果恰好是1还是只有一些非零值?这适用于所有bool运营商吗?