【归纳】面试中常见的python基础知识

在这篇文章中,我们将归纳一些面试中常见的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__()方法

猜你喜欢

转载自www.cnblogs.com/lokvahkoor/p/11056361.html