从C++到Python入门

最近在重新学习 MFC ,看到几篇文章关于 C C++ 及程序员该学什么的争论,很多人提到了 Python, 不管到底各语言孰优孰劣,有人提出来的 Python 的易用性及与 C++ 的相容性的确吸引了我,并且我看到有人提出作为一个优秀的 C++ 程序员至少也应该掌握一门脚本语言来做一些杂事或做 GUI ,推荐的就是 Python ,所以我决定试试学下 Python ,这几天看下来还是有点想法的, Python 用了太多 C++ 中不敢想象的特性,使很多事简单化了,虽然很多是以性能损失作为待价的,但是性能在今天除了 C++ 程序员还有谁关心呢 ? 突然想到一次我需要去除一些文本中的所有标点,我编了个 C++ 程序来完成,因为用了 MFC 来完成界面,最后搞的很复杂,完成后才想起,其实只需要用 Word 的宏就足够了。很多时候只要能完成任务就足够了,不是吗?那么多事情,并不是每一个都需要注重效率的。当然,说了这么多,我不是说我今天就要放弃学了那多久的 C++ C++ 是深入我骨髓,我血液的,只是想以后对付简单事情时又多一个方便的处理方式,不亦快哉。
      很多 Python 教程都是铺述概念,实例少,练习更少,实在比不上同类的 C++ 教材,学 C++ 的过程告诉我,学编程就是去编,而不要去看,我决定将自己的学习方式调整一下,并写下来,主要谈及从 C++ Python 有什么需要注意的改变,以 C++ Primer 中文第4版和 The C Programming Language 中文第2版*新版为脉络,并尽可能多以 Python 完成每一章中的例题和后面的习题,对我来说顺面复习一下 C/C++ 和很少用的五笔也好。注意,我主要就是讲例子,习题,以及 Python C/C++ 的不同。当然,不要以为我就是对的,我刚学 Python
      本人假设你已经掌握了 C++ ,并像我一样决定多学习一门语言 Python ,确定你已经安装好了 Python, 这里本人用的是 ActiveState ActivePython 2.5 。可以开始了!
Hello World

任何语言学习的必修课,在C中是这样的:

#include <stdio.h>

 

main()

{

      printf("hello, world/n");

}

 

到了C++中推荐这样:

#include <iostream>

 

int main()

{

      std::cout<<"Hello, world!"<<std::endl;

      return 0;

}

 

Python中,是这样

2.0

print "Hello, World!/n"

 

 

仅有一句,没有main,也没有括号,print就是Python的输出函数,此程序运行方式有两种,一种是即时的交互模式,一种是脚本方式。需要说明的是,Python是一种脚本语言,所以运行不需要编译。这点的确还是比较方便的。我以前接触过的脚本语言matlabPython倒有些类似。交互方式下,直接输入就可以了。脚本方式你可以用任何你喜欢的文本编辑工具输入以上文字,保存为后缀py的文件,并在Python中打开并Run就好了。以下例子均为在脚本方式调试,你可以尝试在交互模式输入,注意缩进。在Python中,很多语法是通过缩进来控制的,不可思议,但对于减少输入的确效果明显。也就是说Python里面空格可能是有意义的!这样不仅大量减少了括号,还省略了C++中每行必须的分号。

 

首先看The C Programming Language中第4面例子的Python版: 

 

2.1

lower = 0;      #温度表的下限

upper = 300;   #温度表的上限

step = 20;  #步长

fahr = lower;

while fahr <= upper:

    celsius = 5 * (fahr-32) /9

    print "%d/t%d/n" % (fahr,celsius)

    fahr += step

 

1Python使用自定义变量前不用声明,这是因为Python是动态语言,使得Python方便了很多,当然,不谈效率,这很好。

2Python 也有while语句,不过也不要括号,以“:”冒号开始,按缩进标识,下面都是循环内容。你可以尝试去改变缩进,看看效果。

3print语句也接收一个字符串,并与C语言格式类似,不过,中间以%分格,如此形式:print “%x %x” % (x,x)%后字符与C语言一样,不过都可以用%s,因为,Python会自动转化为字符串。

另外,Python的注释符是#,相当于C++中的//。不过多解释了。

以上程序输出一个华氏温度与摄氏温度对照表。学过C语言应该能看懂吧。有一点需要习惯的是,python对浮点数到整数的转换为四舍五入,

而不是C/C++中的截断。对此一下。

 

2.2

lower = 0.0;    #温度表的下限

upper = 300.0; #温度表的上限

step = 20;  #步长

fahr = lower;

