python面试知识

Django

优点

  • 功能完善、要素齐全:自带大量常用工具和框架(比如分页,auth,权限管理), 适合快速开发企业级网站。
  • 强大的数据库访问组件:Django的Model层自带数据库ORM组件,使得开发者无须学习SQL语言即可对数据库进行操作。
  • 自带台管理系统admin:只需要通过简单的几行配置和代码就可以实现一个完整的后台数据管理控制平台
  • Django 的错误提示做的足够详细

缺点

  • 大包大揽: 对于一些轻量级应用不需要的功能模块Django也包括了,不如Flask轻便。
  • 系统紧耦合,Django 内置的某项功能不是很好,想用喜欢的第三方库来代替是很难的,
  • 过度封装:很多类和方法都封装了,直接使用比较简单,但改动起来就比较困难
  • Django 自带的 ORM 远不如 SQLAlchemy 强大
  • 性能劣势: 与C, C++性能上相比,Django性能偏低,当然这是python的锅,其它python框架在流量上来后会有同样问题。
  • Template 功能比较弱,不能插入 Python 代码,要写复杂一点的逻辑需要另外用 Python 实现 Tag 或 Filter

如何使用Python获取当前文件路径

  1. os.getcwd() 获取文件当前工作目录路径(绝对路径)
  2. sys.path[0] 获取文件当前工作目录路径(绝对路径)
  3. sys.argv[0]|获得模块所在的路径(由系统决定是否是全名)
    若显示调用python指令,如python demo.py,会得到绝对路径;
    若直接执行脚本,如./demo.py,会得到相对路径。

Django和flask的区别以及适用条件
Flask

  • 小巧、灵活(Flask是一个简单,轻量级、扩展性很好的Web框架,可以使用各种Web开发库和工具来灵活地开发Web应用程序),非常适用于小型网站。
  • 其路由系统(route())由装饰器完成 采用MVC(view,相当于下面的templete,封装Html、css)

Django:

  • 大而全,功能极其强大,是Python web框架的先驱,用户多,第三方库极其丰富。
  • Django附带了构建网站所需的大多数技术组件(数据库ORM支持、模板、表单、admin管理站点)。Flask纯粹只是框架,允许最终用户做出更多决策。
  • 采用MVT模式(view作为控制台,用于接收请求,处理,返回结果的)

匿名函数用来干嘛的

  • 有些时候,不需要显式地定义函数,直接传入匿名函数更方便。 关键字lambda表示匿名函数,冒号前面的x表示函数参数。
  • list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
  • func = lambda x, y, z: x + y + z print( func(1, 2, 3))

Python为什么是解释型语言

  • 顺序执行的 没有静态检查 没有编译链接过程 可以交互式运行
  • c语言类型不对是编译抛的错误,python类型不对是运行抛的错误
  • 也就是python是一条条运行的,c需要整个编译过了才能运行

加粗样式面向对象和面向过程的区别

  • 面向对象是把构成问题的事务分解成各个对象,建立对象来描述某个事务在解决问题的步骤中的行为;
  • 面向过程是分析出解决问题所需要的步骤,然后用一些函数把这些步骤一步步实现,使用的时候依次调用函数就行了。

Python有什么优势

  • 解释型,语法简单易懂,可读性强
  • 有很多库可以用,time,random,threading,datetime,pymysql
  • 可扩展,和其他编程语言或其他软件有可连接的接口

缺点

  • 他的可解释特征使其运行速度变慢
  • 动态语言的特点可能会增加运行时错误

装饰器

  • 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,它接受一个函数作为参数,并返回一个函数,利用python的@语法来放置(经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、)
  • 功能:1.引入日志;2.函数执行时间统计;3.执行函数前预备处理;4.执行函数后清理功能;5.权限校验;6.缓存

多个装饰器执行的顺序

  • 从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身。

@语法糖:指计算机中添加的某种语法(a,b=b,a、切片操作),这种语法对语言的功能并没有影响,更方便程序员的使用
写一个装饰器
在这里插入图片描述

