面试专题几个概念(上)

1、GIL

python当中的多线程是假的多线程?对这句话怎么理解?这个问题的本质问的就是GIL。

GIL,全局解释器锁,在Cpython中,同一时刻只可以有一个线程执行字节码。

其解决了多线程下的数据访问安全,但是也使得多线程无法充分发挥多核的性能

比如:写个死循环代码,查看cpu使用率。大家想一下,会是什么样子的结果?

解决:

1、IO密集型的任务可以使用多线程

2、cpu密集型的任务应当使用多进程(多进程可以充分使用cpu的性能)

3、使用C扩展可以绕过GIL

4、使用非C语言的python没有GIL 

https://docs.python.org/3.8/library/threading.html#lock-objects

2、python中常用的数据结构有哪些?

1、数字(整数、浮点)w

 2、字符串 字节

3、列表 元组

4、字典 集合-----可哈希 不可哈希的

5、其他:布尔值 、None、datetime、各种类

一切皆对象,所有的变量和数据都是某个类的实例

ps:这个问题很常见,面试也很容易被问,我被问到过几次。但是1-4很多人都很容易的回答出来,把第5点给忽略了。以后要注意。不要只是为了面试背诵几个题目,要深入理解这门语言,然后为自己所用。

3、函数中可否定义函数

可以

函数A中的函数B,其变量访问顺序为函数B---函数A---全局变量--内置变量

LEGB

字母 英语 释义 简称 作用空间
L Local(function) 当前函数内的作用域 局部作用域 局部
E Enclosing Functions Locals 外部嵌套函数的作用域 嵌套作用域 局部
G Global(module) 函数外部所在的命名空间 全局作用域 全局
B Built In(python) Python内置模块的命名空间 内建作用域 内置

E 闭包作用变量会导致内存泄漏的问题,代码举例子:

class A:
    def __init__(self):
        print("我被创建了")

    def __del__(self):
        print("我被销毁了")


def a():
    s = A()
    # E闭包中的变量

    def b():

        return s

    return b()


_ = a()
import pdb

pdb.set_trace()

运行结果:

D:\zl\Scripts\python.exe D:/cy/zl/gg.py
我被创建了
--Return--
> d:\zl\gg.py(24)<module>()->None
-> pdb.set_trace()
(Pdb) 

对象只被创建 ,没销毁,内存没回收。

4、*args **kwargs 分别代表什么意思

*args不定长位置参数,args是一个元组

**kwargs不定长关键字参数,kwargs是一个字典

扩展:

l = [1, 2, 3, 4]
a, b, c, d = l  # 解包
def f():
    return 1, 2, 3, 4
a, b, *c = f()# 解包
def ff(*args, **kwargs):
    kwargs["c"] = "zz"
    print(args)  # 普通元组
    print(kwargs)  # 普通字典


ff(a=1, c=3)

上面这段代码,问题:

关键字c的value能够被修改成功吗?期待大家回答,可以自行尝试

def ff(*args, **kwargs):
    kwargs["c"] = "zz"
    print(args)  # 普通元组
    print(kwargs)  # 普通字典


a = ("2", "3")
b = dict(a=1, d=3)

上面这段代码,调用ff()函数的时候,里面的a,b如何放置,是ff(a,b)吗?留下你们的答案

5、定义函数的时候,使用list作为默认参数会有什么问题?

默认参数只在函数定义被赋值一次,并不会重新赋值或者自动清空

后续每次调用函数使用默认参数时,使用的都是同一个列表,对列表的操作会被保留

def f(l=[]):  # 参数在定义的时候创建
    # 局部变量在执行的时候创建
    l.append(1)
    return l


f()
f()
l = f()
print(l)

打印结果是什么?自行尝试奥

# 代码做修改
def f():  # 参数在定义的时候创建
    # 局部变量在执行的时候创建
    l = []
    l.append(1)
    return l


f()
f()
l = f()
print(l)

打印结果又是什么?自行尝试奥

总结:

函数的参数默认值应该是不可变对象,比如字符串

不然被其他的人看到你写的这样子的代码,会被骂死奥

写在最后:今天就先搞5个题目玩玩吧,自己多动手写代码是王道啊

おすすめ

転載: blog.csdn.net/weixin_38249775/article/details/121885030