while fahr <= upper:

    celsius = 5 * (fahr-32) /9

    print "% 5.1f /t% 5.1f /n" % (fahr,celsius)

    fahr += step

 

如上方式,就可以浮点方式输出。和C/C++类似。

 

另外,在Python中似乎没有符号常量,Dive Into Python这一点满足 Python核心原则之一:坏的行为应该被克服而不是被取缔。这似乎有点像C++中很多特性的原则:要相信程序员永远不会犯错误。但其实又有那么多特性就是为了减少程序员的错误而设计的,还有很多特性就是为了尽量在程序员犯错误时能更早(在编译时)发现错误而设计的。这一点我一直觉得很矛盾,而事实上,那些相信程序员的特性往往成为C++程序错误百出,被人垢病之处。我宁愿有个语言设计原则是永远不要相信程序员。

 

说完了输出,接下来看看输入:

 

2.3

x = raw_input("Please enter a integer")

print x+x

 

Python中,输入可以像上面这样,用raw_input命令。并且可以以一个字符串为参数做为提示语,Python将为你打开一个对话框来接收输入。输入一个整数调试一下,你算到结果了吗?因为Python不知道你输入的类型,所以都保存为字符串。要改变类型,可以像C++一样函数似强制转换。应该来说,如int,float等在Python中就是一个转换类型的函数而已,因为它们不用来指定类型啊。如下例所示可得想要的结果:

 

2.4

x = int(raw_input("Please enter: "))

print x+x

 

另外,这里有个很愉快的地方,你可以尝试输入一个超大的数字试试,就知道我在说什么了。Python会为你自动指定一个无限大的整数,天哪,我一直在尝试用C++实现一个无限长整数,你能想象要提供足够多的可用操作并效率高有多难吗?远远超出了我的数学水平!而标准C++中只能处理232次方这么小的数,用做数学运算仅够尾数。

 

Python也支持if条件判断语句。如下:

 

2.5

x = raw_input("Please enter: ")

if x:

    x = int(x)

    print x+x

else:

    print "No input"

 

这样,当没有输入的时候,会提示No input,在例2.4中,这种情况会因为用int转换空的x而引发异常。格式上与while语句类似。

Python中,条件判断也是用“==,赋值用“=”,不过条件判断时不可以赋值,这样的确少了一些错误,但很明显,如C语言中while(*d++=*s++)类似语句是不能写出来了。哦,我忘了,Python中就根本没有++--这样的东西……,郁闷中。

 

Python中不仅支持if else语句,还用了新的语句,if elif。以此来替代C++中的switch,就我使用感觉不错。Python同样也支持break,continue,并且与C++中意义完全一样。见下例:

while True:

    x=raw_input("Please input a input")

    if x =="":

        continue

    elif x =="!":

        break

    elif x =="1":

        print "single"

    elif x =="2":

        print "double"

    else:

        print "more"

 

意义很明显,不多说了,要提到的是, Python中的布尔值是True,False,第一个字母大写的。

字符串在Python中与C++中很类似,有专门的数据结构来表示。当然,同样的,因为Python不那么注重(或者说作为目标在上层应用程序的Python不需要那么死抠效率),所以,所有的字符串都用高层抽象的类型来表示。突然想起C++中如入了 STL,其中有string类型,也可以达到同样的效果。不过即便是可选的STL都被人诟病不已,只能说,C++为底层开发背负的担子实在太重了。另外,Python大胆如此,在Python中用的最多的聚合结构是C++中的list........也就是链表。。。。。其使用方式可以和C++的数组类似。也以0为第1个成员。

Python字符串不能改写。按字符串索引赋值会产生错误。这点我估计是因为效率原因。所以,Python提供了一种简单的切片方式制做新的字符串。具体的细则可以参考Python的手册。我并不是想做一个教程,没那个能力,只是想提供一些例子,并发表点意见罢了。

像字符串一样,Python的链表也以零开始,可以被切片,联接。不过更夸张的是,作为动态类型语言,Python的链表可以同时存储不同类型的成员。它也可以嵌套链表。。。。我无语了,用法是夸张,不过我还不见有什么用。

看了很多Python的语法的东西,最后发现还是难以习惯,连最后的分号都总是不记得去掉,这样讲好像不对,应该是,连最后不要加分号都记不住。。。。更不提思维了。慢慢来吧。

for语句 Python中也有,不过是以一个链表作为循环条件的,这点比较奇怪,与C++中的for相差不是一点远。本来想重写TCPL中的单词统计程序,不过发现自己没有办法用Python写出来,没有办法。。。。。。。。。郁闷了,不知道这里该写什么了。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值