Python面试

  1. Python中万物皆对象,对象有可变(mutable)与不可变(immutable)对象

在python中,strings,tuples,和numbers是不可变的对象,而 list,dict,set 等则是可变的对象可变对象在修改的时候只修改对象本身,不可变对象在修改时候会重新新建一个新的对象,将修改后的值传递给它

当一个引用传递给函数的时候,函数自动复制一份引用,这个函数里的引用和外边的引用没有半毛关系了而在参数传递的时候变量都是通过传递对象的引用(指针),如果在域内修改不可变对象,将会创建新的对象,Python中没有块变量域

  1. 元类(metaclass)

type()函数既可以返回一个对象的类型,又可以创建出新的类型

class Hello(object):
    def hello(self,name='world'):
        print('Hello,%s.' % name)


type(Hello)  # <class 'type'>
type('Hello',(object,),dict(hello=fn))  # 动态创建类

除了使用type()动态创建类以外,要控制类的创建行为,还可以使用metaclass,metaclass的类名总是以Metaclass结尾,以便清楚地表示这是一个metaclass:

# metaclass是类的模板,所以必须从`type`类型派生:
class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
        attrs['add'] = lambda self, value: self.append(value)
        return type.__new__(cls, name, bases, attrs)


# 定义类的时候还要指示使用ListMetaclass来定制类,传入关键字参数metaclass
class MyList(list, metaclass=ListMetaclass):
    pass
  1. @staticmethod,@classmethod,@property,@abstractmethod
def foo(x):
    print(f"{x}")


class A(object):
    # __slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的
    # 除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__
    __slots__ = ('name', 'var_of_instance', '_age')  # 限制实例属性
    var_of_class = 1  # 类属性

    def __init__(self, name):
        self.name = name
        self.var_of_instance = 0
        self._age = 0

    def foo(self, x):
        print(f"{self} -> {x}")

    @classmethod
    def class_foo(cls, x):
        print(f"{cls} ->{x}")

    @staticmethod
    def static_foo(x):
        print(f"{x}")

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        self._age = age


foo(10)
a = A("han")
print(f"{a} -> {a.var_of_class} -> {a.var_of_instance}")
print(f"{a.__class__} -> {A.var_of_class} -> {a.__class__.var_of_class}")

# 实例方法需要绑定对应的实例,可通过实例调用,或者函数中传入实例
a.foo(123)  # 123
# A.foo(123)  # TypeError: foo() missing 1 required positional argument: 'x'
A.foo(a, 456)  # 456
A.foo(A, 789)  # 789
# 类方法是绑定到类的
A.class_foo(123)  # 123
a.class_foo(456)  # 456
# 静态方法就和普通方法一样,只不过是放在类中,方便使用
A.static_foo(456)  # 123
a.static_foo(456)  # 456

# 可以给类动态添加属性,但是无法对实例添加slots之外属性,会报错
A.pk = 10
print(A.pk)  # 10
# a.bk = 10  # AttributeError: 'A' object has no attribute 'bk'

# 通过@property可以为实例添加属性
print(a.age)
a.age = 10
print(a.age)


# python中抽象函数
from abc import ABC, abstractmethod


class A(ABC):
    @abstractmethod
    def abstract_method(self):
        """ 在子类中实现该方法,才可以实例化 """


class SubA(A):
    def abstract_method(self):
        print("必须实现abstract method才可以实例化")


# a = A()  # TypeError: Can't instantiate abstract class A with abstract methods abstract_method
b = SubA()
  1. 生成器,迭代器
# Iterable 可迭代对象,可以使用for...in...都是可迭代对象
li = [x*x for x in range(10)]  # 列表生成器一次性将所有元素读入到内存中
# Generators 迭代器,每次只能迭代一次,不会将所有值存储在内存中,它们会动态生成值
ge = (x*x for x in range(10))  # 由于生成器只能使用一次,读完就会删掉
def gn():
    for i in range(3):
        n = yield i*i  # 使用yield生成器
        print(n)
g = gn()  # 调用的时候不会执行函数体,而是返回生成器对象
for i in g:  # 用for可以执行函数,但是每次执行回到yield返回
    print(i)
