从C/C++到Python(之一)(By Robinvane Suen)

0. 前言
这两天放暑假在家,闲来没事,倍觉无聊,于是把借来3个月但还没怎么看的《Python语言入门》大致看了一遍,随便改写了一部分原有的程序作为练习。作为一门解析性脚本语言,我感觉Python与类C/C++语言有许多不一样的做法,特此记录。由于本人使用Python的时间只有3天,对Python语言的理解未见深刻,若有错误,欢迎指出。
0.0. 适用读者
我认为了解一门新的语言的最快的途径是把这门语言与自己熟悉的语言进行类比。一来我们已经对计算机程序设计语言有一定的了解,其实各种语言的基本结构都差不多,所以我们无需从0开始;第二,进行类比可以让你更加容易记住各种语言之间的差异,从而避免犯错。由于国内大学通常选用C/C++作为主要的程序设计语言,所以本文用C/C++Python进行类比。也就是说,本文假设你对C/C++有一定的了解;另外,由于Pythonjavac#在对象系统和参数传值上也有很多相同点,如果你了解javac#语言,那肯定会加速你对python语言的理解,但这不是必须的。
0.1. 目的
本文希望能够向一个C/C++程序员提供一个Python语言的快速入门,帮助一个C++程序员快速的转换到Python语言上。
0.2. 主要参考资料
Python语言入门》Mark Lutz & David Ascher著,陈革、冯大辉译, O'Reilly / 中国电力出版社。
1. Python概述
1.0. C/C++Python
虽然本文章的题目是《从C/C++Python》,但并不比较C/C++Python的“能力”上有何不同:CC++都是一门系统语言,使用它们编写出来的代码的运行速度通常很快,并且可以完成大部分常见的功能。而Python则是一门脚本语言,使用Python可以快速地编写出可运行代码。那些C/C++的狂热分子可能会垢骂Python程序的运行速度,但我觉得一门语言既然能够生存下来,就有它自己的原因,Python语言也一样。当今的计算机处理速度已经很快,对某些任务来说,运行速度并不是首要考虑的因素。比如说为了实现数据库访问的自动化,项目组需要做一个数据库访问的代码生成器。这是一个常见的任务,其中涉及编程的许多方面,包括字符串处理、数据库访问,可能还包括一个GUI系统。这个任务显然不太适合用C或者C++来编写,因为使用C/C++来开发虽然可以节省那么一点运行时间,但却浪费了大量的开发时间。所以,语言没有好不好之分,只有适合不适合之分
1.1. Python语言概况
Python是一个“可移植的面向对象的脚本语言”。
1)           Python是面向对象的。它支持继承以及多重继承、多态、操作符重载等面向对象的概念。
2)           Python是可移植的。使用Python语言编写的程序通常无需修改就可以运行在多个平台上,这点与Java类似。但是Python也提供一些Plantform dependent的模块,使用这些模块的时候必须小心,因为他们是不可移植的。
3)           Python是解释性语言。准确地说,Python先把源程序编译成中间代码(类似于javac#),然后解释执行。但要注意的是,编译过程对程序员来说是透明的(这又不同于javac#)
4)          Python是一门动态语言。它支持元数据编程;支持运行时编译、执行等现代语言的高级特征。这些都很难甚至无法在C/C++中实现。Python甚至允许你在运行的时候增加一个对象的成员!
5)           一切都是对象!Python中对象的概念比其他语言丰富得多,比如类是一个对象,因此你可以在运行的时候使用它,而不像C++一样,类是编译时的对象。正因为这种原因,使得Python是高度动态的。
6)           自动内存管理。像java一样,你无需管理你的代码所使用的内存。在CC++的程序中,那是一场恶梦。
7)           其他:Python可以使用c/c++的编写的组件,也可以把python代码嵌入到c/c++代码中执行。
1.2. Python的类型、对象系统
理解一门语言的类型和对象系统非常重要,所以我把它写在其他细节的介绍之前。
总体上来看,Python语言的对象系统更接近于java(对于熟悉java的人来说,可能可以跳过这一小节)Python的类型分为两种,第一种是值类型,第二种是引用类型(它与java一样没有c++中的所谓指针类型)所有的数字类型(int, long, float, double)都是值类型。因此:
i = 1    #i is an integer
j = i    #assign i to j
j = 2    #change the value of j
print i  #the change of j does not lead to the change of i, so i = 1
下图可以看出ij之间的关系:
#after the code "j = i"
i --- 1
j --- 1
 
