非常全面的Python常见基础面试题及答案

目录
  • Python
    • 1 Python垃圾回收机制是什么
    • 2 元组和列表的区别
    • 3 元组可以作为字典的key?
    • 4 进程 线程 协程
      • 4.1 进程
      • 4.2 线程
      • 4.3 协程
    • 5 赋值、浅拷贝和深拷贝
    • 6 GIL
    • 7 列表去重
    • 8 最常用的排序算法及其复杂度
      • 8.1 冒泡排序
    • 9 闭包
    • 10 with
    • 11 实例方法 静态方法
    • 12 迭代器和生成器
    • 12.1 迭代器
      • 12.2 生成器
    • 13 匿名函数
    • 14 map reduce filter
      • 14.1 map
      • 14.2 reduce
      • 14.3 filter
  • Django
    • 1 什么是wsgi
    • 2 django请求的生命周期
    • 3 列举django的内置组件
    • 4 列举django中间件的5个方法?以及django中间件的应用场景
    • 5 简述什么是FBV和CBV
    • 6 django的request对象是在什么时候创建的
    • 7 如何在CBV添加装饰器
      • 7.1 方法
      • 7.2 dispatch
      • 7.3 类
    • 8 列举django orm 中所有的方法
    • 9 select_related 和 prefetch_related的区别
    • 10 django 中 csrf 的实现机制
    • 11 django中如何实现orm表中添加数据时创建一条日志记录
    • 12 django缓存如何设置
    • 13 django的缓存能使用redis吗?如果可以的话,如何配置
    • 14 django路由系统中name的作用
    • 15 django rest framework框架中都有那些组件
    • 16 简述 django rest framework框架的认证流程
  • 总结

Python

1 Python垃圾回收机制是什么

作为Python的使用者来说,Python中的垃圾回收主要以引用计数为主,再引入标记、清除,分代为辅来解决循环引用的问题。

一个对象被引用时,引用计数加1,当对象被del时,引用计数减去1,为0时,对象就被清除,一般情况下用户不会去操作Python 的垃圾回收机制,但它留有API接口。

2 元组和列表的区别

主要区别是列表是可变的,而元组是不可变的。

>>> mylist=[1,3,3]
>>> mylist[1]=2

>>> mytuple=(1,3,3)
>>> mytuple[1]=2
Traceback (most recent call last):
File "<pyshell#97>", line 1, in <module>

3 元组可以作为字典的key?

首先一个对象能不能作为字典的key, 就取决于其有没有__hash__方法。 所以除了容器对象(list/dict/set)和内部包含容器对象的tuple 是不可作为字典的key, 其他的对象都可以。

4 进程 线程 协程

4.1 进程

1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立

2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制

4.2 线程

1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源

2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃

4.3 协程

1、子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

2、协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。

5 赋值、浅拷贝和深拷贝

深拷贝就是将一个对象拷贝到另一个对象中,这意味着如果你对一个对象的拷贝做出改变时,不会影响原对象。在Python中,我们使用函数deepcopy()执行深拷贝

浅拷贝则是将一个对象的引用拷贝到另一个对象上,所以如果我们在拷贝中改动,会影响到原对象

6 GIL

GIL是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。

多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大

7 列表去重

先通过转换为集合去重,在转列表

8 最常用的排序算法及其复杂度

8.1 冒泡排序

外层循环从1到n-1,内循环从当前外层的元素的下一个位置开始,依次和外层的元素比较,出现逆序就交换,通过与相邻元素的比较和交换来把小的数交换到最前面。

def bubbleSort(array):
    if len(array) < 2:
        return array
    else:
        isSorted = False
        counter = 0
        while not isSorted:
            isSorted = True
            for idx in range(len(array) - 1 - counter):
                if array[idx] > array[idx + 1]:
                    isSorted = False
                    (array[idx + 1], array[idx]) = (array[idx], array[idx + 1])
            counter += 1
        return array

8.3 快速排序

通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

1、选定Pivot中心轴

2、从R指针开始,将大于Pivot的数字放在Pivot的右边

3、将小于Pivot的数字放在Pivot的左边

4、分别对左右子序列重复前三步操作

def quickSort(array):
    print(array)
    if len(array) < 2:
        return array
    else:
        pivot_index = 0
        pivot = array[pivot_index]
        less_part = [i for i in array[pivot_index+1:] if i <= pivot]
        large_part = [i for i in array[pivot_index+1:] if i > pivot]
        return quickSort(less_part) + [pivot] + quickSort(large_part)