print("============")
g = gn()
print(next(g))  # 生成器可以使用next()函数执行
print(g.__next__())
print(next(g))
# print(next(g))  # StopIteration 最后一个迭代完在使用会报错
print("============")
g = gn()
print(g.send(None))  # 生成器也可以使用send()迭代,第一次参数必须是None
print(g.send(1))  # next(g)相当于g.send(None)
print(g.send(2))
# print(g.send(3))  # StopIteration 最后一个迭代完在使用会报错
  1. Python垃圾回收GC和全局锁GIL
  • 引用计数,当对象有新的引用就加一,删掉一个引用就减一,但是无法解决循环引用
  • 标记清除,遍历所有对象,可访问对象打上标记,释放掉没有标记的对象
  • 分代回收,存活时间越久垃圾收集频率越小,索引数越大,对象存活时间越长
import sys
l = []
a = l
r = []
b = r
r.append(l)
l.append(r)
print(sys.getrefcount(a))  # 4
print(sys.getrefcount(b))  # 4
del l
del r
print(sys.getrefcount(a))  # 3
print(sys.getrefcount(b))  # 3

Python的解释器必须做到既安全又高效. 我们都知道多线程编程会遇到的问题. 解释器要留意的是避免在不同的线程操作内部共享的数据. 同时它还要保证在管理用户线程时保证总是有最大化的计算资源.
那么,不同线程同时访问时,数据的保护机制是怎样的呢?答案是解释器全局锁. 从名字上看能告诉我们很多东西,很显然,这是一个加在解释器上的全局(从解释器的角度看)锁(从互斥或者类似角度看).
CPython的线程是操作系统的原生线程. 在Linux上为pthread,在Windows上为Win thread,完全由操作系统调度线程的执行. 一个Python解释器进程内有一个主线程,以及多个用户程序的执行线程. 即便使用多核心CPU平台,由于GIL的存在,也将禁止多线程的并行执行.
Python解释器进程内的多线程是以协作多任务方式执行. 当一个线程遇到I/O任务时,将释放GIL. 计算密集型(CPU-bound)的线程在执行大约100次解释器的计步(ticks)时,将释放GIL. 计步(ticks)可粗略看作Python虚拟机的指令. 计步实际上与时间片长度无关. 可以通过sys.setcheckinterval()设置计步长度.
在单核CPU上,数百次的间隔检查才会导致一次线程切换. 在多核CPU上,存在严重的线程颠簸(thrashing).
Python 3.2开始使用新的GIL. 新的GIL实现中用一个固定的超时时间来指示当前的线程放弃全局锁. 在当前线程保持这个锁,且其他线程请求这个锁时,当前线程就会在5毫秒后被强制释放该锁.
可以创建独立的进程来实现并行化. Python 2.6引进了多进程包multiprocessing. 或者将关键组件用C/C++编写为Python扩展,通过ctypes使Python程序直接调用C语言编译的动态链接库的导出函数.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 用于python面试整理,主要来源于http://www.cnblogs.com/skiler/p/6952707...
    十里江城阅读 2,324评论 0 13
  • 现在人普遍的矛盾是,道德与能力的矛盾。坚持道德可能往往能力底下,坚持能力可能有违背于心。 道德越高,越是无法为了目...
    心理元老阅读 427评论 0 0
  • 偶然听到一首歌 便会想到这首歌以前出现在KTV的曲目里 伴随着旋律 又会让我去想起微微发酵的啤酒味 和恋人嘴角的一...
    魏翾翾阅读 99评论 0 0
  • 一 这时天色已经彻底黑下来了,倪秋正感觉很疲惫。他刚才连走带跑了十几里路,先是拼命冲刺的跑,仿佛要逃脱这个不够友好...
    d96b0dfa4bdd阅读 232评论 2 1
  • 纳巴桑走了,现在的战队,就剩下山民和酷卡,他们俩个每天吃了睡,睡了吃,没有事情可干,回想之前,纳巴桑还在的时候,他...
    小丁_a4fc阅读 183评论 0 2