反驳下Pythoner说的简单
之前很多人都说Python用起来简单,我的第一感觉就是胡扯,现在我稍微学了一点,更加坚信了那是胡扯。
当然Python在很小很小的项目里面可能是简单,例如Python写一个HelloWorld,其只要一句print "HelloWorld"就行了,而在C#里面,由于语法限制,其需要一个命名空间、一个类、一个Main函数和一句Console.WriteLine("HelloWorld");才能完成一个控制台输出HelloWorld的程序,但是倘若我们去完成一个稍微大一点的项目,那就不一定了。
例如我们要完成读取Excel中一张名为XXX表中的数据,在双方都不使用第三方框架的情况下,同时C#不使用ADO.NET技术,那么双方实现读取Excel的困难程度应该是差不多的,但是如果允许使用第三方类库(备注:1、使用免费的第三方类库,因为C#有个收费类库读取Excel只需要一两行代码就能完成;2、C#不使用ADO.NET技术),那双方的代码量应该是差不多的。
因此说Python用起来简单,那是无稽之谈,真正使开发变得简单的是第三方类库,而对于Python、C#(除了.Net Core外)来说,其第三方类库都是充足的,因此其开发应该都是差不多的。
Python与C#之间的不同点
1、程序的运行生命周期可以分为编译时、链接时、加载时、运行时,这4个阶段。在Python中,这4个阶段是一体的,而在C#中却是严格分离的,在C#要想跨阶段执行则就需要用到反射。这就造成了两者之间具有很大的不同。备注:不讨论C#中dynamic这样的动态类型。
例如依赖注入,在静态语言中依赖注入的价值体现在其通过IoC把对象对接口及实现的依赖反转为对DI容器的依赖,通过在DI容器中注入,从而获得对象的实现,即其将对象的索取从编译时、加载时转移到了运行时。而对于像Python这样的动态语言,由于其各个阶段是一体的,从而使得其本身的运行环境就好比是一个DI容器。
2、由于1的原因,Python可以实现类型之间的快速切换,而C#却需要通过相应的类型转换才能实现。备注:无视C#隐式类型转换
例如int和long之间的切换
num=2147483647
num=num+1
Python:2147483647是int的上限值,当其+1后,这个num变量会自动转变为long类型
int num=2147483647;
num=num+1;
而如果C#写成这样,其程序在运行到num=num+1;时,便会出错
int num=2147483647;
long numLong=(long)num+1;
我们只有先将num转化为long类型,然后+1,并赋值给新的对象,这样我们才能获得正确的值2147483648。
3、同样由于1的原因,Python无法做静态类型检查,而C#却会进行静态类型检查。
这使得C#在编译时就能发现相应的类型错误,而Python却只能在程序运行时才能发现。
对于Python的这一点,其就好像是一把双刃剑,虽然这免去了类型约束,便于写代码,但是这也使得代码变得更难维护。这也是“动态类型一时爽,代码重构火葬场”的由来。
4、Python没有访问修饰符,而C#有public、private、internal、protected、protected internal等的访问修饰符。
访问修饰符可以起到对相关内容访问的控制作用。但是Python却没有,有人说__是私有什么的,那其实是伪私有,换个写法就又能进行访问了,因此Python中相关内容的访问全靠编程者的自觉,同时编程者也必需知道哪些内容可以访问,哪些内容不可访问。
5、Python没有interface,其只能类继承,同时其还支持多继承,而C#只能单继承,一个类只能继承一个类,当然C#为了弥补单继承的不足,还带来了interface,一个类可以继承多个interface。
有关Python的抽象类多继承和C#的interface多继承,这2者之间的区别就不多说了,区别还是比较大的。
Python的多继承会增加代码的复杂度,再加上Python没有访问修饰符,这也就变相要求了编程者的能力,尤其是当项目越来越大,需求越来越多,业务越来越复杂的时候。
6、Python没有泛型,或者说不需要泛型,而C#却有泛型。
对于这一点没什么好说的,Python不需要泛型的理由就是之前提到的1、2这两点,即由于其所有变量签名都是动态的,因此对于Python来说,其不需要泛型。
总结:
1、Python是一门非常灵活的动态语言及动态类型语言。Python为了其灵活性,抛弃了很多东西,因此我认为这灵活性就相当于一把双刃剑,真正要想掌控好这门语言还是挺难的。
2、除了上面说的不同点外,其实Python和C#之间还有很多其他的不同点,具体的不说了,在这儿我想说的是他们两者的编程思维也因此发生很大的不同。所以如果你目前只会动态语言,那就去学一门静态语言看看吧;如果你目前只会静态语言,那就去学一门动态语言看看吧,只有动静结合方能大成/滑稽