python 装饰器@staticmethod和@classmethod区别和使用
@classmethod:类方法,

  1. 类方法是给类用的,类在使用时会将类本身当做参数传给类方法的第一个参数,
  2. 可以访问类属性(self.val=1),无法访问实例变量(val=1)

@staticmethod:静态方法

  1. @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
  2. @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
  3. 无法访问类变量,实例变量

闭包
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).在这里插入图片描述

深拷贝、浅拷贝和等号赋值
深拷贝

  • 是将新建一个对象,把原来对象的内存完全复制过来。
  • 两个对象在复制之后是完全独立的对象这意味着如果对对象的副本进行更改时不会影响原对象。
  • 在Python 中,使用copy. deepcopy()函数进行深拷贝(copy 模块的 deepcopy方法,完全拷贝了父对象及其子对象。)
    由于为每个被调用的对象创建了某些副本,因此深拷贝会使程序的执行速度变慢。

等号赋值
相当于为原来的对象打一个新的标签,两个引用指向同一个对象,修改其中的一个,另一个也会产生变化
浅拷贝

  • 是将对象的引用复制给另一个对象。因此,如果我们在副本中进行更改,则会影响原对象。
  • 使用copy()函数进行浅拷贝。(拷贝父对象,不会拷贝对象的内部的子对象)
  • 浅拷贝允许更快地执行程序,它取决于所使用的数据的大小

在python中如何实现多线程

  • 1.通过threading.Thread进行创建多线程
  • 2.通过继承threading.Thread定义子类创建多线程,然后重写init方法和run方法: Thread,新建线程,然后可以用GIL实现线程通信
  • GIL(全局解释器锁) 保证同一时刻只有一个线程在运行。一个线程保存 GIL并在将其传递给下一个线程之前执行一些操作,这就产生了并行执行的错觉。但实际上,只是线程轮流在 CPU上。当然,所有传递都会增加执行的开销。

python线程池
原理

  • 线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它。当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。
  • 使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Python
    解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数
  • 线程池的基类是 concurrent.futures 模块中的 Executor,Executor 提供了两个子类,即
    ThreadPoolExecutor(创建线程) 和 ProcessPoolExecutor

Python如何内存管理
1. 垃圾回收:
python会检查引用计数为0的对象,清除其在内存占的空间;循环引用对象则用一个循环垃圾回收器来回收
2. 内存池机制:
背景:
当创建大量消耗小内存的对象时,频繁调用free/malloc(动态分配内存函数,用来向系统请求分配内存空间)会导致大量的内存碎片,导致效率降低。
内存池作用:

  • 预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够之后再申请新的内存。(python的内存管理机制为Pymalloc)
  • 优势:能够减少内存碎片,提升效率。

Python垃圾回收机制(GC)
(自动处理分配回收内存的问题,没用了内存泄漏的隐患),以引用计数机制为主,标记-清除和分代回收两种机制为辅
计数机制
作用:用它来保存内存中的变量追踪,即记录该对象被其他使用的对象引用的次数
就是python中的每一个对象都有一个引用计数的值,当有引用的时候,这个值会增加,引用他的对象被删除时,这个值减小,引用计数的值为0时,该对象生命结束,python会把这段内存自动回收。(缺点,循环引用,如果l1和l2相互引用,没用其他的对象引用他们,这两段内存永远无法被回收)
标记-清除
通过引入追踪回收(tracing GC)技术,把活动对象打上标记,然后把没有标记的对象进行回收
活动对象:构成一个有向图,对象构成这个有向图的节点,从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象
分代回收
 分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去

参数,传参

  • 位置参数和关键字参数的区别

args一定要在kwargs前面
****args和
kwargs的含义
**

  • 不知道向函数传递多少参数时,比如传递一个列表或元组,就使用*args
def func(*args):…
Func(1,2,3,4,5)
  • 不知道该传递多少关键字参数时,使用**kwargs来收集关键字参数(keyword argument)
def func(**kwargs):…
Func(a=1,b=2,c=3)

常用方法

  • join()和split()

