GIL(全局解释器锁)

  描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因。

1.python语言和GIL没有任何关系,GIL不是python语言的特性,仅仅是因为历史原因在Cpython解释器,难以移除GIL

2.GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程执行代码

3.Python使用多进程(mutilprocess)代替多线程(threading),可以利用多核的CPU资源的

4.线程释放GIL锁的情况:在IO操作等可能会引起阻塞的系统调用之前,会暂时释放GIL,但在执行完毕之后,会重新获得GIL

5.多线程比单线程爬取有所提升,在遇到IO阻塞的时候会释放GIL,达到多线程爬出的目的。

深拷贝、浅拷贝(copy.copy   copy.deepcopy)

浅拷贝是对一个对象的顶层拷贝,只拷贝引用,没有拷贝内容 。

深拷贝是对一个对象的所有层次的拷贝(本质上递归浅拷贝),开辟一个新的空间。分片表达式进行的拷贝是深拷贝,字典的copy是深拷贝。

对可变数据类型(列表、字典、集合)进行浅拷贝,只是指向引用地址,不会开辟新的空间

对不可变数据类型(数字、字符串、元组)进行浅拷贝,会开辟一个新的空间(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的)

浅拷贝后,改变原始对象中可变类型的元素的值,拷贝对象的值也随之改变。改变原始对象中不可变类型元素的值,拷贝对象的值也不会改变

面向对象的三大特性(封装、继承、多态)

封装:把客观事物封装成抽象的类,类可以把自己的属性和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。提高了代码的重用性,能够对代码进行有效的管理,当某个类有问题只要修改这个类即可,而其继承的子类不需要修改

多态:必须是在继承的基础上,一个类实例的相同方法在不同情形下有不同的表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

鸭子类型:在程序设计中,鸭子类型是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由这个对象继承特定的类或实现特定的接口,而是由当前方法和属性集合决定。“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。

新式类和经典类的区别,在多继承上。经典类(python2.x)会进行深度优先继承。新式类(python3.x)默认继承object,会进行广度优先查找。

@property:可以把一个实例方法变成其同名属性,以支持.号访问获得方法返回值。property属性内部进行一系列的逻辑计算,最终将计算结果返回。

闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。在闭包内函数想要修改外部临时变量时,需要加上nonlocal xx。

一个简单的闭包函数:

def outer():
a = 10
def inner():
b = 22
nonlocal a
a = 100
print(a+b)
return inner if __name__ == '__main__':
x = outer()
x()

装饰器:写代码需要遵循开放封闭原则,已经实现的功能代码不允许被修改,但是可以扩展。装饰器的作用就是在不改变原有函数功能的情况下,为其添加额外的功能。

装饰器的功能:1.作为引入日志  2.函数执行时间的统计  3.执行函数前预备处理  4.执行函数后清理功能 5.权限校验等场景 6.缓存

一个简单的装饰器:

# wrapper装饰器,传入函数作为变量,由内函数调用
def outer_wrapper(func):
def wrapper(*args,**kwargs): # 进行函数的装饰
# 权限校验等场景
# 验证1
# 验证2
# 验证3
pass
func()
return wrapper @outer_wrapper
def f1():
print('f1')

使用装饰器实现一个单例:

def singleton(cls,*args,**kwargs):
instances = {}
def get_instance(*args,**kwargs):
if cls not in instances:
instances[cls] = cls(*args,**kwargs)
return instances[cls]
return get_instance

单例:是软件设计的一种模式,该模式的目的主要是确保某一个类只有一个实例存在

使用__new__方法实现一个单例:

class SingleTon(object):
_instance = {}
def __new__(cls,*args,**kwargs):
if cls not in cls._instance:
# 重写父类的__new__实现单例
cls._instance[cls] = super(SingleTon,cls).__new__(cls,*args,**kwargs)
print(cls._instance)
return cls._instance[cls]

洒洒水