#after the code "j = 2"
i --- 1
j --- 2
可以看出,ij所引用的内存位置是不一样的,所以j的改变并不会导致i的改变。
除了数字类型,Python的其他类型都是引用类型,也就是说:
arr_i = [1,2,3]     #arr_i is an array
arr_j = arr_i       #assign arr_i to arr_j
arr_j[0] = 0        #change the value of the first postion of arr_j
print arr_i         #arr_i[0] = 0 now.
用下图可以看到其中的奥秘
arr_i  /
         /
          [1, 2, 3] #after "arr_j = arr_i"
         /
arr_j  /
运行完arr_j[0] = 0
arr_i /
         /
          [1, 2, 3] #after "arr_j[0] = 0"
         /
arr_j /
由于arr_iarry_j都引用相同的内存,所以arr_j的改变导致了arr_i的改变。
回顾一下c++的类型系统:简单地说,c++可以通过三种方式来访问一个数据类型的实例:值、指针和引用(好像还有别名……),并且无论是整数还是自定义对象都有这三种访问方式。撇开引用不说,C++的语言来说,python中,数字都是值类型,其他对象都相当于指针!当然,这不算完全正确,但很多时候这个看法已经足够排除你的疑惑了。
2. 第一个Python程序
2.0 运行方式
本节我们假设我们处于Unix/Linux系统。其他系统上的做法类似。
Python提供很多种方式来编写、运行一个Python程序。这里只介绍三种:
1)          交互命令行
   最简单的方式,同时也是学习语言最方便的工具就是使用python命令行方式来输入和运行代码。
%python                        #启动python交互命令行工具
>>>print "Hello world!/n"   #python代码,在标准输出打印经典的"Hello world"
Hello world!                  #这个是python执行了上一行代码的输出
>>>                             #ctrl + d退出
2)          运行模块文件
   模块文件简单地说就是python源代码文件,比如把下述代码保存为helloworld.py
print "Hello world!/n"
然后在shell中运行
%python helloworld.py
Hello world!
3)          运行Unix类型脚本(不适用于windowsdos)
Unix类型脚本也是源文件,不过添加了特殊的标志。比如把下述代码保存为helloworld.py
#!/usr/bin/python
print "Hello world!/n"
然后增加helloworld.py的执行权限:
%chmod +x helloworld.py
%./helloworld.py           #执行python脚本程序
Hello world!
2.1. 典型的Python程序结构
下面给出一个典型的Python程序的组织结构,使用unix脚本的运行方式运行
1  #!/usr/bin/python
 
2  import math                                #use the module math
3  from string import atof                    #use the function "atof" in module string
 
4  strf = "0.1"                               #declare a string variable
5  fval = atof(strf)                          #convert the string to a float variable.
6  ival = int(math.ceil(fval))            #ival is an integer
7  print("strf = %s, fval = %f, ival = %d"%(strf, fval, ival)) #print them all
1行指示shell这是一个python脚本程序。第2行导入math模块,使得可以使用math.ceil()函数。第3行是import的另一种形式,它使我们可以使用string模块中的atof函数,并可以使用它的非限定模式atof()而不是string.atof()。第4行声明一个值为"0.1"的字符串,然后在第5行把它转换成一个float类型的值fval,最后在第6行使用天花板函数把fval转换成整形值ival。第7行使用类似C的格式化字符串把这些值打印出来。
2 - 3行类似cinclude语句,使我们可以使用其他程序库。但它的工作原理与include大相径庭cinclude是一个编译时命令,把头文件的所有内容拷贝到包含它的文件中。pythonimport语句则是运行时语句,它会导致被import的模块的编译和执行!
C/C++程序员可能会奇怪这个python程序为什么没有main函数。事实上,python程序不需要main函数,当一个python模块被执行(shellimport)的时候,这个模块的所有顶层语句将会被执行。事实上,我们可以认为(事实上也是)这个python的程序的main函数就是被shell执行的那个python模块中的所有代码。
Python中注释从符号#开始直至行尾,相当于C中的“//”,它没有C的多行注释“/*XX*/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值