Python学习总结(一)

实习所在公司涉及Python开发,由于之前只是用Python进行科学计算,并不涉及复杂的语言特性。所以在正式开始开发之前,想用一些时间对Python知识进行回顾复习的同时学习高级语言特性。

由于我之前经常使用C++,因此在文章中会用星号‘*’重点标记Python与C++不同的部分,方便那些与我情况相似的同学学习。


目录

  • Python学习总结(一)
  • 对象
  • *变量
  • *int类型范围
  • *整数的2、8、10、16数值表示
  • *and ,or和not 运算符
  • *字符串是不可修改的


对象

Python 中,一切皆对象。每个对象由:标识(identity)、类型(type)、value(值)组成。

  1. 标识用于唯一标识对象,通常对应于对象在计算机内存中的地址。使用内置函数id(obj)可返回对象obj 的标识。
  2. 类型用于表示对象存储的“数据”的类型。类型可以限制对象的取值范围以及可执行的操作。可以使用type(obj)获得对象的所属类型。
  3. 值表示对象所存储的数据的信息。使用print(obj)可以直接打印出值。

*变量

在Python中,变量其实是对象的引用。因为,变量存储的就是对象的id(地址)。

  • 变量通过id引用了对象。
  • 变量位于:栈内存
  • 对象位于:堆内存

示意图如下,图中,变量a是一个值为3的int对象的引用,其存储了该对象的id信息(类似于C++中的地址);变量b是一个值为“我爱你”的str对象的引用。

python期末总结 python报告总结_运算符

*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, 十六进制

*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++有很大不同:

python期末总结 python报告总结_字符串_02


可以看到,与C++中的&&和||返回的永远是布尔值不同,Python的and和or返回的是两个操作数中的一个

a = True
b = 30
c = a and b # c = 30

a = False
b = 30
c = a or b # c = 30

另外一个与C++不同的是,在Python中and的优先级大于or

print(True or True and False) # True

*字符串是不可修改的

在Python中,字符串是不可修改的,采用类似replace()等方法修改字符串实际是生成了一个新的字符串。这也与C++字符串可以修改完全不同。

str = "abc"
#str[0] = "b" // TypeError: 'str' object does not support item assignment

也因为这个原因,使用+=运算符进行字符串拼接的时候,每使用一次,都会生成一个新的字符串。当+=使用次数非常多的时候,性能就会很差,这个时候可以用字符串的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

可以看到,直接使用+=拼接字符串和使用join()效率相差100倍以上,所以在数据量大的情况下,我们应当使用join()。