c/c++与Python的语法差异
1、程序块语法方面:
c/c++中用一对“{}”将多段语句括起来,表示一个程序块,并以右大括号表明程序块结束
for(i=0;i<n;i++) { cout<<a[i]; j+=1; }
Python中用缩进方式表明某几句语句为同一程序段
1 for i in n: 2 print(a) 3 j+=1
2、对for循环的使用
c/c++中用如下形式:for(i=0;i<n;i++){语句},主要是以某一可控值(如:n)控制循环的进行
Python中采用如下形式:for i in range:,采用序列的方式控制循环的进行
3、python的随机数产生
python的随机数产生函数random.randrange()如果传入两个参数,就会产生从低端点(包含)到高端点(不包含)之间的随机数
4、Python的不变性
python中的字符串中的元素不能通过直接赋值修改
如:
1 word="game" 2 word[0]="l"
这段代码就是错的
而在c/c++中则可以直接通过这种方式对字符串进行修改
***需要理解的是,在python中对字符串变量重新赋值并不是改变了字符串,而是重新构造了字符串:test=“keyword”
***这种不变性同样适用于元组(c/c++中的数组):test=("keyword1","keyword2",...)
***如果需要对组合元素序列进行修改,可以使用列表或字典,这两种存储方式可以对其中的元素成员进行修改操作:test=["keyword1","keyword2",...]
5、python不需要对变量的类型进行申明,直接定义,且初始化只需要对变量赋空值即可,如:cout=“”;
6、python可以用负值进行位置编号:
正值的编号是从左向右依次从0开始编号
负值的编号是从右向左一次从-1开始编号
7、python引入了字符串切片的概念:
采用a[start:finish]表示在字符串a中从编号start开始到编号finish之间的片段
***切片概念同样适用于元组、列表和字典
8、Python中的列表和c/c++中的数组
Python中的列表可以利用切片的概念对列表进行整体赋值,如:inventory[4:6]=["orb of future telling"],每个元素间只需空格隔开;
Python编译器自带数据访问的越界检查
Python的列表可以进行整体输入输出
python可以单个删除某个列表元素,也可以利用切片删除连续的多个元素
1 >>> test=["word","letter","honest","yes"] 2 >>> print(test) 3 ['word', 'letter', 'honest', 'yes'] 4 >>> del test[2] 5 >>> print(test) 6 ['word', 'letter', 'yes'] 7 >>>
c/c++中的数组任何情况下都不允许进行整体赋值(除非重新定义数组),且不会对数组进行越界检查
c/c++的数组不能整体输入输出,删除元素时也只能进行覆盖操作
9、Python中支持嵌套序列
如:可以再列表中包含其他列表或元组
对嵌套元素访问时,可以先把列表中的元组赋给另一个值,从另一个值访问被包含元组的成员值
>>> scores=[("a",100),("b",200)] >>> score=scores[0] >>> print(score) ('a', 100) >>> print(score[0]) a >>>
也可以直接用类似c/c++中二维数组的形式进行访问:先获得第一层序列的值,然后再获取该值第二层序列值(专业名词叫多重索引)
1 >>> score=[("a",100),("b",200)] 2 >>> print(score[0][0]) 3 a 4 >>> print(score[0][1]) 5 100 6 >>>
10、任何类型的序列都可以解包,分别把序列中的各个元素赋值给其他变量,这个是c/c++不具有的性质,使得Python有了更大的灵活性
***元组、列表、字典都是序列
1 >>> test=[("a",100),("b",400)] 2 >>> test1,test2=test 3 >>> print(test1) 4 ('a', 100) 5 >>> print(test2) 6 ('b', 400) 7 >>>
11、Python中对值得存储采用引用的方式,变量本身并不存储值,如:test="python",只是在内存中存储这个字符串,用test作为名字指向这个字符串,对test的任何操作实际上都是对字符串本身的操作,这一点与c/c++不同,实例如下:
1 >>> test=["python","java"] 2 >>> print(test) 3 ['python', 'java'] 4 >>> test1=test 5 >>> print(test1) 6 ['python', 'java'] 7 >>> test1[0]="c/c++" 8 >>> print(test1) 9 ['c/c++', 'java'] 10 >>> print(test) 11 ['c/c++', 'java'] 12 >>>
以上例子说明,所谓的变量其实就是一个引用时使用的名字,对这个名字的任何操作,其实都是对他指向的实体内容的操作
但可以通过切片取得原来一个实体的副本,这样对副本的修改就不会影响到原来的实体,因为切片取得的永远都是一个副本
1 >>> test=["python","java"] 2 >>> print(test) 3 ['python', 'java'] 4 >>> test1=test[:] 5 >>> test1[0]="c/c++" 6 >>> print(test1) 7 ['c/c++', 'java'] 8 >>> print(test) 9 ['python', 'java'] 10 >>>
如以上结果,对test1的修改并没有影响到test所指的值,因为test1是从test切片过来的“副本”
12、python中的静态方法(方法前加入“@stasticmethod”修饰符)尽量不要和其他方法在命名上相同,因为python中在调用时,会优先调用静态方法,如果静态方法和其他方法名称相同,则在运行时会自动忽略对其他方法的调用
这一点上与c++的函数重载有所不同
13、c++中,外部函数对类私有成员的访问是绝对禁止的
但Python中对私有特性的访问却不是绝对禁止的,在私有特性前加入“—类名”,即可实现对其的访问,如:
同理,私有方法也是这样的
***同时,Python中提出了一种对特性进行控制的概念,即,对特定的特性修改时做部分限制,只需要在能访问该特性的方法前加入“@property”修饰符,将它设置为属性即可,
并且Python中可以为特性单独设置属性值,格式为:“@+属性的名称+“.”+setter”
14、python中可以直接在变量后携带两个字符串,用来创建新的字符串:
>>> foo="hello""world" >>> foo 'helloworld'
15、python中引入了原始字符串操作符r/R,用来把常用字符串按照字面意思来使用,而不考虑其转义特性:
>>> f=open("e:\readme.txt","r") Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> f=open("e:\readme.txt","r") IOError: [Errno 22] invalid mode ('r') or filename: 'e:\readme.txt' >>> f=open("e:\\readme.txt","r") >>> f=open(r"e:\readme.txt","r")
以上的例子可以看到使用原始字符串操作符可以用直面语义使用字符串,相对原始的语法规定(包括c/c++)使用起来更为方便
16、python中,字符串不是以"NULL"或“\0”结束的,在对字符串赋值时,不需要考虑字符串结束符的问题,这一点与c/c++有所不同,避免了c/c++由此造成的内存越界。