python后端基础语法面试题

1.如何提高python的运行效率?

使用生成器;关键代码使用外部功能包,针对循环的优化-尽量避免在循环中访问变量的属性。

 

2.常见的linux命令?

cd,pwd,touch,ls,mkdir,rm,help,sudo,ssh,date,clear

 

3.python中yield的用法?

yield简单来说是一个生成器,这样函数记住上次返回时在函数中的位置,对于生成器第二次或n次调用跳转至该函数。

 

4.python中如何进行内存管理的?

一.垃圾回收
二.引用技术:当某标签引用技术为0的时候,就该对象就会被收回

三.内存池机制

 

5.描述数组,链表,队列,堆栈的区别?

数组和链表是存储方式的概念,数组在连续的空间中存储数据,链表在非连续的空间中存储数据;

队列和堆栈是描述数据存取方法的概念,队列是先进先出,而堆栈是后进后出,队列和堆栈可以用链表来实现,也可以用数组来实现。

 

6.如何一行代码实现0-100和?

sum(range(0,101))

 

7.列出5个python标准库?

os:提供不少于操作系统相关联的函数

sys:通常用于命令行参数

datetime:日期时间

re:正则匹配

math:数学运算

 

8.字典是如何删除键和合并两个字典?

dict1 = {“name”:“banzhang”,"age":18}

del.dict1["name"]

dict2={"sex":"男"}

dict1.update(dict2)

 

9.谈一下python中的GIL?

这里的GIL锁主要是针对计算密集型任务。

GIL是python中的全局解释器锁,是不可控的,同一个进程中,假如有多个线程在运行,那么其中一个线程在运行的时候就会霸占GIL锁,就使得其他线程无法运行,等该线程运行结束以后,其他线程才能运行。如果线程中遇到耗时操作(I/O密集型任务),则解释器锁会解开,使得其他线程运行,所以说在多线程中,线程的运行仍是有先后顺序的,并不是同时进行.

什么时候释放GIL锁?

1.时间片耗尽(cpu时间)

2..任务遇到I/O等待时

3.执行任务结束

4.执行到字节码阈值时(,欧仁100条)

如何改善GIL锁对程序的影响?

1.升级python解释器(变化较小)

2.更换python解释器(因为python解释器的库比较全面,如果更换就没有这么强大的库使用,所以也没有什么实际作用)

3.使用进程+协程的方法(因为子进程会复制一份主进程的资源,包括GIL,所以每个进程都会有一个GIL,而利用协程是因为只需要一个线程,一个线程就不会产生资源竞争的问题)

 

9.谈一下GIL锁和互斥锁的区别?

GIL是全局解释器锁,是解释器层面的,不可控的。

互斥锁是代码层面的锁,是可控的。

不管互斥锁和GIL锁都是解决共享变量的资源竞争的问题。

 

10.python2和python3的区别?

1.语法区别

1.1 python2输出  print “hello word”,python3输出 print("hello word")

1.2 python2和python3的range(100)的区别,python2返回列表,python3返回一个迭代器节约内存。

2.python2中为正常显示中文,引入coding声明,python3中不需要。

 

11.什么是装饰器?应用场景?

装饰器的特点是返回值和参数都是函数

装饰器的目的就是已封装函数进行操作,为其加上新的功能或一系列运算。

在flask中获取用户的登录使用的就是装饰器

在django中middkeware中间件 其实就是高级的装饰器用法。

 

12.生成器、迭代器和可迭代对象区别和应用?

能使用for遍历的就叫可迭代对象,能使用next方法的就是迭代器,生成器是特殊的迭代器。

 

13.Python中数组有哪些类型?字典可以是有序的吗?

字典其实是个无序的序列,但是我们可以按照字典的键或值进行排序

 

14.python⾃带的处理字符串的⽅法,内置函数。⽐如怎么处理换⾏符。

Python中自带了换行符,如果想要处理:

比如:

print(“hello word”,end=””)

print(“hello word”)

显示效果:hello wordhello word

 

15.Python中的可变类型与不可变类型

什么是可变、不可变?元组⾥添加字典,会改变id吗?

可变类型:会在原来的内存地址上修改元素  比如: 列表,字典

不可变类型:不会在原来的内存地址上修改元素,而是指向了新的内存引用  比如:整型,字符串,元组

 

元组中添加字典,会改变id。

因为元组是不可变类型,如果修改了元组的元素,就相当于重新创建了一个元组。所以元组的id会改变

 

 

16.break和continue的区别(分别说说他们的作⽤和使⽤)

 

break和continue都是用于while嵌套循环中

 

Continue是结束内层的while循环,continue语句并没有使整个循环终止

 

Break是结束整个while循环

 

17.对不定⻓参数的理解?

 

一般分为两种:

 

一种是*args 位置参数 在定义函数时,在形参前面加一个*,代表可以接收任意多个实参,用元组类型保存所有数据。一般写成def function(*args)

 

一种是**kwargs 命名参数 代表可以接收任意多个的命名参数,用字典类型保存。

 

 

 

18.对缺省参数的理解?

 

如果调用函数的时候,传递了对应位置的实参,那就使用这个传递的值,如果没有传递对应的值,那就使用缺省参数的值。

 

 

 

19.什么是lambda函数?它有什么好处?写⼀个匿名函数求两个数的和。

 

匿名函数,

 

Func = Lambda a,b : a + b

 

Func(10,20)

 

 

 

20.read、readline和readlines的区别

 

Read 是读取整个文件

 

Read(5) 读取文件中几个字节

 

Readline是读取一行

 

Readlines 按行读取所有内容,返回的是一个列表,每一个元素就是文件中每一行的内容

 

21.上下⽂管理器了解吗

 

上下文管理器 with

 

有两个方法 一个是enter 一个是exit

 

Enter 主要是负责上下文的准备工作,一般是 打开文件,准备环境

 

Exit 主要是负责善后工作 比如关闭文件,一些回收机制

 

上一篇:Python zipfile在写入时会挂起


下一篇:用Python解压缩缓冲区?