Python学习总结(一)
实习所在公司涉及Python开发,由于之前只是用Python进行科学计算,并不涉及复杂的语言特性。所以在正式开始开发之前,想用一些时间对Python知识进行回顾复习的同时学习高级语言特性。
由于我之前经常使用C++,因此在文章中会用星号‘*’重点标记Python与C++不同的部分,方便那些与我情况相似的同学学习。
目录
- Python学习总结(一)
- 对象
- *变量
- *int类型范围
- *整数的2、8、10、16数值表示
- *and ,or和not 运算符
- *字符串是不可修改的
对象
Python 中,一切皆对象。每个对象由:标识(identity)、类型(type)、value(值)组成。
- 标识用于唯一标识对象,通常对应于对象在计算机内存中的地址。使用内置函数id(obj)可返回对象obj 的标识。
- 类型用于表示对象存储的“数据”的类型。类型可以限制对象的取值范围以及可执行的操作。可以使用type(obj)获得对象的所属类型。
- 值表示对象所存储的数据的信息。使用print(obj)可以直接打印出值。
*变量
在Python中,变量其实是对象的引用。因为,变量存储的就是对象的id(地址)。
- 变量通过id引用了对象。
- 变量位于:栈内存
- 对象位于:堆内存
示意图如下,图中,变量a是一个值为3的int对象的引用,其存储了该对象的id信息(类似于C++中的地址);变量b是一个值为“我爱你”的str对象的引用。
*int类型范围
在Python2中,int是32位的,long是64位,这和64位平台上的C++一致。但在Python3中,int可以储存任意大小的整数,long被取消。所以Python特别适合科学运算。
*整数的2、8、10、16数值表示
在C++中只支持8、10、16进制赋值,且语法上八进制数值表示有一定区别。
bin = 0b01 # 或0B01, 二进制
oct = 0o03 # 或0O03, 八进制
dec = 123 # 十进制
hex = 0xff # 或0Xff, 十六进制
- 1
- 2
- 3
- 4
*and ,or和not 运算符
Python中的and和or运算符执行布尔逻辑运算,但是与C++不同的是,他们并不返回布尔值,而是返回操作数之一。
首先,我们应当了解,在Python中有这几类对象会被认为是布尔值False:
- None
- False
- 数值为0的数字,比如0,0L,0.0,0j
- 空字符串,字典、元组、列表,即 “”,(),[],{}
- 自己定义的类的对象,如果类中实现了__nonzero__ ()或者__len__ (),当这些方法返回整数0或者False的话,也被认为是False
了解了这些之后,我们来看看and,or和not的运算规则,这与C++有很大不同:
可以看到,与C++中的&&和||返回的永远是布尔值不同,Python的and和or返回的是两个操作数中的一个:
a = True
b = 30
c = a and b # c = 30
a = False
b = 30
c = a or b # c = 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
另外一个与C++不同的是,在Python中and的优先级大于or:
print(True or True and False) # True
- 1
*字符串是不可修改的
在Python中,字符串是不可修改的,采用类似replace()等方法修改字符串实际是生成了一个新的字符串。这也与C++字符串可以修改完全不同。
str = "abc"
#str[0] = "b" // TypeError: 'str' object does not support item assignment
- 1
- 2
也因为这个原因,使用+=运算符进行字符串拼接的时候,每使用一次,都会生成一个新的字符串。当+=使用次数非常多的时候,性能就会很差,这个时候可以用字符串的join()方法代替。join()方法会事先开辟好拼接后的字符串所需内存,再将字符串一个个复制进去,过程中只生成了一个新的字符串。
import time
time01 = time.time()
a = ""
for i in range(1000000):
a += "abc"
time02 = time.time()
print(str(time02-time01)) // 0.6098752021789551
l = []
for i in range(1000000):
l.append("abc")
time01 = time.time()
''.join(l)
time02 = time.time()
print(str(time02-time01)) // 0.005984306335449219
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
可以看到,直接使用+=拼接字符串和使用join()效率相差100倍以上,所以在数据量大的情况下,我们应当使用join()。