数据类型
变量与对象
- 变量没有类型,可以将它理解为一张可以反复粘贴的标签纸,能够贴到不同的对象上。
- 对象是有类型的,如int、float、str等。
- 当我们用一个赋值符号定义变量时,实际是将变量和一个对象关联起来了(变量名贴到了这个对象上)。
- a = 10,将标签“a”贴到一个整数对象上,这个整数对象的值为10,接着执行 a = 20时,并没有改变标签,也没有改变值为10的对象,只是将标签“a”又贴到了值为20的另一个整数对象上。
- 如果有C语言经验的程序员可以将a认为是一个void*类型,可以指向不同的内存位置,而每个对象都有一个对象头,来区分对象的类型和统计对象的被引用(关联)次数。
- 当引用次数为0时,对象就会被回收(有些也可能被缓存起来,供以后使用,一般小的整数会被缓存起来)
- sys.getrefcount(x)函数可以得到x被引用的次数。
a = 10
b = a
整数10对象上被贴了两个标签:a和b
字符串
raw原始字符串:
- 在字符串的第一个引号前加上字符 r,如文件名:"c:\net\text.txt'会将字符串中的“\n”和“\t”分别转义为“换行符”和“制表符”,而r"c:\net\text.txt'将会限制其中的转义符进行转义,字符串保持原样。
- raw字符串不能以奇数个转义符“\”结束,如r'abc\'会报语法错误,原因:raw会抑制转义符转义,所以紧接在转义符后的字符会被当做字符来解析,因此 r'abc\'中最后的\'会解析成“斜杠”和“单引号”这两个字符,它们是这个字符串内容的一部分,这样字符串右侧就少了一个单引号的结束符,因此语法错误。解决办法:r'abc' + '\\' 或 r'abc\\'[:-1] 或 r'abc\''[:-1]。
字符串逆序:
str[::-1]
列表
切片替换:设 x = [1, 2, 3, 4]
- 删除:执行x[1:3] = [ ]后,x 值为 [1, 4]
- 替换:执行x[1:3] = [5, 6]后,x 值为 [1, 5, 6, 4]
- 插入:执行x[2:2] = [8, 9]后,x 值为 [1, 2, 8, 9, 3, 4]
- 注意:执行x[0] = []后,x 值为 [ [ ] , 2, 3, 4]
排序:
- 原型:list.sort([key = None], reverse=False),省略参数key时,按元素对象的比较操作符进行比较,加上key时,对每个元素进行fun运算后,根据运算结果进行比较;
- reverse参数表示排序方式(升序或降序),reverse为False时表示升序,否则为降序;
- 示例:设x=['abc', 'Abc', 'ABe'],执行x.sort(),x的值为['ABe', 'Abc', 'abc'];如果执行x.sort(key=str.lower),x的值为['abc', 'Abc', 'ABe']。
- key也可以指定为自己定义的函数,如:
def mySquare(x):
return x*x
x = [-9, 3, -11.5, 6, 33]
x.sort(key=mySquare) #x的值为[3, 6, -9, -11.5, 33]
- 如果列表中的数据类型不一致,则在Python3中不能使用sort进行排序操作;另外sort操作会修改列表对象,返回None。
- 内置函数sorted(aList, key=None, reserve=False),作用与方法类似,但是不会改变aList对象,返回一个新的排序后的对象。
字典dict
注意事项
- 序列运算无效,字典中的元素是没有顺序的,因此连接、分片操作对字典无效。
- 对新的索引值赋值会添加新的元素。
- 键不总是字符串。
模块module
信息隐藏
- 在模块中以“_”开头定义的模板全局变量,当被以from *的方式导入时会隐藏;
- 当模块中以有__all__模板全局变量时,当被以from *的方式导入时,只会得到在__all__中指定的变量,其他的会隐藏。__all__是一个字符串列表。
模块导入的陷阱
- import 与 from语句只是变量名的复制,而不是连接,当指向不可变类型数据时,对其赋值不会修改模块中的变量;
- 使用 from 可以进行相对模块的导入,但是在__main__模块(运行的主文件)中,只能使用绝对模块导入,不能使用相对模块导入;
类
类的属性管理
- __getattribute__:可能会导致循环调用,避免方法就是将获取指向一个更高的基类:object.__getattribute__(self, attr)。
- __setattr__:可能会导致循环调用,避免方法就是到__dict__中设置,self.__dict__[attr] = value,也可以将设置指向更高的基类:object.__setattr__(self, attr, value)。
- __delattr__:与上述的两个基本相同,也要避免循环调用。
- __getattribute__与__getattr__的区别:后者只有在获取未设置的属性时才会调用,而前者对于所有属性都会调用。两个都有可能拦截不到一些内置的属性,如__str__在通过print函数调用时。
- self的双下划线开头的属性名称会变成:_类名__属性名