9 闭包

函数的返回值是函数对象,只有外部函数才可以对他进行访问,提高了安全性

10 with

with语句的使用,可以简化了代码,有效避免资源泄露的发生

打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open

写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close

11 实例方法 静态方法

实例方法只能被实例调用,静态方法(@由staticmethod装饰器的方法)、类方法(由@classmethod装饰器的方法),可以被类或类的实例对象调用。

1、实例方法,第一个参数必须要默认传递实例对象,一般使用self。

2、静态方法,参数没有必要。

3、类方法,第一个参数必须要默认传递,一般使用cls。

12 迭代器和生成器

12.1 迭代器

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

字符串,列表或元组对象都可用于创建迭代器:

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>

12.2 生成器

使用了yield的函数被称为生成器

生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行

13 匿名函数

print [(lambda x:x*x)(x)for x in range(5)]
[0, 1, 4, 9, 16, 25]

14 map reduce filter

14.1 map

对可迭代对象中的每个元素进行相同的操作

def fn(x):
    return x+1

resp = map(fn,li)
print(list(resp))

[2, 3, 4]

14.2 reduce

从左到右对一个序列的项累计地应用有两个参数的函数,以此合并序列到一个单一值。(例如累加或累乘列表元素等等)

from functools import reduce
nums=[1, 2, 3, 4]
def fn(x, y):
    return x * y

resp = reduce(fn, nums)
print(resp)

24

14.3 filter

filter函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数: 第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def fn(a):
    return a%2 == 1

newlist = filter(fn, a)
newlist = [i for i in newlist]
print(newlist)
## 输出: [1, 3, 5, 7, 9]

Django

1 什么是wsgi

Python Web Server Gateway Interface,翻译过来是Python web服务器网关接口,实际上就是一种协议,我们的应用(Django,Flask)实现了WSGI,就可以配合实现了WSGI(uWSGI,gunicorn)的服务器工作了

2 django请求的生命周期

  • 前端发送请求
  • wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask、Django)
  • 中间件处理请求,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session
  • 路由匹配,根据当前请求的URL找到视图函数,如果是FBV写法,通过判断method两类型,找到对应的视图函数;如果是CBV写法,匹配成功后会自动去找dispatch方法,然后Django会通过dispatch反射的方式找到类中对应的方法并执行
  • 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、view视图将数据渲染到template模板
  • 视图函数执行完毕之后,会把客户端想要的数据返回给dispatch方法,由dispatch方法把数据返回经客户端
  • 中间件处理响应
  • wsgi,将响应的内容发送给浏览器
  • 浏览器渲染

3 列举django的内置组件

  • Admin: 对model中对应的数据表进行增删改查提供的组件
  • model:负责操作数据库
  • form:1.生成HTML代码 2.数据有效性校验 3校验信息返回并展示
  • ModelForm: 即用于数据库操作,也可用于用户请求的验证

4 列举django中间件的5个方法?以及django中间件的应用场景

  • process_request : 请求进来时,权限认证
  • process_view : 路由匹配之后,能够得到视图函数
  • process_exception : 异常时执行
  • process_template_responseprocess : 模板渲染时执行
  • process_response : 请求有响应时执行

5 简述什么是FBV和CBV

FBV和CBV本质是一样的,基于函数的视图叫做FBV,基于类的视图叫做CBV

在python中使用CBV的优点:

  • 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
  • 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

6 django的request对象是在什么时候创建的

class WSGIHandler(base.BaseHandler):
    request = self.request_class(environ)

请求走到WSGIHandler类的时候,执行cell方法,将environ封装成了request

7 如何在CBV添加装饰器

7.1 方法

from django.utils.decorators import method_decorator

@method_decorator(check_login)
def post(self, request):
...

7.2 dispatch

@method_decorator(check_login)
def dispatch(self, request, *args, **kwargs):

7.3 类

@method_decorator(check_login, name="get")
@method_decorator(check_login, name="post")
class HomeView(View):
...

8 列举django orm 中所有的方法

