博文配套视频课程:Python面试题与面试技巧
Python这门语言特征
- 跨平台:不同的平台都安装了python解析器,可以解析py模块的py文件
- 开源:Python底层源代码是公开的,可以直接使用PyCharm工具时可以直接通过ctrl + 鼠标单击查看源代码
- 动态型语言:所谓动态语言是指变量类型可以在整个程序中随意更改(如果有必要的话)
- 解释型:源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行
- 强类型:一旦变量的类型被确定,就不能转化的语言。实际上所谓的貌似转化,都是通过中间变量来达到,原本的变量的类型肯定是没有变化的
总结:使用哪种语言还是要按需而定。编写简单小应用,使用弱类型语言可节省很多代码量,有更高的开发效率。而对于构建大型项目,使用强类型语言可能会比使用弱类型更加规范可靠
tuple、list、set、dict、ndarray类型的转化
In [1]: a = {}
In [2]: type(a)
Out[2]: dict
In [3]: a = {1,2,3,4,1}
In [4]: print(a,type(a))
{1, 2, 3, 4} <class 'set'>
In [5]: a = tuple(a)
In [6]: a.append(100) # 抛出异常
In [7]: a = list(a)
In [8]: a.append(-1)
In [9]: print(a,type(a))
[1, 2, 3, 4, -1] <class 'list'>
In [10]: dict(a) # 抛出异常
In [11]: a = np.array(a)
In [12]: print(a,type(a))
[ 1 2 3 4 100] <class 'numpy.ndarray'>
In [13]: a.tolist()
Out[14]: [1, 2, 3, 4, 100]
Python的值类型和引用类型
Python中的变量都是指针,这确实和之前学过的强类型语言是有不同的。因为变量是指针,所以所有的变量无类型限制,可以指向任意对象。其内存空间只是保存了所指向数据的内存地址。
- 不可变的值类型:int,str,tuple 元素不可变的,数据的修改本质上是让变量指向了一个新的对象。原始对象被Python的GC回收
- 可变的引用类型:set,list,dict 元素的值时可变的
# 值类型
a = 1
b = a
print(a,b) # 1,1
a = 3
print(a,b) # 3,1
# 引用类型
a = [1,2,3]
b = a
print(a,b)
a[0] = "1"
print(a,b)
# str的不可变性
a = "hello"
b = a
print(a,id(a))
print(b,id(b))
a = a + "python"
print(a,id(a))
print(b,id(b))
print(a[0])
a[0] = 'z' # str不可变,修改会抛出异常
赋值、浅拷贝、深拷贝
相对于=赋值而言,浅拷贝和深拷贝都是对象的拷贝,都会生成一个看起来相同的对象,本质的区别是拷贝出来的对象地址是否和原对象一样,也就是地址复制还是值的复制的区别。
import copy
a = [1,2,3,4,5,['a','b']]
b = a
print(id(a),id(b)) # 两个变量指向了同一个list对象
b = copy.copy(a) # 新对象和原对象不一样
print(id(a),id(b))
# 对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去
print(id(a[5]),id(b[5])) # 对象里的可变元素(list)的地址和原对象时相同的
a[0] = 10
a[5].append('c')
print(a,b)
# 深拷贝, 对象里面所有数据 (可变、不可变) 都会生成一个新的副本
b = copy.deepcopy(a)
print(id(a),id(b),id(a[5]),id(b[5]))
a[5].append('e')
print(a,b)
强大的切片
# 逆向切片
aList = [1,2,3,4,5,6,7,8,9]
# [start,end,step] 默认start < 必须小于end
print(aList[:])
print(aList[::2]) # 隔一个取一个
print(aList[-1],aList[-2],aList[-3])
# 当-1时step为负数,表示反向切片,才能从右向左截取
print(aList[-1:-3],aList[-3:-1],aList[-1:-3:-1])
# 返回包含原列表所有元素的逆序列表
print(aList[::-1])
# 切片为列表新增元素(重点找到新增的位置)
aList = [3,5,7]
print(aList[len(aList):])
aList[len(aList):] = [9,10,11]
print(aList)
# 在列表头部添加多个元素
aList[:0] = [1,2]
# 在列表中央位置插入元素
aList[3:3] = [4,5,6]
print(aList)
# 使用切片修改列表中元素 (找到要替换的元素,如果没有则就是新增元素)
print('-'*100)
aList = [3,5,7,9]
aList[:1] = {1,2,3}
print(aList)
aList = [1,2,3,4,5,6]
# 替换的值必须一致
aList[::2] = ['a','b','c']
print(aList)
# 采用切片进行删除操作(找到删除的元素,赋值为空则就是删除)
l = [1,2,3,4,5]
l[:-1] = []
print(l)