python面试问题集锦的更多相关文章

  1. .NET面试问答集锦

    程序员级别鉴定书(.NET面试问答集锦) 提供避免元素命名冲突的方法 DOM适合的使用场景是什么?是否有尺寸限制? DOM是一种与浏览器,平台,语言无关的接口,使你可以访问页面其他的标准组件. DOM ...

  2. C#面试考点集锦

    C#面试考点集锦 ©智客坊      岁末年初往往是程序猿准备跳槽的高峰,当然互联网行业跳槽几乎是每个月都在发生,没有太过明显的淡季~那么,如何提高面试的通过率,最终顺利的拿到自己心仪的offer呢? ...

  3. Python面试真题答案或案例

    Python面试真题答案或案例如下: 请等待. #coding=utf-8 #1.一行代码实现1--100之和 print(sum(range(1,101))) #2.如何在一个函数内部修改全局变量 ...

  4. Python面试 【315+道题】

    Python面试 [315+道题] 第一部分 Python基础篇(80题) 为什么学习Python? 因为看到python的发展趋势,觉得需要与时俱进,第一点,python开发速度极快,能快速完成一个 ...

  5. 10个Python面试常问的问题

    概述 Python是个非常受欢迎的编程语言,随着近些年机器学习.云计算等技术的发展,Python的职位需求越来越高.下面我收集了10个Python面试官经常问的问题,供大家参考学习. 类继承 有如下的 ...

  6. Python面试基础篇

    1. 为什什么学习Python? Life is short, You need Python 2. 通过什什么途径学习的Python? pass 3. Python和Java.PHP.C.C#.C+ ...

  7. Python 面试中 8 个必考问题(转载)

    Python 面试中 8 个必考问题 1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val) return list ...

  8. 常见的25个python面试问答

    常见的25个python面试问答 说到好用简洁的大数据技术,除了Hadoop.R等等,Python也是其中熠熠生辉的一员,因而广受企业和商家的青睐.求职季,不少应聘者在面试相关职业时都被要求掌握Pyt ...

  9. python面试笔试题汇总

    Python面试攻略(嗨谈篇) 110道python面试笔试题汇总,你能答对几道? Python 面试问答 Top 25 2018 年最常见的 Python 面试题 & 答案

随机推荐

  1. Express全系列教程之(九):将session上传至mysql数据库

    一.简介 实际引用中,有些公司在不同地区会设置不同服务器,因此就需要用到nginx以实现负载均衡,这时,将session数据保存至数据库就成为了需要面对的问题,我们以MySQL数据库为例,看看他是如何 ...

  2. Python——开发一个自动化微信投票器【附代码实例方法】

    一个研究Python实践,最近研究一个投票的东东,主要是想测试利用Python实现刷微信投票. 本文纯粹为了记录一下 webdriver直接操作页面按钮的方法: #!/usr/bin/python # ...

  3. 《PHP内核剖析 - 变量/内存管理》

    本文总结自: <PHP7 内核剖析 - 变量的内部实现> 一:变量的实现 - 变量是一个语言实现的基础. - 在PHP中,变量的组成部分为 变量名(zval) 变量值(zend_value ...

  4. HotSpot设计原理与实现:一、初识HotSpot

    一.HotSpot内核模块组成和功能框架 1.HotSpot内核模块图 (1)Prims模块: (2)Service模块: (3)Runtime模块: 二.虚拟机生命周期(JVM初始化过程) 1.虚拟 ...

  5. PL_SQL学习

    打印输出: dbms_output.put_line('AA'); 显示服务器输出信息  set serveroutput on; 打印出eid=1的员工姓名: declare v_name varc ...

  6. OpenDialog文件多选

    procedure TForm1.OpenFileListClick(Sender: TObject); var openDialog: TOpenDialog; I: Integer; begin ...

  7. 【jdbc访问数据库获取执行sql转换json】

    Talk is cheap.Show me your code. import java.sql.*; import java.util.HashMap; import java.util.Map; ...

  8. 获取地址栏url

    Url=${window.location.protocol}//${window.location.host}${window.location.pathname}

  9. linux运维需要掌握什么知识?linux运维学习路线

    linux运维需要掌握什么知识?这个问题算是老生常谈了,但是本人认为知道需要掌握什么知识不是重点,重点是我们需要知道运维是做什么的?再来根据工作需求去讨论需要学习什么知识才是正途,须知知识是学不完的, ...

  10. CSS常见兼容问题以及解决办法

    浏览器的兼容性问题,通常是因为不同的浏览器对同一段代码有不同的解析,造成页面显示不统一的情况. 这里谈到的浏览器,主要指IE6/IE7/IE... FireFox Chrome Opera Safar ...