面试题-python/django/sql

https://github.com/the5fire/django-interview-questions

  1. Python基础
    基础语法是否熟悉?介绍下。
    一、标识符
    在 Python 里,标识符由字母、数字、下划线组成,但不能以数字开头。
    Python 中的标识符是区分大小写的。
    以下划线开头的标识符是有特殊意义的。以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入。
    以双下划线开头的 __foo 代表类的私有成员,以双下划线开头和结尾的 foo 代表 Python 里特殊方法专用的标识,如 init() 代表类的构造函数。
    二、保留字符(关键字)
    保留字不能用作常数或变数,或任何其他标识符名称。
    所有 Python 的关键字只包含小写字母。
    三、行和缩进
    python 最具特色的就是用缩进来写模块。缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行。
    Python语句中一般以新行作为语句的结束符,但是我们可以使用斜杠( \)将一行的语句分为多行显示。
    Python 可以使用引号( ’ )、双引号( " )、三引号( ‘’’ 或 “”" ) 来表示字符串,引号的开始与结束必须是相同类型的。其中三引号可以由多行组成,编写多行文本的快捷语法,常用于文档字符串,在文件的特定地点,被当做注释。单行注释用#开头,多行注释使用三个单引号(’’’)或三个双引号(""")。
    空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。空行也是程序代码的一部分。
    可以在同一行中使用多条语句,语句之间使用分号(;)分割。
    print 默认输出是换行的,如果要实现不换行需要在变量末尾加上逗号 ,。
    缩进相同的一组语句构成一个代码块,我们称之代码组。

有哪些关键字,并且解释其作用?
关键字

有哪些内置方法,并且解释其作用?
set\get\del
一、attr系列
setattr,getattr,delattr

二、item系列
__ setitem __ (self,key,value)、__ delitem __ (self,key)、getitem(self,item):当对类中的某个属性进行"赋值"、被删除、调用时触发的函数(只有使用字典赋值的方式时才会触发此方法的执行)
与Attr系列的区分: __ setattr __ (self)、__ delattr __ (self)、getattr(self):是在对象打点儿的方式赋值、删除、调用时,才会触发的方法

三、slots
slots:其实就是将类中的名称锁定,实例化对象,只可以赋值和调用,不可以删除属性和增加新的属性
应用场景:当实例化几万个对象的时候,每个对象都会生成一个名称空间dict,而每一个名称空间都会各自占用一个内存,造成内存的浪费,用 slots,不用再产生 dict 了,省内存,对象的 dict 都统一用类的 dict,属性都是用 slots 给定义的
四、其他
next 和 iter、del、str、enter和exit、doc、call
上下文管理协议,就是咱们打开文件时常用的一种方法:with
__ enter __ (self):当with开始运行的时候触发此方法的运行
__ exit __ (self, exc_type, exc_val, exc_tb):当with运行结束之后触发此方法的运行
exc_type如果抛出异常,这里获取异常的类型
exc_val如果抛出异常,这里显示异常内容
exc_tb如果抛出异常,这里显示所在位置
对于 call 方法的执行是由对象后加括号触发的

解释下什么是动态语言?动态强类型是指什么?
https://www.cnblogs.com/zhangchaocoming/p/12563432.html
动态语言:在运行时确定数据类型的语言
动态强类型:编写时无需定义变量类型;运行时变量类型强制固定。
解释型语言:无需编译,在解释器环境直接运行,编译型语言要先编译再运行,而解释性语言直接“运行”源代码。
强类型语言,当你定义一个变量是某个类型,如果不经过代码显式转换(强制转化)过,它就永远都是这个类型,如果把它当做其他类型来用,就会报错;
弱类型语言,你想把这个变量当做什么类型来用,就当做什么类型来用,语言的解析器会自动(隐式)转换。

