学习分享通过C,python的对

一、前言

对于只接触过静态语言,而从未使用过动态语言的人来说,第一次看到python的语法可能会大为惊叹。不用申明变量类型?不用等老半天编译完成就能直接运行?不用小心的维护指针?还不用写CMakelist文件?是的,都不用!接下来我就对比下C++与Python,并进行python的快速入门。

二、编译器vs解释器

C++是静态语言,需要编译器将代码翻译成CPU可以直接执行的二进制机器码,因为变量类型,变量所占空间已经被代码的编写者或编译器明确的计算出来翻译成二进制的机器指令,所有CPU只需要无脑的执行二进制机器指令就完成工作。

而对于python这种动态语言来说,代码运行离不开python解释器。代码被执行时,python解释器会读取一句代码,然后翻译一句并输入到CPU中进行执行并获得执行结果。因为python解释器执行每一句代码时都能获取之前代码的执行结果,所以python解释器完全可以自己计算/推导当前所处理变量的类型,所占用空间大小并为其分配空间。所以这样的执行流程,python速度必然比不上编译成二进制包C++。python每一句代码执行都和python解释器强耦合,每执行一句代码,都要推断变量类型,计算所占内存空间,而这些任务C++在编译器编译阶段已经完成了,这也是静态语言一般比动态语言快的原因(之前我有段图像处理代码改用C++重写后速度提升10倍左右)。

另外提一句,C++一旦编译成二进制包后,就不再需要编译器了,把二进制包直接复制到其他机器也能运行,而python想要在其他机器上运行就必须要安装python解释器。

三、包管理器

对于只会C/C++的人来说,甚可能连C++也有包管理器都不知道,vcpkg,因为确实不好用(个人觉得)甚至还不如手动下载。说到学习python,第一个学helloword,第二个可能就是pipinstall了,pip是python的包管理器,包管理器的存在充分践行拿来主义,不要重复造轮子的原则;举个例子,比如你想用扩展卡尔曼算法来实现一个功能,而自己又写不出来,这时打开搜索引擎输入pythonekfpip,第二个就是别人已经给你封装好的算法

点开第二个

然后打开终端,运行pipinstallfilterpy,等待安装完成,想要使用这个包,你不需要像C++样需要修改CMakeList文件来保证编译通过,而是在python代码中直接import就行了(类似于C++include),这样你就"学会了写"扩展卡尔曼算法了。

importnumpyasnpfromfilterpy.kalmanimportKalmanFilter

另外,你可能注意到PyPI这个网站,它是python的官方软件包仓库;组织,个人只要遵循对应的协议都能向PyPI提交自己制作的python软件包。

语法对比(上为C++,下为python)

变量声明,C++使用;作为代码行分割,python使用换行作为分割

inta=0;floatb=0;std::stringc="abc";//等价于inta=0;floatb=0;std::stringc="abc";

a=0b=0c="abc"#错误,无法运行a=0b=0c="ab

作用域划分,C++依靠大括号{},python依靠缩进

while(true){//doSomething1}//wdoSomething2

whileTrue#doSomething1#doSomething1

字典map

#includemapstd::mapconstchar*,intx;x["one"]=1;x["two"]=2;

#更加符合直觉x={"one":1,"two":2}

vector,对应pythonlist数据类型,

std::vectorstd::stringstrs{"a","c","d"};std::vectorintints{1,2,3};//追加ints.push_back(4);//翻转#includealgorithmstd::reverse(begin(ints),end(ints));

strs=["a","c","d"]ints=[1,2,3]#追加ints.append(4)#翻转x=reversed(ints)#ory=x[::-1]

函数定义

boolprint_(std::stringstr){std::coutstrstd::endl;returntrue;}

defprint_(str)print(str)returnTrue

类,C++类中使?类成员时,编译器会隐式添加this指针,?python对于类成员必须显示指定self

intcount=1;ClassAbc{public:ABC(){};voidprint(){std::coutcountstd::endl;//等价于std::coutthis-countstd::endl;//打印为10std::cout::countstd::endl;//打印为1,显示指定全局作用域下的count}intcount=10;staticints_var;};Abc::s_var=11;

intcount=1classAbc()s_var=11#等价于c++类静态成员def__init__(self):self.count=10defprint(self):#必须显示指定selfprint(count)#打印为1print(self.count)#打印为10

更多C+,python对?




转载请注明:http://www.aierlanlan.com/rzgz/270.html

  • 上一篇文章:
  •   
  • 下一篇文章: