頭の整理!
論理演算は、項が成立した時、その先の式は実行されない。Cとpythonは一緒!
パターン1: false && func2()
C言語でこう書くと、func2 は実行されない。左の項がfalseで確定したら右の項を計算する必要ないよね。ということで実際にfunc2は実行されない。
// C言語
int a=1;
int b=2;
int cnt=0;
bool func1(int a_) { cnt+= 1; if (a_==0) { return true; } else { return false; } }
bool func2(int b_) { cnt+=10; if (b_==0) { return true; } else { return false; } }
void func3(void) { printf("func3 : cnt=%d", cnt); }
void func4(void) { printf("func4 : cnt=%d", cnt); }
int main(void) {
if (func1(a) && func2(b)) {
func3();
}
else {
func4();
}
}
>> func4 : cnt=1
pythonでこう書くと、func2は実行されない。C言語と一緒^^
b=2
cnt=0
def func1(a_):
global cnt
cnt += 1
if a_==0:
return True
else:
return False
def func2(b_):
global cnt
cnt += 10
if b_==0:
return True
else:
return False
def func3(): print('func3 : cnt=%d' % cnt)
def func4(): print('func4 : cnt=%d' % cnt)
if func1(a) and func2(b):
func3()
else:
func4()
>> func4 : cnt=1
パターン2: true || func2()
C言語でこう書くと、func2 は実行されない。左の項がtrueで確定したら右の項を計算する必要ないよね。ということで実際にfunc2は実行されない。
int b=2;
int cnt=0;
bool func1(int a_) { cnt+= 1; if (a_==0) { return true; } else { return false; } }
bool func2(int b_) { cnt+=10; if (b_==0) { return true; } else { return false; } }
void func3(void) { printf("func3 : cnt=%d", cnt); }
void func4(void) { printf("func4 : cnt=%d", cnt); }
int main(void) {
if (func1(a) || func2(b)) {
func3();
}
else {
func4();
}
}
>> func3 : cnt=1
# python
a=0
b=2
cnt=0
def func1(a_):
global cnt
cnt += 1
if a_==0:
return True
else:
return False
def func2(b_):
global cnt
cnt += 10
if b_==0:
return True
else:
return False
def func3(): print('func3 : cnt=%d' % cnt)
def func4(): print('func4 : cnt=%d' % cnt)
if func1(a) or func2(b):
func3()
else:
func4()
>> func3 : cnt=1
パターン3: true && func2()
C言語でこう書くと、func2は実行される。左の項がtrueでも、右の項がtrueかfalseで結果が変わるよね。ということでfunc2は実行される。
int b=2;
int cnt=0;
bool func1(int a_) { cnt+= 1; if (a_==0) { return true; } else { return false; } }
bool func2(int b_) { cnt+=10; if (b_==0) { return true; } else { return false; } }
void func3(void) { printf("func3 : cnt=%d", cnt); }
void func4(void) { printf("func4 : cnt=%d", cnt); }
int main(void) {
if (func1(a) && func2(b)) {
func3();
}
else {
func4();
}
}
>> func4 : cnt=11
b=2
cnt=0
def func1(a_):
global cnt
cnt += 1
if a_==0:
return True
else:
return False
def func2(b_):
global cnt
cnt += 10
if b_==0:
return True
else:
return False
def func3(): print('func3 : cnt=%d' % cnt)
def func4(): print('func4 : cnt=%d' % cnt)
if func1(a) and func2(b):
func3()
else:
func4()
>> func4 : cnt=11
パターン4: false || func2()
C言語でこうかくと、func2は実行される。左の項がfalseでも、右の項がtrueかfalseで結果が変わるよね。ということでfunc2は実行される。
int b=2;
int cnt=0;
bool func1(int a_) { cnt+= 1; if (a_==0) { return true; } else { return false; } }
bool func2(int b_) { cnt+=10; if (b_==0) { return true; } else { return false; } }
void func3(void) { printf("func3 : cnt=%d", cnt); }
void func4(void) { printf("func4 : cnt=%d", cnt); }
int main(void) {
if (func1(a) || func2(b)) {
func3();
}
else {
func4();
}
}
>> func4 : cnt=11
# python
a=1
b=2
cnt=0
def func1(a_):
global cnt
cnt += 1
if a_==0:
return True
else:
return False
def func2(b_):
global cnt
cnt += 10
if b_==0:
return True
else:
return False
def func3(): print('func3 : cnt=%d' % cnt)
def func4(): print('func4 : cnt=%d' % cnt)
if func1(a) or func2(b):
func3()
else:
func4()
>> func4 : cnt=11
可読性はもちろん欠いちゃダメだけど、「項が確定した時」という仕組みを利用して
func1 に軽い処理 (例えば0.001秒)
func2 に重い処理 (例えば5秒)
を書いておくと良いと思う。func2を先に持ってきてしまうと、毎回func2に5秒取られるような結果になってしまう。気をつけよう。逆を言うと、func2の位置に、時間が取られる処理を配置することで、演算時間を考慮したりできると思う。