0. 前言
这两天放暑假在家,闲来没事,倍觉无聊,于是把借来3个月但还没怎么看的《Python语言入门》大致看了一遍,随便改写了一部分原有的程序作为练习。作为一门解析性脚本语言,我感觉Python与类C/C++语言有许多不一样的做法,特此记录。由于本人使用Python的时间只有3天,对Python语言的理解未见深刻,若有错误,欢迎指出。
0.0. 适用读者
我认为了解一门新的语言的最快的途径是把这门语言与自己熟悉的语言进行类比。一来我们已经对计算机程序设计语言有一定的了解,其实各种语言的基本结构都差不多,所以我们无需从0开始;第二,进行类比可以让你更加容易记住各种语言之间的差异,从而避免犯错。由于国内大学通常选用C/C++作为主要的程序设计语言,所以本文用C/C++与Python进行类比。也就是说,本文假设你对C/C++有一定的了解;另外,由于Python与java和c#在对象系统和参数传值上也有很多相同点,如果你了解java或c#语言,那肯定会加速你对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的“能力”上有何不同:C和C++都是一门系统语言,使用它们编写出来的代码的运行速度通常很快,并且可以完成大部分常见的功能。而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先把源程序编译成中间代码(类似于java和c#),然后解释执行。但要注意的是,编译过程对程序员来说是透明的(这又不同于java和c#)。
4)         Python是一门动态语言。它支持元数据编程;支持运行时编译、执行等现代语言的高级特征。这些都很难甚至无法在C/C++中实现。Python甚至允许你在运行的时候增加一个对象的成员!
5)         一切都是对象!Python中对象的概念比其他语言丰富得多,比如类是一个对象,因此你可以在运行的时候使用它,而不像C++一样,类是编译时的对象。正因为这种原因,使得Python是高度动态的。
6)         自动内存管理。像java一样,你无需管理你的代码所使用的内存。在C和C++的程序中,那是一场恶梦。
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
下图可以看出i和j之间的关系:
#after the code "j = i"
i --- 1
j --- 1
#after the code "j = 2"
i --- 1
j --- 2
可以看出,i和j所引用的内存位置是不一样的,所以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_i与arry_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类型脚本(不适用于windows和dos)
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行类似c的include语句,使我们可以使用其他程序库。但它的工作原理与include大相径庭。c的include是一个编译时命令,把头文件的所有内容拷贝到包含它的文件中。而python的import语句则是运行时语句,它会导致被import的模块的编译和执行!
C/C++程序员可能会奇怪这个python程序为什么没有main函数。事实上,python程序不需要main函数,当一个python模块被执行(被shell或import等)的时候,这个模块的所有顶层语句将会被执行。事实上,我们可以认为(事实上也是)这个python的程序的main函数就是被shell执行的那个python模块中的所有代码。
Python中注释从符号#开始直至行尾,相当于C中的“//”,它没有C的多行注释“/*XX*/”

从C/C++到Python(之一)(By Robinvane Suen)相关推荐

  1. EuroBen Benchmark安装以及测试(By Robinvane Suen)

    EuroBen Benchmark 是一个用于测试科学/工程 计算的基准测试程序,它包括多个包,分别可以用于测试单机, MPI以及OpenMP所搭建的并行系统的性能. 可以在 http://www.e ...

  2. 从C/C++到Python(之二)(By Robinvane Suen)

    3. 类型与操作符 Python与C/C++不一样,它不是一个强类型的语言.所以,在使用一个变量之前,我们无需声明它的类型 - Python会自动帮我们辨别变量的类型.更重要区别是,变量可以指向任意类 ...

  3. 快乐共享(By Robinvane Suen)

    若干个礼拜前,大家都被分配了一个任务,就是每个人分别认真研读<Parallel Programming in C with MPI and OpenMP>的其中两章,并且把其中的程序实现. ...

  4. Github配置(git+vscode+python+jupyter)

    ①下载git 打开 git bash 工具的用户名和密码存储 $ git config --global user.name "Your Name" $ git config -- ...

  5. 【实验楼】python简明教程

    ①终端输入python进入 欣赏完自己的杰作后,按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器. ②vim键盘快捷功能分布 ③这里需要注意如果程序中 ...

  6. 【Kaggle Learn】Python 5-8

    五. Booleans and Conditionals Using booleans for branching logic x = True print(x) print(type(x))''' ...

  7. 【Kaggle Learn】Python 1-4

    [Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...

  8. 使用python愉快地做高数线代题目~

    今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...

  9. python 位运算与等号_Python 运算符

    和大多数语言一样,Python也有很多运算符,并且运算符跟其他语言的运算符大同小异接下来一一介绍: 算术运算符: 运算符描述实例 +加 - 两个对象相加a+b的输出结果是30 -减 - 得到复数或者一 ...

最新文章

  1. 三层交换机原理:01路由器如何隔离广播域?
  2. Elasticsearch 如何做到快速检索?
  3. MA5680T跨板聚合
  4. 主流浏览器Cssjs hack写法
  5. 交流信号叠加直流偏置_高速数字电路设计通关五部曲(二):接口信号匹配与对接...
  6. linux内核维护者,Linux 内核维护者封杀明尼苏达大学(转载) - 优秀的Free OS(Linux)版 - 北大未名BBS...
  7. Can I Delete Administrative Shares (e.g. C$) in Windows?
  8. CentOS7.6Arm Qt开发环境(GCC+Qt5+QtCreator+JDK8+MySQL8+CMake+ProtoBuf+Python+SVN)
  9. Java excel添加水印
  10. java 设置文本框文字居中_div居中 边框设置 文字行高设置
  11. matlab coder分析
  12. 小刘同学的第一百三十一篇博文
  13. 51单片机数字电压表仿真设计_LCD显示
  14. 常用财务指标计算公式(信贷指标公式)
  15. 以P2P网贷为例互联网金融产品如何利用大数据做风控?
  16. 电脑哪个服务器可以玩无限连击,无尽之剑3手把手教你无限连击攻略
  17. 时间轮和时间堆管理定时器
  18. 前端程序员Vue开发经验总结
  19. ShardingSphere分库分表核心原理精讲第十一节 分布式事务详解
  20. Servelt中文乱码问题处理

热门文章

  1. Mathematica解一个精巧的差分方程
  2. 一个程序员分享8年的开发经验
  3. 中科院计算所王永庆详解IJCAI 17录用论文:如何用注意力机制RNN进行信息传播建模?|IJCAI 2017...
  4. 华为WEB前端全栈成长计划招募
  5. 基于C#制作一个ChatGPT桌面助手
  6. 微信小程序四种json配置文件详解
  7. 外贸独立站和外贸电商平台优劣势分析
  8. Windows7 64位软件资源
  9. 基础30讲 第六讲 中值定理
  10. C# 阿里云对象存储OSS创建、删除、上传代码实现