Python面试题(三)
python面试题三
- Python中类方法、类实例方法、静态方法有何区别
- 动态获取和设置对象的属性
- Python的内存管理机制及调优手段
- 内存泄露是什么?如何避免
- map函数和reduce函数
- print(list(map(lambda x: x * x, [y for y in range(3)])))的输出?
- 什么是lambda函数? 有什么好处?
- 设计模式
- 单例模式的应用场景有哪些?
- 对装饰器的理解 ,并写出一个计时器记录方法执行性能的装饰器?
- @Software: PyCharm
- 解释一下什么是闭包
- 函数装饰器有什么作用?
- Python中is和==的区别
- Python的魔法方法
- 面向对象中怎么实现只读属性
- 谈谈你对多进程,多线程,以及协程的理解,项目是否用
- 什么是多线程竞争?
- 什么是僵尸进程和孤儿进程?怎么避免僵尸进程
- 简述TCP和UDP的区别以及优缺点?
- 简述浏览器通过WSGI请求动态资源的过程?
Python中类方法、类实例方法、静态方法有何区别
类方法:是类对象的方法,在定义时需要在上方使用“@classmethod”进行装饰,形参为 cls,
表示类对象,类对象和实例对象都可调用;
静态方法:是一个任意函数,在其上方使用“@staticmethod”进行装饰,可以用对象直接调用,
静态方法实际上跟该类没有太大关系。
类实例方法:是类实例化对象的方法,只有实例对象可以调用,形参为self,指代对象本身;
class New(object):def __init__(self, num1, num2):self.num1 = num1self.num2 = num2@classmethod # 类方法def class_fun(cls):print(f'+++++++++{cls}')@staticmethod # 静态方法def static_fun(args):print(f"========={args}")def fun(self, args): #实例方法print(f'----------------{args}')
动态获取和设置对象的属性
hasattr, getattr, setattr
列如
1. if hasattr(Parent,'x'):
2. print(getattr(Parent,'x'))
3. setattr(Parent,'x',3)
4. print(getattr(Parent,'x')
Python的内存管理机制及调优手段
内存管理机制:引用计数、垃圾回收、内存池。
引用计数: 引用计数是一种非常高效的内存管理手段, 当一个 Python对象被引用时其引用计数增加1, 当 其不再被一个变量引用时则计数减 1. 当引用计数等于0时对象被删除。
垃圾回收 :
- 引用计数 引用计数也是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术。当 Python 的某 个对象的引用计数降为 0 时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。比如 某个新建对象,它被分配给某个引用,对象的引用计数变为1。如果引用被删除,对象的引用计数为 0, 那么该对象就可以被垃圾回收。不过如果出现循环引用的话,引用计数机制就不再起有效的作用了
- 标记清除 如果两个对象的引用计数都为 1,但是仅仅存在他们之间的循环引用,那么这两个对象都是需要被 回收的,也就是说,它们的引用计数虽然表现为非 0,但实际上有效的引用计数为 0。所以先将循环引 用摘掉,就会得出这两个对象的有效计数。
- 分代回收 从前面“标记-清除”这样的垃圾收集机制来看,这种垃圾收集机制所带来的额外操作实际上与系统 中总的内存块的数量是相关的,当需要回收的内存块越多时,垃圾检测带来的额外操作就越多,而垃圾回收带来的额外操作就越少;反之,当需回收的内存块越少时,垃圾检测就将比垃圾回收带来更少的额 外操作。
内存池:- Python 的内存机制呈现金字塔形状,-1,-2 层主要有操作系统进行操作;
- 第 0 层是 C 中的 malloc,free 等内存分配和释放函数进行操作;
- 第1 层和第 2 层是内存池,有 Python 的接口函数 PyMem_Malloc 函数实现,当对象小于 256K 时有该层直接分配内存;
- 第3层是最上层,也就是我们对 Python 对象的直接操作;
调优手段(了解)
1.手动垃圾回收
2.调高垃圾回收阈值
3.避免循环引用(手动解循环引用和使用弱引用)
内存泄露是什么?如何避免
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的 消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪 费。导致程序运行速度减慢甚至系统崩溃等严重后果。
有 del() 函数的对象间的循环引用是导致内存泄漏的主凶。 不使用一个对象时使用:del object
来删除一个对象的引用计数就可以有效防止内存泄漏问题。 通过Python 扩展模块 gc 来查看不能回收的对象的详细信息。 可以通过
sys.getrefcount(obj) 来获取对象的引用计数,并根据返回值是否为 0 来判断是否内存 泄漏。
map函数和reduce函数
①从参数方面来讲:
map()包含两个参数,第一个参数是一个函数,第二个是序列(列表 或元组)。其中,函数(即 map
的第一个参数位置的函数)可以接收一个或多个参数。
reduce()第一个参数是函数,第二个是序列(列表或元组)。但是,其函数必须接收两个参数。
②从对传进去的数值作用来讲:
map()是将传入的函数依次作用到序列的每个元素,每个元素都是独自被函数“作用”一次 。
reduce()是将传人的函数作用在序列的第一个元素得到结果后,把这个结果继续与下一个元素作用
(累积计算)。
print(list(map(lambda x: x * x, [y for y in range(3)])))的输出?
[0, 1, 4] # map函数使用lambda匿名函数操作所有列表生成式生成的值操作
什么是lambda函数? 有什么好处?
lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数
1、lambda 函数比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只在此一处使用,
连名字都很随意的情况下;
2、匿名函数,一般用来给 filter, map 这样的函数式编程服务;
3、作为回调函数,传递给某些应用,比如消息处理
设计模式
单例模式
class A(object):__instance = Nonedef __new__(cls, *args, **kwargs):if cls.__instance is None:cls.__instance = object.__new__(cls)return cls.__instanceelse:return cls.__instance
单例模式的应用场景有哪些?
单例模式应用的场景一般发现在以下条件下:
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。 1.网站的计数器 2.应用配置 3.多线程池 4.数据库配置,数据库连接池 5.应用程序的日志应用…
对装饰器的理解 ,并写出一个计时器记录方法执行性能的装饰器?
@Software: PyCharm
import timedef timeit(func):def wrapper():start = time.time()func()end = time.time()print(end-start)return wrapper@timeit
def foo():print(1)
foo()
解释一下什么是闭包
在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。
函数装饰器有什么作用?
装饰器本质上是一个Python函数,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能。
装饰器的返回值也是一个函数的对象,它经常用于有切面需求的场景。 比如:插入日志、性能测试、事务处理、缓存、权限的校验等场景
有了装饰器就可以抽离出大量的与函数功能本身无关的雷同代码并发并继续使用。
Python中is和==的区别
is 判断的是 a对象是否就是 b对象,是通过 id来判断的。
==判断的是 a对象的值是否和b对象的值相等,是通过 value 来判断的
Python的魔法方法
魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现 (重载)了这些方法中的某一个,那么这个
方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。 它们经常是
两个下划线包围来命名的(比如 init,lt),Python 的魔法方法是非常强大的,所以了解其使用方法也变得
尤为重要!
init 构造器,当一个实例被创建的时候初始化的方法。但是它并 不是实例化调用的第一个方法。
__new__才是实例化对象调用的第一个方法,它只取下 cls 参数,并把 其他参数传给 init。 __new__很少使用,但是也有它适合的场景,尤其 是当类继承自一个像元组或者字符串这样不经常改变的类型的时候。
call 允许一个类的实例像函数一样被调用 。
getitem 定义获取容器中指定元素的行为,相当于 self[key] 。
getattr 定义当用户试图访问一个不存在属性的时候的行为 。
setattr 定义当一个属性被设置的时候的行为 。
getattribute 定义当一个属性被访问的时候的行为 。
面向对象中怎么实现只读属性
将对象私有化,通过共有方法提供一个读取数据的接口。
class B(object):def __init__(self):self.__weight = 10def weight(self):return self.__weight
谈谈你对多进程,多线程,以及协程的理解,项目是否用
进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最
小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。
线程: 调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个
线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。
协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和
栈。 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存
器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切
换非常快。
什么是多线程竞争?
线程是非独立的,同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争状态即:
数据几乎同步会被多个线程占用,造成数据混乱 ,即所谓的线程不安全
那么怎么解决多线程竞争问题?-- 锁。
锁的好处:
确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整地执行能解决多线程资源竞争下
的原子操作问题。
锁的坏处:
阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
锁的致命问题:死锁。
什么是僵尸进程和孤儿进程?怎么避免僵尸进程
孤儿进程:父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被 init 进程(进
程号为 1)所收养,并由 init 进程对它们完成状态收集工作。
僵尸进程:进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获
取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。
避免僵尸进程的方法:
1.fork两次用孙子进程去完成子进程的任务;
2.用wait()函数使父进程阻塞;
3.使用信号量,在 signal handler 中调用waitpid,这样父进程不用阻塞。
简述TCP和UDP的区别以及优缺点?
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息。
优点:UDP速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送
缺点:UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数
据是否会正确接收,也不重复发送,不可靠。
TCP是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手
优点:TCP在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。
缺点:TCP相对于UDP速度慢一点,要求系统资源较多。
简述浏览器通过WSGI请求动态资源的过程?
1.发送http请求动态资源给web服务器
2.web服务器收到请求后通过WSGI调用一个属性给应用程序框架
3.应用程序框架通过引用WSGI调用web服务器的方法,设置返回的状态和头信息。
4.调用后返回,此时web服务器保存了刚刚设置的信息
5.应用程序框架查询数据库,生成动态页面的body的信息
6.把生成的body信息返回给web服务器
7.web服务器吧数据返回给浏览器
Python面试题(三)相关推荐
- python 如何进行内存管理,python面试题之Python是如何进行内存管理的
python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收. ...
- 金三银四,50道必备的Python面试题(建议收藏)
在过去的2020年,Python赢得了年度TIOBE编程语言奖,成为过去一年最受欢迎的编程语言.在数据科学和机器学习等领域中,被广泛使用. 正值"金三银四"招聘季,小F给大家整理了 ...
- 一道Python面试题,据说大部分人都中招了,纷纷开始怀疑自己
无意间,看到这么一道Py无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun(): temp = [lambda x : i*x for i in range(4)] ...
- python面试题及答案-50道Python面试题集锦(附答案)
原标题:50道Python面试题集锦(附答案) Python是目前编程领域最受欢迎的语言.在本文中,我将总结Python面试中最常见的50个问题.每道题都提供参考答案,希望能够帮助你在2019年求职面 ...
- python面试题及答案-5个很好的Python面试题问题答案及分析
本文的主要内容是向大家分享几个Python面试中的T题目,同时给出了答案并对其进行分析,具体如下. 本文的原文是5 Great Python Interview Questions,同时谢谢 @非乌龟 ...
- 在python中、下列代码的输出是什么-python面试题详细总结(附答案)
本篇文章给大家带来的内容是关于python面试题总结(附答案),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. CPS少儿编程网-Scratch_Python_教程_免费儿童编程学习平 ...
- python fun_一道神奇的Python面试题,你会吗?
原标题:一道神奇的Python面试题,你会吗? 无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun: temp = [lambda x : i*x for i in ...
- python数据挖掘例题_数据挖掘与python实践试题及答案
数据挖掘与python实践试题及答案 更多相关问题 [填空题] 进厂检验之所以重要,因为它是涂料入厂()工序 [多选] 裂纹可能是由于下列哪些原因造成的:() [多选] 涂装车间常用的消防器材共有几种 ...
- python面试题及答案bt_公布上期Python笔试题答案,附带源码与运行结果
今天发布的内容没有废话,就是上一期的笔试题答案,由于内容较多,我们今天就公布前五道题的答案,附带源码哦!请感兴趣的读者细细研究! 笔试 笔试题一答案:利用Python创建如图所示的二叉树,并给出前序. ...
最新文章
- 5个找出Linux中“二进制命令”描述和系统中位置的方法
- AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
- 【百家稷学】从传统方法到深度学习,人脸算法和应用的演变(河南平顶山学院技术分享)...
- 【Leetcode】大神总结的所有TopK问题模板(基于快速排序)
- zoj 3620 Escape Time II
- 2019.03.20 mvt,Django分页
- 2014 网选 5024 Wang Xifeng's Little Plot
- Xdebug 使用说明
- dataobject java_Object类和@Data注解
- 【Shiro第九篇】SpringBoot + Shiro整合JWT
- 64bitwin7通过tns远程连接不上32bitlinux的rac
- 麻雀优化算法 SSA python实现
- mysql离散查询_MySQL多表查询与子查询
- linux操作系统没声音,Linux系统下没有声音的解决方案
- python有道字典_Linux下自制有道词典 - python 解密有道词典JS加密
- 学习HTML经历记录01
- 【健康管理师】常用健康监测指标
- 关于算法工程师,你想知道的都在这里!
- 【毫米波雷达】雷达频段从24GHz到77GHz,提高分辨率和精度
- 侧信道攻击:SPA / DPA