是否有编码规范的概念?采用的是哪中编码规范?
https://www.runoob.com/w3cnote/google-python-styleguide.html
不要在行尾加分号, 也不要用分号将两条命令放在同一行
每行不超过80个字符
以下情况除外:
长的导入模块语句
注释里的URL
不要使用反斜杠连接行。
宁缺毋滥的使用括号
除非是用于实现行连接, 否则不要在返回语句或条件语句中使用括号. 不过在元组两边使用括号是可以的.
用4个空格来缩进代码
顶级定义之间空两行, 方法定义之间空一行
括号内不要有空格.
不要在逗号, 分号, 冒号前面加空格, 但应该在它们后面加(除了在行尾).
在二元操作符两边都加上一个空格, 比如赋值(=), 比较(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔(and, or, not). 至于算术操作符两边的空格该如何使用, 需要你自己好好判断. 不过两侧务必要保持一致.
当’='用于指示关键字参数或默认参数值时, 不要在其两侧使用空格.
不要用空格来垂直对齐多行间的标记, 因为这会成为维护的负担(适用于:, #, =等):
大部分.py文件不必以#!作为文件的开始. 根据 PEP-394 , 程序的main文件应该以 #!/usr/bin/python2或者 #!/usr/bin/python3开始
在计算机科学中, Shebang (也称为Hashbang)是一个由井号和叹号构成的字符串行(#!), 其出现在文本文件的第一行的前两个字符. 在文件中存在Shebang的情况下, 类Unix操作系统的程序载入器会分析Shebang后的内容, 将这些内容作为解释器指令, 并调用该指令, 并将载有Shebang的文件路径作为该解释器的参数.#!先用于帮助内核找到Python解释器, 但是在导入模块时, 将会被忽略. 因此只有被直接执行的文件中才有必要加入#!.
如果一个类不继承自其它类, 就显式的从object继承. 嵌套类也一样.
每个导入应该独占一行.
命名约定{
1.所谓"内部(Internal)"表示仅模块内可用, 或者, 在类内是保护或私有的.
2.用单下划线(_)开头表示模块变量或函数是protected的(使用import * from时不会包含).
3.用双下划线(__)开头的实例变量或方法表示类内私有.
4.将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块.
5.对类名使用大写字母开头的单词(如CapWords, 即Pascal风格), 但是模块名应该用小写加下划线的方式(如lower_with_under.py). 尽管已经有很多现存的模块使用类似于CapWords.py这样的命名, 但现在已经不鼓励这样做, 因为如果模块名碰巧和类名一致, 这会让人困扰.}

解释下深拷贝和浅拷贝
直接赋值:其实就是对象的引用(别名)。
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

lambda的用法以及使用场景?
lambda只是表达式不是语句,
场景1:map和reduce
场景2:lambda和list结合使用
li = [lambda :x for x in range(10)]

解释下什么是闭包,以及它的作用?
闭包: 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。
还有一点需要注意:使用闭包的过程中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量。
  很多伙伴很糊涂,闭包有啥用啊??还这么难懂!
   3.1装饰器!!!装饰器是做什么的??其中一个应用就是,我们工作中写了一个登录功能,我们想统计这个功能执行花了多长时间,我们可以用装饰器装饰这个登录模块,装饰器帮我们完成登录函数执行之前和之后取时间。
   3.2面向对象!!!经历了上面的分析,我们发现外函数的临时变量送给了内函数。大家回想一下类对象的情况,对象有好多类似的属性和方法,所以我们创建类,用类创建出来的对象都具有相同的属性方法。闭包也是实现面向对象的方法之一。在python当中虽然我们不这样用,在其他编程语言入比如avaScript中,经常用闭包来实现面向对象编程
   3.3实现单例模式!! 其实这也是装饰器的应用。单例模式毕竟比较高大,,需要有一定项目经验才能理解单例模式到底是干啥用的,我们就不探讨了。

实现一个简单的装饰器,用来对某个函数的结果进行缓存?

Python中几种容器类型的差别及使用场景?
字符串容器(string)
列表容器(list)
元组(tuple)
字典(dict)

列表推导式的使用和场景?
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]

yield的使用。
常用的内置库有哪些?举例他们的用法。
介绍下你了解的"dunder method"(魔法方法)有哪些,以及他们的作用?
解释下面向对象的概念,以及在编程中的作用?
如何实现单例模式?
如何对Python对象进行序列化?
是否能够熟练编写多线程和多进程程序?
使用socket编写一个简单的HTTP Server,成功返回success即可。
如何理解Python中的GIL?对我们日常开发有什么影响?
解释下协程、线程、进程之间的差别。
2. Django基础
整体结构
如何理解设计模式中的MVC模式,你日常中怎么使用这种模式?
如何理解Django中的MTV模型?
介绍下Django中你熟悉的模块有哪些,分别作用是什么?
如何看待Django自带的Admin,以及说说你的使用经验。
如何理解WSGI的作用?
如何自己实现WSGI协议?
为什么正式部署时不要开启DEBUG = True配置?
Model层
如何理解Django Migrations的作用?
是否有过手动编辑Migrations文件的经历,原因是什么,有哪些需要注意的?
介绍下ORM的概念。
如何理解ORM在Django框架中的作用?
介绍下ORM下的N+1问题,发生的原因,以及解决方案。
介绍下Django中Model的作用。
Model的Meta属性类有哪些可配置项,作用是什么,日常用到的。
介绍下QuerySet的作用,以及你常用的QuerySet优化措施?
介绍下Pagination的使用。
介绍下Model中Field的作用。
如何定制Manager?什么场景下需要定制?
Raw SQL的效率跟ORM的效率是否进行过对比,结果如何?如何理解这种差异?
Django内置提供的权限逻辑是什么,以及其粒度?
View层
Django中function view和Class-based View的差别及适用场景?
如何给Class-based View添加login required装饰器?
Middleware在Django系统中的作用?
settings中默认配置的MIDDLEWARES有哪些?他们的作用分别是什么?是否可以移除?
Django系统如何判断用户是否为登录用户?
对于无Cookie的浏览器如何实现用户登录?
Django中的request和HttpResponse的作用是什么?
如何处理图片上传的逻辑,以及展示逻辑?
介绍下用到过的Django的缓存粒度。
Form层
介绍下Django中Form的作用。
Form中的Field跟Model中的Field有何关联?
如何在Form层实现对某个字段的校验?
Template层
如何理解Django模板对设计师友好的说法?
日常开发中如何规划Django的模板继承和include?
常用的标签(tag)和过滤器(filter)有哪些?
在模板中如何处理静态文件?
在模板中如何处理系统内定义的URL?
如何自定义标签和过滤器?
3. MySQL数据库
如何确定需要哪些字段需要设置索引?
什么情况下需要设定字段属性为unique = True?
如何排查某个SQL语句的索引命中情况?
如何排查查询过慢的SQL语句?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值