<1> all():                  查询所有结果
  <2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象。获取不到返回None
  <3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个。
                              如果符合筛选条件的对象超过一个或者没有都会抛出错误。
  <4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
  <5> order_by(*field):       对查询结果排序
  <6> reverse():              对查询结果反向排序
  <8> count():                返回数据库中匹配查询(QuerySet)的对象数量。
  <9> first():                返回第一条记录
  <10> last():                返回最后一条记录
  <11> exists():              如果QuerySet包含数据,就返回True,否则返回False
  <12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的
                              并不是一系 model的实例化对象,而是一个可迭代的字典序列
  <13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
  <14> distinct():            从返回结果中剔除重复纪录

9 select_related 和 prefetch_related的区别

有外键存在时,可以很好的减少数据库请求的次数,提高性能

select_related 通过多表 join 关联查询, 一次性获得所有数据, 只执行一次SQL查询

prefetch_related 分别查询每个表, 然后根据它们之间的关系进行处理, 执行两次查询

10 django 中 csrf 的实现机制

第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页面;

第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起传给后端;Cookies:{csrftoken:xxxxx}

第三步:后端校验前端请求带过来的token和SESSION里的token是否一致。

11 django中如何实现orm表中添加数据时创建一条日志记录

# 使用Django的信号机制,可以在添加、删除数据前后设置日志记录:
pre_init    # Django中的model对象执行其构造方法前,自动触发
post_init   # Django中的model对象执行其构造方法后,自动触发
pre_save    # Django中的model对象保存前,自动触发
post_save   # Django中的model对象保存后,自动触发
pre_delete  # Django中的model对象删除前,自动触发
post_delete # Django中的model对象删除后,自动触发

# 使用
@receiver(post_save, sender=Myclass)       # 信号接收装饰器。由于内置信号,所以直接接收
def signal_handler(sender, **kwargs):      # 接收到信号后,在此处理
   logger = logging.getLogger()
    logger.success('保存成功')

12 django缓存如何设置

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.dummy.DummyCache',  # 缓存后台使用的引擎
  'TIMEOUT': 300,            # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)
  'OPTIONS':{
   'MAX_ENTRIES': 300,          # 最大缓存记录的数量(默认300)
   'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  },
 }
}

13 django的缓存能使用redis吗?如果可以的话,如何配置

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            # "PASSWORD": "密码",
        }
    }
}

14 django路由系统中name的作用

主要是通过name的值,来查找url地址,可以理解为反射作用。在html模板中使用name来反射url优势就是后期url规则发生改变之后,只需调整urls.py即可,所有的模板文件都不需要修改。

15 django rest framework框架中都有那些组件

  • 认证
  • 权限(授权)
  • 用户访问次数/频率限制
  • 版本
  • 解析器(parser)
  • 序列化
  • 分页
  • 路由系统
  • 视图
  • 渲染器

16 简述 django rest framework框架的认证流程

  • 当用户进行登录的时候,运行了登录类的as_view()方法,进入了APIView类的dispatch方法
  • 执行self.initialize_request这个方法,里面封装了request和认证对象列表等其他参数
  • 执行self.initial方法中的self.perform_authentication,里面运行了user方法
  • 再执行了user方法里面的self._authenticate()方法

总结

