Python与C/C++有不少区别,其中一些很容易疏忽,导致程序出错。这里列了一些,供大家参考。持续更新中……
Python没有自增自减运算符
C/C++中有++i、i++、--i、i--。而Python则没有这些运算符。C/C++的一个常见循环是:
for (int i = 0; i < 10; ++i)
{
std::cout << i << endl;
}
而Python对应的循环为:
for i in range(10):
print (i)
也许这是Python不提供自增自减运算符的一个重要原因:没有这么常见的use case。如果真的需要,大多数情况下可以用i += 1,i -= 1来代替。
注意,虽然Python不支持++运算符,但++i并不会报错。++i被解释为+(+(i))。
>>>> i = 3
>>> ++i
3
>>> i++
SyntaxError: invalid syntax
Python函数永远有返回值
C/C++中一个常见错误:"Not all control paths return a value"。如果有任何一条路径没有返回值,会报错。
// Error: not all control paths returns
int f(bool flag)
{
if (flag)
{
return 1;
}
}
但对应的Python程序没有任何问题:
def f(flag):
if flag:
return 1
>>> print (f(True))
>>> 1
>>> print (f(False))
>>> None
虽然Python不会报错,但还是建议在函数有返回值的情况下显式return None。这样,其他人看到这段代码时不会困惑:作者的本意到底是要依赖隐式的return来返回None呢,还是忘 了return一个值?
作用域
C/C++中for loop循环变量的作用域仅限于for及对应的{}本身,for结束后该作用域消失。
for (int i = 0; i < 10; ++i)
{
..
}
// v--- undeclared variable "i"
if (i == 10)
..
Python中,for语句(以及while、if等)没有自己单独的作用域。循环变量i的作用域就是包含它的函数f的作用域。
def f():
for i in range(10):
..
// Ok!
if i == 10:
..
再看一个例子。a的作用域是包含它的{},出了右括号,作用域消失。这是个显而易见的错误。
if (condition)
{
int a = 1;
}
// Error!
std::cout << a;
而Python作为一种动态语言,完全支持这样的使用。事实上,一个名字只要在使用前赋过值,就可以使用。
if condition:
a = 1
// Ok!
print (a)
for循环的最后一个值
经常会遇到这样的情况,一个循环结束后需要看一下它是如何结束的。一个方法是看看循环变量i的最后值是多少。如果等于10,表明条件found没有发生过。可以这样做是因为C++在每次循环结束后会++i,即使是最后一次循环。
int i;
for (i = 0; i < 10; ++i)
{
..
if (found)
break
}
// Not found
if (i == 10)
..
而由于Python有着不同的循环方式,导致循环变量的最后值是range范围内的最大有效值9,而非10。
for i in range(10):
if found:
break
else:
# Not found
..
print (i) # 9
更新中……