前段时间开始学Python,到现在正好一个星期了,谈谈我的学习体会。

一、学习缘起

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

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

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

二、语法

学语言肯定要先从基本语法学起。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都带着呢!

三、库及跨平台

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开发

我学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。以后有闲了再慢慢跟“邸建国”切磋。

五、体量和效率

因为做科学计算,我很重视语言及开发环境的“轻量级”。什么叫“轻量级”呢?对我来说就是在我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运行时间少一个数量级。换句话说,对于大规模的网络分析问题就是等几小时和等几天的区别了。不过还好,大多数老牌的科学计算库都是用C和Fortran写的,并且提供了Python接口,所以也不必太担心。我们可以把Python当作“胶水”[1]来用:对于效率要求很高的部分,就调用C/C++库或自己写C/C++的模块,这也是我选择Python语言的一个主要考虑。

注1

六、总结

作为一个刚从C#转到Python的FreshMan,一周来的总体感觉就是:Python的确易学、易用、强大。像我这样的非计算机专业毕业、非程序员工作的人,一星期就已经入门Python,并且能用它写出自己“用着方便、看着舒服”的程序。很符合我学Python的预期:提高自己的工作效率;也印证了Bruce Eckel的观点:“Python可能是唯一一种旨在帮助程序员把事情弄得更加简单的语言”

从C#到Python——谈谈我学习Python一周来的体会相关推荐

  1. c# python_从C#到Python —— 谈谈我学习Python一周来的体会

    从大年初二开始学习Python,到现在正好一个星期了,谈谈我的学习体会. 一.学习缘起 最早听说Python是在今年1月底到北京一个厂商(做汽车驾驶模拟器的)那里看设备,听他们的CTO介绍模拟软件的脚 ...

  2. 为什么学习Python?选择学习Python的10个理由

    前言 为什么学习Python?选择学习Python的10个理由 Python提供了许多有用的功能特性,这些功能使其相比其他编程语言更流行也更易于学习.它支持面向对象的编程,也支持面向过程编程:我们在下 ...

  3. python自学时间-学习Python、Python时间操作有哪些?

    一.背景知识介绍: 1.时间是人类规定的产物,与长度单位是一个道理,米这个单位也是人类发明的.简单说就是地球自转1圈为1天,地球饶太阳公转1圈为1年,而且根据公转自转度量时间都是不可靠的(因为非匀速无 ...

  4. python工作招聘-学习Python 能找到工作?1300+条招聘信息告诉你答案

    对于python这块有任何不懂的问题可以随时来问我,我对于学习方法,系统学习规划,还有学习效率这些知道一些,希望可以帮助大家少走弯路.当然也会送给大家一份系统性的python资料,文末附有爬虫项目实战 ...

  5. python自学步骤-学习Python最正确的步骤(0基础必备)

    首先,学习Python编程技术,自学或者参加培训学习都适用,每个人都有自己的学习方式和方法. 一:明确自己的学习目标. 不管我们学习什么样的知识,都要对自己的学习目标有一个明确的认识.只有这样才能朝着 ...

  6. python基础单词-学习Python必背的初级单词有哪些?

    今天小编要跟大家分享一些学习Python必须认识的英文单词,同时也是学习编程都必须会的单词,下面来和小编一起学习一下吧! application 应用程式 应用.应用程序 application fr ...

  7. python主要用途-学习Python的三大主要用途

    如果你想学Python,或者你刚开始学习Python,那么你可能会问:"我能用Python做什么?"这个问题不好回答,因为Python用途太多了,以至于小编不知道如何回答,但是我可 ...

  8. 自学python转行-转行学习python 需要多久?应该如何学习?

    给大家说下Python的方向: 1. 首先就是需求岗位最多的web方向,其实Python web的岗位并不是很多,但随着Python语言不断的发展,Python web的岗位也在不断的增加.所以选择w ...

  9. 学python好不好-学习python的前景怎么样?

    Python是一种计算机程序设计语言,可应用于网页开发和软件开发等方面.Python优雅.明确.简单,入门时间按天计算.免费开源.速度快.可移植性,在各领域应用广泛.那么.Python的火爆只是因为这 ...

最新文章

  1. android 分组 listview,Android实现的ListView分组布局改进示例
  2. 计算机视觉:让冰冷的机器看懂这个多彩的世界
  3. 基本语法及基本概念概述(标识符、访问修饰符、变量、数组、枚举、注释、空行、继承、接口、(对象、类、方法、实例变量)、关键字表)
  4. 里bl2和bl3为什么分开_分手挽回:为什么不建议过早同居
  5. Java学习笔记53(网络编程:TCP协议案例)
  6. 更新json文件_忽略packagelock.json?
  7. JS中获取元素的第二种方法
  8. 中小企业网络安全提升
  9. 关Jquery判断input type=checkbox元素是否被选中的判断
  10. photoshop cs6 安装过程 0920
  11. 解决vue+axios post参数后端无法接收的问题
  12. [文章备份]RSS阅读器在手机上APP配置方法
  13. Select2的使用 联动筛选框的一个例子
  14. Apache Spark Jobs 性能调优(一)
  15. 6004.ubuntu18.04移植qgroundcontrol地面站
  16. 编码的奥秘:自动操作
  17. 后勤管理系统-在线报修系统
  18. css去掉原生input框的border属性
  19. windows7 系统中,IE打开网页窗口提示网页上有错误“无法打开匿名级安全令牌”解决方法
  20. 恕我直言,Java四大名著并不一定适合你!

热门文章

  1. java调用银海社保接口_[开源] C# 封装 银海医保的接口
  2. [Kerberos] Kerberos教程(一)
  3. 2022年艺术品和古董投资策略研究报告
  4. idenet 学习记录:bili
  5. 蚂蚁金服ATEC技术峰会:共探技术开放新生态
  6. 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Standard NLP tasks with specific vocabulary
  7. 剑灵力士卡刀ahk_[游戏]剑灵剑士火系卡刀
  8. Fabric v2.2源码分析 Raft共识与排序(三)
  9. mysql locate用法_MySQL locate函数和substring函数使用
  10. 我的四轴飞行器经验总结(二)-无人机应用场景