join()把指定的字符串添加到字符串中,也可以把join后面带的一个含字符串的列表用指定的字符串连接起来
split(),把字符串用指定字符分割,结果是一个列表

  • strip(), lstrip(), rstrip()

移除字符串两边的空格

  • is家族 检查字符串

islower(), isupper(), istitle()…
isalnum(), isdigit(), isnumeric(), isdecimal()…

  • yield

1.保存当前运行状态(断点),然后暂停执行,即将函数挂起
2.将yeild关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用,当使用next()、send()函数让函数从断点处继续执行,即唤醒函数。

  • match()和search()

match()检测RE是不是在字符串开始位置匹配,只有在0匹配成功才返回True,search()会扫描整个字符串查找有无匹配

生成器generator和迭代器iterator
迭代器

  • 迭代器是访问集合元素的一种方式,他的对象从集合的第一个元素开始访问,直到所有元素被访问完结束,用iter()创建迭代器,调用next()函数获取对象(迭代只能往前不能后退)。
  • 迭代器是一个可以记住遍历的位置的对象
  • 迭代器有两个基本的方法:iter()和next()

生成器

  • 生成器是一种特殊迭代器。可以一边循环一边计算的机制,称为生成器(Generator),不必创建完整的list,从而节省大量的空间。
  • 使用了yield的函数,返回迭代器
  • 在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行消息,返回yield的值,并在下一次执行next()方法从当前位置继续运行。

两者区别
创建/生成,

  • 生成器创建一个函数,用关键字yield生成/返回对象;迭代器用内置函数iter()和next()

高效

  • 生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保持程序状态的自动生成,当发生器终结时,还会自动跑出StopIterration异常。
  • 生成器中yield语句的数目可以自己在使用时定义,迭代器不能超过对象数目
  • 生成器yield暂停循环时,生成器会保存本地变量的状态;迭代器不会使用局部变量,更节省内存

生成器和函数
生成器和函数的主要区别在于函数 return a value,生成器 yield a value同时标记或记忆 point of the yield 以便于在下次调用时从标记点恢复执行。 yield 使函数转换成生成器,而生成器反过来又返回迭代器

is和==的区别
s比较的是两个对象的地址值,也就是说两个对象是否为同一个实例对象;而==比较的是对象的值是否相等,其调用了对象的__eq__()方法。
__new__和__init__的区别?
new:

  • 是用来创造一个类的实例的,会返回当前对象的一个实例
  • __new__所接收的第一个参数是cls,

init:_

  • init__是对当前对象的一些实例初始化,无返回值
  • 而__init__所接收的第一个参数是self。

Python中多态的作用

  • 让具有不同功能的函数可以使用相同的函数名,这样可以用一个函数名调用不同内容(功能)的函数

好处:

  • 增加程序的灵活性,使用者都是用同一种形式去调用,如fun(obj)

特点

  • 1.只关心对象的实例方法是否同名,不关系对象所属的类型
  • 2.对象可属的类之间,继承关系可有可无(多应用在有继承关系中)
  • 3.多态是调用方法的技巧,不会影响到类的内部设计
  • 4.可以增加代码的外部调用灵活度,让代码更加通用,兼容性较强。

如何提高python的运行效率

  • 使用生成器;
  • 关键代码使用外部功能包(Cython,pylnlne,pypy,pyrex);
  • 针对循环的优化–尽量避免在循环中访问变量的属性

大数据的文件读取

  • 利用生成器generator
  • 迭代器进行迭代遍历:for line in file

解释Python 中的三元表达式

  • [on true] if [expression]else [on false]

  • 如果 [expression] 为真, 则 [on true] 部分被执行。如果表示为假则 [on false] 部分被执行

讲一讲排序
在这里插入图片描述

每一趟排序结束至少能确定一个元素最终位置的方法

  • 1.简单排序:每次选出元素中最小(大)的
  • 2.快速排序:每次都能确定基准的位置(比它小的在左边,比它大的在右边)
  • 3.堆排序:以升序为例,使用大根堆,每次顺堆都可以得到元素中的最大值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值