在这篇文章中,我们将归纳一些面试中常见的python基础知识:
python中的深浅拷贝
浅拷贝:数据半共享(复制其数据独立内存存放,但只针对第一层数据)
l1 = [1,2,3,[11,22,33]]
l2 = l1.copy() # 浅拷贝,只拷贝第一层
print(l2) #[1,2,3,[11,22,33]]
l2[3][2]='aaa' # 数据中的第二层是共享内存的
print(l1) #[1, 2, 3, [11, 22, 'aaa']]
print(l2) #[1, 2, 3, [11, 22, 'aaa']]
l1[0]= 0 # 数据中的第一层是相互独立的,修改时互不影响
print(l1) #[0, 2, 3, [11, 22, 'aaa']]
print(l2) #[1, 2, 3, [11, 22, 'aaa']]
print(id(l1)==id(l2)) #Flase
深拷贝:数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享)
import copy
l1 = [1, 2, 3, [11, 22, 33]]
l2 = copy.deepcopy(l1) # 深拷贝
print(l1,'>>>',l2)
l2[3][0] = 1111
print(l1,">>>",l2) # 深拷贝就是彻底地复制了一份全新的变量,它们数据不会互相影响,因为内存不共享
获取变量地址:
id(object)
切片及切片赋值
a = [1, 2, 3]
b = a[:] # 切片
a[1:] = [] # 切片赋值
- 切片是浅拷贝,不影响原序列;
- 切片赋值是针对原序列进行操作,改变切片区域的序列。
交换变量,要求不使用临时变量
# 方法1:
x,y = y,x
# 方法2:
x = x + y
y = x - y
x = x - y
python装饰器中,@property一般用来做啥?
- 使用场景:
- 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,存在安全性隐患。
- 如果用set和get方法,虽然可以检查参数,但用起来比较麻烦。
- 功能:@property装饰器可以把一个方法变成属性,使它既能像属性一样操作,同时又具备set和get的安全性保护:
class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
@property修饰的变量可以通过只定义getter方法,不定义setter方法,实现只读属性
python中的with语句
-
有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄
-
with的工作方式:
- with所求值的对象必须有一个__enter__()方法,一个__exit__()方法
- 紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法
-
with真正强大之处是它可以处理异常:注意到__exit__方法有三个参数- val, type 和 trace。当异常抛出时,与之关联的type,value和stack trace传给__exit__()方法
Python 中复数的表示方法
- 表示复数的语法是
real + image j
- Python中复数的实部与虚部均为浮点数
- 虚部的后缀可以是 “j” 或者 “J”
- 复数的 conjugate 方法可以返回该复数的共轭复数
- 官方文档:Python3 Numeric Types