到此这篇关于Python常见基础面试题及答案的文章就介绍到这了,更多相关Python基础面试题内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入解答关于Python的11道基本面试题

    前言 本文给大家深入的解答了关于Python的11道基本面试题,通过这些面试题大家能对python进一步的了解和学习,下面话不多说,来看看详细的介绍吧. 一.单引号,双引号,三引号的区别 分别阐述3种引号用的场景和区别 1),单引号和双引号主要用来表示字符串 比如: 单引号:'python' 双引号:"python" 2).三引号 三单引号:'''python ''',也可以表示字符串一般用来输入多行文本,或者用于大段的注释 三双引号:"""python&

  • Python程序员面试题 你必须提前准备!(答案及解析)

    在发布<Python程序员面试,这些问题你必须提前准备!>一文后,应广大程序员朋友的强烈要求,小编就Python程序员面试必备问题整理了一份参考答案,希望能对准备换工作的程序员朋友有所帮助.如对答案有疑问,欢迎留言讨论. 小编将这些面试问题大致分为四类: 什么(what)?如何做(how)?说区别/谈优势(difference)以及实践操作(practice). What? 1. 什么是Python? Python是一种编程语言,它有对象.模块.线程.异常处理和自动内存管理.可以加入与其他语言

  • 分享几道你可能遇到的python面试题

    本文主要给大家介绍的是关于最近在面试中遇到的几个python面试题,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 一.生成斐波那契数列并取前10项 def func(m): n,a,b = 0,1,1 while n < m: yield a a,b = b,a+b n += 1 for one in func(10): print one 这个可以说是一道常见的简单算法题了,关键点就是理解a,b=b,a+b以及yield的作用. 二.扩展一个列表,列表中的元素可能也包含列表 d

  • python正则表达式面试题解答

    三道python正则表达式面试题,具体如下 1.去除以下html文件中的标签,只显示文本信息. <div> <p>岗位职责:</p> <p>完成推荐算法.数据统计.接口.后台等服务器端相关工作</p> <p><br></p> <p>必备要求:</p> <p>良好的自我驱动力和职业素养,工作积极主动.结果导向</p> <p> <br><

  • Python 经典面试题 21 道【不可错过】

    到底什么是Python? •Python是一种解释性语言.Python代码在运行之前不需要编译.其它解释性语言还包括PHP和Ruby. •Python是动态类型语言,指的是在声明变量时,不需要说明变量的类型. •Python非常适合面向对象的编程(OOP),因为它支持通过组合(composition)与继承(inheritance)的方式定义类(class). •Python中没有访问说明符(类似C++中的public和private),这么设计的依据是"大家都是成年人了". 对pyt

  • Python工程师面试题 与Python Web相关

    本文为大家分享的Python工程师面试题主要与Python Web相关,供大家参考,具体内容如下 1.解释一下 WSGI 和 FastCGI 的关系? CGI全称是"公共网关接口"(CommonGateway Interface),HTTP服务器与你的或其它机器上的程序进行"交谈"的一种工具,其程序须运行在网络服务器上. CGI可以用任何一种语言编写,只要这种语言具有标准输入.输出和环境变量.如php,perl,tcl等. FastCGI像是一个常驻(long-li

  • Python自动化测试笔试面试题精选

    前言 随着行业的发展,编程能力逐渐成为软件测试从业人员的一项基本能力.因此在笔试和面试中常常会有一定量的编码题,主要考察以下几点. 基本编码能力及思维逻辑 基本数据结构(顺序表.链表.队列.栈.二叉树) 基本算法(排序.查找.递归)及时间复杂度 除基本算法之外,笔试面试中经常会考察以下三种思想: 哈希 递归 分治 哈希 哈希即Python中的映射类型,字典和集合,键值唯一,查找效率高,序列(列表.元祖.字符串)的元素查找时间复杂度是O(n),而字典和集合的查找只需要O(1). 因此哈希在列表问题

  • 5个很好的Python面试题问题答案及分析

    本文的主要内容是向大家分享几个Python面试中的T题目,同时给出了答案并对其进行分析,具体如下. 本文的原文是5 Great Python Interview Questions,同时谢谢 @非乌龟 指出我的疏漏,没有来源标记,也赞其细心,希望看文章的同时大家都能看下原文,因为每个人的理解不一致,原汁原味的最有帮助,我翻译很多文章的目的一是为了自己以后找资料方便:二是作为一个索引,以后再看原文的时候,能更加快捷.其目的还是希望大家能看原文的. 问题一:以下的代码的输出将是什么? 说出你的答案并

  • 搞定这套Python爬虫面试题(面试会so easy)

    先来一份完整的爬虫工程师面试考点: 一. Python 基本功 1.简述Python 的特点和优点 Python 是一门开源的解释性语言,相比 Java C++ 等语言,Python 具有动态特性,非常灵活. 2.Python 有哪些数据类型? Python 有 6 种内置的数据类型,其中不可变数据类型是Number(数字), String(字符串), Tuple(元组),可变数据类型是 List(列表),Dict(字典),Set(集合). 3.列表和元组的区别 列表和元组都是可迭代对象,能够对

  • 值得收藏的10道python 面试题

    Q1:PEP8是什么?Python之禅(import this)是什么? 这题是考察你对编码规范的认识,无论是自己写代码还是在团队中写代码,了解并遵循代码规范是很基础的要求.企业中在提交代码后都会有对应的工具来对代码进行检查,比如 pep8.flake8.pylint 等,但是 PEP 8 是什么一定要了解. 即 Style Guide for Python Code(Python编码风格指南).如果面试时不知道什么是 PEP 8 ,那聊起来想必不会很愉快.速战速决的面试,如果不是你把面试官"秒

随机推荐