社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

谈谈我从C#到Python的学习之路

测试人-小小芝 • 4 年前 • 448 次点击  
一、缘由
  • 1
  • 1

最早听说Python是在今年1月底到北京一个厂商(做汽车驾驶模拟器的)那里看设备,听他们的CTO介绍模拟软件的脚本控制是用的Python,(当时我还把Python叫做“飞森”,而不是“派森” 囧)。第一次听说了这个语言,但也没太在意,因为导师一直跟我说用好一门语言就够了。从上大学到现在,先后用过C、Basic、C++以及ASP(一看就不是计算机专业的,我大学认识的几个计算机专业的同学,大多都是Pascal - Delphi - Java这条路线)。这几年主要在用C#,觉得C#还不错,又可以做本地程序,也可以做ASP.NET程序,所以也没想再学其他语言了。

寒假做了一个交通网络分析的计算程序,这个程序前期已经有一些基础了,核心算法用的是QuickGraph库。QuickGraph提供了经典图论里边的绝大部分算法,如最短路、最大流、遍历、支撑树等,不错的一个东西,但是没有复杂网络分析的算法。一开始我是利用QuickGraph的数据结构,然后自己写复杂网络分析算法。但是写的很累,正好也过年了,就暂时放下了这个工作。

过年的时候闲着没事,上网找是不是有直接提供复杂网络分析算法的库,还真找到了两个:igraph和networkx。(见http://igraph.sourceforge.net/和http://networkx.lanl.gov/),其中,igraph是用C写的,但提供了Python的接口;networkx就纯粹是用Python实现的一个库了。下载了它们的文档,发现正是我想要的东西:成熟的复杂网络分析算法,大量的示例程序。要想直接利用这两个库,肯定要学Python语言了。我想,反正各种语言都差不多,学就学吧。

二、语法
  • 1
  • 1

学语言肯定要先从基本语法学起。Python的语法的确很简单,因为有C#编程基础,学习起来没遇到什么困难。比起C#,Python少了花括号,完全靠缩进解决结构问题。一开始我不太习惯,特别是写函数定义、循环控制等语句时总丢后边的冒号。现在好多了,习惯会慢慢养成(现在变成写C#程序总加冒号,然后调试器就开始不停的问候我 囧)。另外Python没有switch,因为我做科学计算,涉及到条件控制比较多,一开始用ifelifelif……觉得很烦人,后来发现用dict就很方便,比switch还要简单优美。

说到dict呢,顺便说一下Python内置的list、tuple和dict类型。这个的确很方便,在C#里做同样的事情要引用Collections,而Python就简单的多了,对于做科学计算的确简化了许多工作。不过Python用类型不事先定义,一开始我还是不太习惯,总是int a,str b的,后来发现,这不就是C#里的generics嘛!是个好东西啊!而且Python的函数功能也很强大,有匿名函数、多返回值、列表内涵、关键字参数等等,极大的简化了编程工作。最早在STL、Boost及C#里看到这些特性的时候我还惊为天人,学了Python才知道这东西也没那么神秘——基本手段嘛。

此外,Python还有一个很nice的功能就是exec、execfile和eval。对我来说这个非常实用,因为做计算时总有些函数需要在运行时才导入,例如y =a +func(b),func()的形式事先不知道,运行时根据用户需要输入。以前用别的语言实现这个功能要费好大劲(用表达式解析器等),现在Python直接内置了它。换句话说,Python可以作为Python程序自己的脚本语言!Python实在也太强大了!正如那句Python社区中很有名的话所说的:“battery included”!要我说,Python不仅带了电池,充电器它TMD都带着呢!

三、库及跨平台
  • 1
  • 1

Python的第三方库很多,特别是计算这一块,Python比C#的库要丰富一些,而且用的人更多。我现在已经用了igraph和networkx(图论与复杂网络)、numpy和scipy(数值计算)以及matplotlib和cairo(图表和可视化),python(x,y)项目里还集成了更多的科学计算库。当然这和搞科学计算的老外大多用非windows平台有关,我接触的多数人都是用unix/linux平台(给人家发Email都不好意思带word附件),在这些平台下虽然有Mono支持C#,但用的人毕竟还少。C和Fortran的科学计算库倒是不少,不过多数都提供了Python的封装或Python写的替代品,所以就不需要自己重复造轮子了。我现在已经完全放弃了扩展那个QuickGraph的想法,因为我再作两年也赶不上igraph和networkx,而且关键是我做的东西还没人用 囧……

此外,Python可用的GUI库也很多:Tkinter,wxPython,PyQt,PyGTK,PyWin等等一大堆。除了PyWin,大多数GUI都是跨平台的。这点很好,再也不用担心MS卡脖子了(偶现在还是在用D版,以后限制严格了就到Linux下接着做这点事),自己的知识、技术可以一直积累延续,而不用从头开始。当然GUI库不可能都学都用,学好一个应该就够了。试了上面几个库后,我选择了PyQt4,原因是看到它Demo里做的东西比较漂亮,而且Qt的信号/插槽(signals/slots)机制也比回调(callback)机制好理解。此外,对初学者很重要的一点是,Qt的中文书比wxPython要多。注意不是PyQt,PyQt的中文书还是比较少的。wxPython我只找到了一本很厚的《wxPython In Action》。书是不错,不过我比较怕看厚书,因为时间总是有限的,最好都是In Nutshell之类的小册子,头天睡前翻一翻,第二天就可以写出想要的东西来。

四、Web开发
  • 1
  • 1

我学Python的主要目的是为了做一些数值计算的小程序,因为做网络分析总是要对大量的数据进行分析计算,Python简洁的语法和丰富的第三方库可以极大地提高我的工作效率。不过作研究只是为了兴趣,要养家糊口还是要做一些短平快的项目(惨!)。这两年做的比较多的就是与工程相结合的Web应用(因为我导师的方向是GIS与交通设计信息化)。以前一直是用ASP.Net在做,从1.0到2.0再到3.5,一路做下来对ASP.Net已经比较熟了。因为学Python,也特意关注了一下Python的Web开发功能。

现在看来似乎Django很热(这个我又不知道应该怎么念,不过恰好我有个朋友叫“邸建国”,所以我第一眼看到Django就念成这个音了 :)。
百度百科上介绍说“Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(Do Not Repeat Yourself)原则”。听上去不错,上网找到了Python高手
limodou的《Django Step by Step》教程,粗看了一下没有入门,暂时还是先用我的ASP.Net吧,因为我感觉目前ASP.Net可用的资源更多,对我来说更加DRY。以后有闲了再慢慢跟“邸建国”切磋。

五、体量和效率
  • 1
  • 1

因为做科学计算,我很重视语言及开发环境的“轻量级”。什么叫“轻量级”呢?对我来说就是在我256M内存的老本上能欢快地跑起来 囧……。我的烂机是单位淘汰的一台联想昭阳V80,CPU是P4 1.6的,让他跑.Net 3.5的确是难为他老人家了!所以在这台机器上我主要用Dev C++和SharpDevelop(Visual Studio在这台机器上启动都很困难)作数值计算的程序。我的另外一台本本是小黑X61,这个性能还可以,我用它上网、写论文、玩游戏等等(不过X61的显卡很弱,做OpenGL的程序时得到单位的工作站上,当然玩实况和FIFA也得去那个工作站上:)。因为大规模网络分析花的时间会比较长(几小时到几天),这些计算的脏活累活就扔给V80了。现在用Python,IDE我选了PythonWin和Spyder,感觉这两个IDE还比较轻量,很适合我的硬件环境。

Python的运行效率我感觉和C#差不多,因为都用了虚拟机,但Python比C/C++还是要差一截。我对比了igraph(C写的)和networkx(Python写的)两个库,生成同样规模的一个随机图,igraph比networkx运行时间少一个数量级(Drew Conway做的对比结果也类似,见这里)。换句话说,对于大规模的网络分析问题就是等几小时和等几天的区别了。不过还好,大多数老牌的科学计算库都是用C和Fortran写的,并且提供了Python接口,所以也不必太担心。我们可以把Python当作“胶水”[1]来用:对于效率要求很高的部分,就调用C/C++库或自己写C/C++的模块,这也是我选择Python语言的一个主要考虑。
希望都可以选择合适自己的语言,都可以学有所成。分享码字不易,希望看客们可以点赞收藏哦~或者也可以再评论下分享自己的语言学习之路哦。也可以加群和测试大佬们一起交流学习 点击链接加入群聊【Python自动化测试交流群】 想要python自动化学习资料的也可以加群免费领取哦(备注:csdn666方便快速审核)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/73757
 
448 次点击