细数Python与C++的区别(更新中……)

来源:互联网 发布:java的反射如何实现 编辑:程序博客网 时间:2024/05/18 07:34

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>>> ++i3>>> i++SyntaxError: invalid syntax

Python函数永远有返回值

C/C++中一个常见错误:"Not all control paths return a value"。如果有任何一条路径没有返回值,会报错。

// Error: not all control paths returnsint 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 foundif (i == 10)..

而由于Python有着不同的循环方式,导致循环变量的最后值是range范围内的最大有效值9,而非10。

for i in range(10):    if found:        breakelse:    # Not found    ..print (i) # 9

更新中……

1 0