语法:Python与C++对⽐⽬录
⼀、概述
Python和C++都是⾯向对象的。
从语法⾓度来说:Python更加灵活;C++逻辑更加清晰。
Python C++
import cmath
导⼊模块,每⼀个.py⽂件都可以认为是⼀个模块。Python中导⼊的模块可以是类的定义,函数的定义。#include
引⼊头⽂件,头⽂件为类或函数的声明。
C++⽀持分离式编译,对源⽂件分别编译成⽬标⽂件,再链接⽣成可执⾏⽂件。通过头⽂件把源⽂件关联起来。
在python程序中直接添加sys.path,即import时寻模块的路径在cmakelist中设置include_directories(),即include时寻相应头⽂件的路径
在程序中添加单元测试if __name__ == "__main__":
当模块被作为脚本直接运⾏时,执⾏之后的程序块;
当模块被其他模块导⼊时,不执⾏之后的程序块。
⾮常⽅便,可以直接将单元测试脚本写在if __name__ ==
"__main__":后,保证程序功能正常
C++需要有⼀个 main 函数来作为程序的⼊⼝。如果需
要单元测试需要单独写带有main函数的源⽂件。
数据类型决定数据所占内存空间的⼤⼩、布局⽅式、该空间能存储的值的范围、以及数据能参与的运
算
对象⼀切皆对象(数据类型、函数、类都是对象)。对象包含
identity(Python中即为对象的内存地址,⼀旦创建不再改
变)、类型信息、值、引⽤计数(⽤于记录当前有多少个变量在
引⽤这个对象。⼀旦引⽤计数器为0,那么该对象就会被系统⾃
动回收)、。
⼀块能存储数据并具有某种类型的内存空间
变量在python中就是个name,Names refer to objects. Names
are introduced by name binding operations.
没有类型信息,是通⽤的(增加python的灵活性),引⽤⼀个
对象。
(即变量是对象内存地址的引⽤)
命了名的对象,即具名的、存储数据并具有某种
类型的内存空间
(即变量有⼀个名字,并在内存中占据⼀定的存
储单元,在该存储单元中存放变量的值)
引⽤引⽤即别名,为已经存在的对象所起的另外⼀个名字,引⽤⾃⾝不是对象
指针指针⽤来存放某个对象的地址,指针⾃⾝也是⼀个对象=name binding,名字绑定,变量存储对象的引⽤把值赋给变量(对象)
⼆、基本操作
Python C++
Python C++
int最⼤整型\最⼩整型O
备注:sys.maxsize \ -sys.maxsize-1 (跟计
算机相关,可能是32位,也可能是64位)
sys.maxint \ -sys.maxint-1在python2中
⽀持,在python3中不⽀持了
INT_MAX \ (4Bytes,即32bits的最⼤值2^31-
1)
INT_MIN (-2^31)
float最⼤值\最⼩值float('inf') \
float('-inf')
FLT_MAX \
FLT_MIN
两字符相减字符不能直接相减,必须先⽤ord()函数返回字符串
的ASCII值,才能相见
字符可以直接相减
/两个整型做“/”运算,得到浮点型的结果两个整型做“/”运算,得到整型,相当于除完取int(),⼩数部分截断,即向0取整
// 地板除,即向负⽆穷取整8//3 结果为2
-8//3 结果为-3
%
% 取模(modulus)
-10%3 结果为2
-90%8结果为6
% 取余
-10%3 结果为-1
-90%8结果为-2
PS:
取模(Modulus ) V.S. 取余(Remainder)
对于整型数a,b来说,取模运算或者求余运算的过程都是:
1. 求 整数商: c = a/b; (把这⾥的/理解成数学意义的除。求模运算和求余运算在这⼀步不同:取模运算在本步骤计算c的值时,向负⽆穷⽅向舍⼊(向下取整);取余运算在本步骤取c的值时,向0 ⽅向截断;)
2. 计算模或者余数: r = a - c*b (本步骤取模和取余相同)
以python实现为例,取模和取余代码区别为:
# 取模,Python中可直接⽤%,计算模,r = a % b
def mod(a, b):
c = a // b
r = a - c * b
return r
# 取余
def rem(a, b):
c = int(a / b)
r = a - c * b
return r
符号%在C++和Python中意义不同
对于%符号,在上⾯第1步中:
C++使⽤的a/b (是0取整),所以最终C++中%实现的是取余;
python使⽤的是a//b(是向负⽆穷⼤取整),所以python中%实现的是取模。
三、控制流
Python C++
if if condition1:
statement1
elif condition2:
statement2
else:
statement
在if , elif, else中只要匹配上⼀个,后⾯的条件和代码块都不再执
⾏,即便后⾯的elif条件也能匹配上。
if (condition1){
statement1;
}
else if (condition2){
statement2;
}
else (condition3){
statement3;
}
三元运算符target = a if condition else b target= condition?a:b;
for循环for item in iterable:
statement
iterable的可以是列表Occupationt=
['teacher','student','driver','governer']、元组(1,2,3)、字典
{"name":'Arnold',"Salary":10000}.items()、集合对象
{100,‘ab’}、字符串 ‘abcdefg’。
for i in range(0,10):
print(i)
for (init-state;condition;expression){
statement;
}
C++范围for语句实现类似于Python的遍历序列:
for (auto item : iterable){
statement;
}
iterable为⼀个序列,可以是数组、vector、
string, 必须拥有能返回迭代器begin和end的成
员。
for (i=0;i<10;i++){
print(i);
}
while循环while condition:
statement
while (condition){
statement;
}
switch O switch(condition){
case(constant-expression1):
statement1;
case(constant-expression2):
statement2;
break;
case(constant-expression3):
statement3;
break;
default:
statement3;
}
判断满⾜条件的case后,后⾯的语句依次执⾏(不管后⾯的case是不是能匹配上),直到遇到break。在上⾯例⼦中,如果匹配了constant-expression1,则statement1和statement2都会执⾏。
四、函数
Python C++
函数传参传对象引⽤(pass by object reference): 传递的是对象的内存
地址的引⽤;
实质与python的=意义相同。
传值(pass by value):把实参的实际值赋值给函
数的形参。在函数内修改形参,函数外的实参不
改变。
传引⽤(pass by refrence):把实参的引⽤赋值
给形参。在函数内修改形参,函数外的实参随之
变化。
函数内定义函数(嵌套函数)python的函数也是对象,因此可以将函数作为参数传递、可以
编程先学c语言还是python将函数作为返回、可以将函数放⼊结构体中(如函数放⼊数组
中)、可以在函数中定义函数;
def outer():
x=5
def inner():
y=x+3 #内函数在⾃⼰作⽤域内查局部变量失败后,
会进⼀步向上⼀层作⽤域⾥查。
print(y)
return inner #闭包:内函数体内引⽤到外函数中定义的变
量,return返回内函数的引⽤时把内函数和外部引⽤变量打包成
整体返回, 这⾥inner函数和外部变量x组成闭包
不能在函数中定义函数,需要使⽤函数对象或者
匿名函数实现需求
void foo(){
//function object
class InnerFunction{
public:
void operator()(){
std::cout<<"inner function object"
<
}
};
InnerFunction innerfunction;
innerfunction();
//lambda expression
auto lambdafunc=[=]()->void{
std::cout<<"inner lambda function"<
}
lambdafunc();
}
装饰器⽤于扩展函数功能,在没对函数本⾝做任何修改的情况下,如其
名所⽰,添加了其它(辅助)功能。
def executetime(func):
def wrapper():
time1=time.time()
func()
time2=time.time()
delta_t=time2-time1
O
print('excecute_time is {}'.format(delta_t)) return wrapper
@executetime
def myfunc():
time.sleep(5)
⽣成器⽣成器是包含yield语句的函数,是使⽤普通函数语法定义的迭代器。
当⽣成器被调⽤时不会执⾏函数体内的代码,⽽是返回⼀个迭代器。
每次使⽤next()请求值时都执⾏⽣成器的代码,直到遇到yield或return,每次遇到 yield 时函数会暂停并保存当前所有的运⾏信息,并返回 yield 的值。在下⼀次执⾏ next() ⽅法时从当前位
置继续运⾏。
O
五、数据结构
Python和C++都有容器的概念:
序列中的每个元素被分配⼀个序号--即元素的位置,也称为索引。
通⽤序列操作:索引、分⽚、序列相加、乘法、成员资格、长度、最⼩值和最⼤值。
Python包含6种内建的序列,即列表、元组、字符串、Unicode字符串、buffer对象和 xrange 对象列表 []: 相当于C++中的vector容器;数据项不需要具有相同的类型
元组 (): 元组的元素不能修改;数据项不需要具有相同的类型
Python常⽤的基本内置数据类型还包括:
集合{ } 或 set() : ⽆序不重复序列
字典 {}
1. 顺容器操作
Python
序列(sequence ,包括列表、字符串和元组)C++
顺序容器(sequential container,包括vector, deque, list, forward_list, , string, array)
创建例如:v=['dlsdkf', 60]
⽆需声明容器的类型以及容器
内元素的类型:使⽤[]表⽰创
建列表,()表⽰元
组,“”或''表⽰字符串;
列表中可以放任意类型的元
素,甚⾄在同⼀列表中可以包
含不同类型的元素。
C c{a,b};
例如: std::vector v{2,3,5};
列表初始化
需要声明容器的类型和容器内元素的类
型,容器内元素类型必须相同。
索引v[n], n可为负数,-1表⽰倒
数第⼀个
v[n], n只能为正数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论