面试之python基础(一)

基础

1. 实例方法(instance method),类方法(class method)与静态方法(static method)区别

  • 实例方法是类实例后的带self参数的普通方法。类方法和静态方法都是通过函数装饰器的方式实现的;类方法需要传入cls参数,静态方法无需传入self参数或者是cls参数(但不等同于不能传入参数) 调用实例方法时,self指向实例对象。
  • 类方法是以cls 为参数的方法,使用装饰器classmethod,调用类方法,类方法可以通过类对象或者实例对象调用。如果是通过实例对象调用的,那么实例对象会被忽略,而是转而通过其类对象进行调用。类对象,会以参数形式传给类方法(点语法),作为类方法的第一个参数,也就是cls参数。
  • 当通过类对象调用静态方法时,这里的结果与通过实例对象调用是完全一样的。通过实例对象调用静态方法时,实例对象也会被忽略,而是通过其类对象进行调用,这一点与类方法的调用是一样的。
  • 类方法调用无需创建实例,所以比较灵活,为了修改类内部的一些数据。
  • 静态方法类似类的工具,通过类对象或者实例对象调用,被束缚在类对象中,将相关处理逻辑束缚在对象体内,便于维护与测试,会更好。

2. python copy and deepcode

copy 是引用拷贝,指重新分配一个内存,创建新对象,元素是原对象的各个子对象的引用,若子对象不可变没有影响,若为set,dict,list 则会出现一些问题,深拷贝是全对象拷贝,分配内存,创建新对象,将原对象的元素以递归的形式拷贝到新对象中,因此新对象跟原对象没有任何关联了。

3. 进程、线程、协程。

  • 进程是资源分配的最小单位。单核cpu可以实现多进程,只不过是并发的形式,在任意时间点上只有一个程序在cpu上运行。进程拥有自己的地址空间、全局变量等各种资源。操作系统通过调度cpu执行进程的记录,回复、切换。并行时多核cpu多进程运行。
  • 线程是程序执行过程中最小单元。一个进程可以有多个线程,线程共享大部分资源,并参与cpu等调度,由于线程与线程之间某些资源是独占的,所以会导致锁的问题,例如GIL。(gil是一种互斥锁,cpython是基于栈的解释器来运行字节码,在cpython中抢夺线程资源时,会破坏解释器的状态,类似引用计算)不同线程中访问同一个对象,也是需要加锁的,不然还是会被破坏。
  • 协程 ,又称微线程,协程是用户态的轻量级线程。协程是函数控制的,协程拥有自己的上下文和栈,协程切换调度的时候,将上下文跟栈保存在其他地方,到切换回来的时候,恢复先前保存的寄存器的上下文和栈。协程能保持上一次调用的状态,每次重载之后接着处理上一次离开时的逻辑。避免线程切换,开销小。无需原子操作锁定以及同步的开销,内存占用小。方便切换、并且可控。

4. sorted vs list.sort

  • sorted 是复制iterable 可迭代对象,然后进行排序,所以会返回参数
  • list.sort 是在原来对象上操作排序,不需要接受返回参数。
  • sort 通过 key的关键词来排序,key可接受单个对象或者tuple

5. is vs id vs ==

  • id 是生命周期内对象的可代表内存值。
  • is 是比较对象是否引用对象是否一致,类似内存是否指向同一个位置,,取这个对象的全部内容进行比较,不只是id。例如内置的_ _ hash _ _方法。
  • == 只是对比值是否一样。_ _ eq _ _

6. map vs reduce vs filter

  • map(function,*sequence) 将迭代内容的元素作为一个个轮训参数传入函数进行调用, 返回迭代器。
  • reduce(function,*sequence) 将迭代内容的参数,依次传入,汇总结果,返回单个对象/结果。
  • filter(function,*sequence) 参考map,返回迭代器。将里面的元素进行筛选。

7. 单例

  • 装饰器实现
  • 类实现
def singleton(cls):
  _instance={}
  def inner():
    if cls not in _instance:
      _instance[cls]=cls()
    return  _instance[cls]
  return inner
class Singleton:
  def __new__(cls,*arg,*kw):
     if not hasattr(cls, '_instance'):
        cls._instance=super(Singleton,cls).__new__(cls,*arg,*kw)
     return cls._instance
class Singleton:
  def __init__(self,cls):
    self.cls=cls
    self._instance={}
    
  def __call__(self,*arg,*kw):
    if self.cls not in  self._instance:
      self._instance[self.cls]=self.cls
    return self._instance[self.cls]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值