【面试记录】Python常见面试200题及答案总结

Python常见面试200题及答案总结

/待完善/

1. 列出5个常用python标准库?

os:提供了不少与操作系统相关联的函数,提供了一种可移植的使用操作系统功能的方法。使用os模块中提供的接口,可实现跨平台访问。但是,并不是所有的os模块中的接口在全平台都通用,有些接口的实现是依赖特定平台的,比如linux相关的文件权限管理和进程管理。
os模块的主要功能:系统相关、目录及文件操作、执行命令和管理进程
>>> os.getcwd() # 返回当前的工作目录
>>> os.chdir() # 修改当前的工作目录
>>> os.system('mkdir today') # 执行系统命令 mkdirsys:通常用于命令行参数re:正则匹配math:数学运算datetime:处理日期时间

2. Python 内建数据类型有哪些?

数字(整型int、浮点数float、复数complex)布尔 boolBytes字符串 str列表 list元祖 tuple集合 set字典 dict

3. 简述 with 方法打开处理文件帮我我们做了什么?

# 常规的打开文件写法
f = open("./1.txt")
try:print(f.read())
excpet:pass
finally:f.colse()# with语句打开文件写法
with open('1.txt') as f:print(f.read())
打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open写法,需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close。注意:with本身没有异常捕获的功能,如果发生了运行时异常,它照样可以关闭文件释放资源。

【格式】

with context [as var]:pass
其中:context是一个表达式,返回一个对象,var用来保存context表达式返回的对象,可以是单个或多个返回值。
with open('1.txt') as f:print(f.read())print(f.closed)
# 表达式open('1.txt')返回是一个_io.TextIOWrapper类型的变量对象,用f来保存。
# 在with语句块中就可以使用这个变量操作文件。
# 执行with这个结构之后。f会自动关闭。相当于自带了一个finally。输出:
print # 1.txt文件的内容
True # 执行完with语句块之后,f自动关闭

【with语句实质是上下文管理】

1、上下文管理协议。包含方法__enter__()和__exit__(),支持该协议对象要实现这两个方法。
2、上下文管理器。定义执行with语句时要建立的运行时上下文,负责执行with语句快上下文中的进入与退出操作。
3、进入上下文的时候执行__enter__(),如果设置as var语句,var变量接受__enter__()方法返回值。
4、如果运行时发生了异常,就退出上下文管理器。调用管理器__exit__()方法。

【应用场景】

1、文件操作
2、进程线程之间互斥对象
3、支持上下文其他对象

4. 列出 Python 中可变数据类型和不可变数据类型,为什么?

详解参考link

可变数据类型:在id(内存地址)不变的情况下,value(值)可以变,则称为可变类型。即说明对一个变量进行操作时,其值是可变的,值的变化并不会引起新建对象,其地址是不会变的,只是地址中的内容变化了或者地址得到了扩充。
  • 列表 list
  • 字典 dict
# 以list为例
>>> a = [1, 2, 3]
>>> id(a)
41568816
>>> a = [1, 2, 3]
>>> id(a)
41575088
# 进行两次a = [1, 2, 3]操作,两次a引用的地址值是不同的,即说明其实创建了两个不同的对象。
# 即在内存中保存了多个同样值的对象,地址值不同。
>>> a.append(4)
>>> id(a)
41575088
>>> a += [2]
>>> id(a)
41575088
>>> a
[1, 2, 3, 4, 2]
# 对列表a进行操作,a引用的对象值改变了,但a的地址值没有发生改变,只是在地址后面又扩充了新的地址。
不可变数据类型:value(值)一旦改变,id(内存地址)也改变,则称为不可变类型(id变,意味着创建了新的内存空间)。
优点:内存中不管有多少个引用,相同的对象只占用了一块内存。
缺点:当需要对变量进行运算从而改变变量引用的对象的值时,由于是不可变的数据类型,所以必须创建新的对象,这样就会使得一次次的改变创建了一个个新的对象,不过不再使用的内存会被垃圾回收器回收。
  • 数字(整型int、浮点数float、复数complex)
  • 布尔 bool
  • 字符串 str
  • 元祖 tuple
  • 集合 set
# int为例
>>> x = 1
>>> id(x)
31106520
>>> y = 1
>>> id(y)
31106520
# x、y引用对象都为1,id不变
>>> x = 2
>>> id(x)
31106508
>>> y = 2
>>> id(y)
31106508
>>> z = y
>>> id(z)
31106508
# 此时x、y、z引用对象变为2,id即改变了

5.Python 获取当前日期?

import time
localtime = time.localtime(time.time())
print(localtime)# time.time()用于获取当前时间时间戳。
# 每个时间戳都以自1970年1月1日午夜(历元)经过了多长时间来表示。以秒为单位的浮点小数。
# 用localtime()函数将浮点数转化为元祖struct_time结构

输出:

time.struct_time(tm_year=2021, tm_mon=3, tm_mday=18, tm_hour=16, tm_min=18, tm_sec=48, tm_wday=3, tm_yday=77, tm_isdst=0)

6. 统计字符串每个单词出现的次数

# collection模块,实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。
from collections import Counterstr1 = 'I can because i think i can'
# Counter -- 字典的子类,提供了可哈希对象的计数功能
counts = Counter(str1.split())
print(counts)

输出:

Counter({'can': 2, 'i': 2, 'I': 1, 'because': 1, 'think': 1})

7. 用 python 删除文件和用 linux 命令删除文件方法

# python
import os
os.remove('111.py')
# linux
rm 111.py

8. 写一段自定义异常代码

# 本模块的基类
class CalcErr(Exception):pass# 非整型引发异常
class NumErorr(CalcErr):"""输入的非整型数据类型将引发此异常"""def __init__(self, numA, numB): # 异常类对象的初始化属性"""用户输入的数据"""self.numA = numAself.numB = numBdef __str__(self): # 返回异常类对象说明信息"""返回异常描述"""return f"本计算机只接收整数!"# 计算函数,try子句引发异常
def calculator(a, b):"""a+b=c"""try:if type(a) != int or type(b) != int:raise NumErorr(a, b)  # 抛出异常类对象,传入初始化数据except Exception as e:  # 捕获异常,返回描述信息print(e)else: # 输入正常的情况下,直接计算,不引发一场c = a + bprint(c)

9. 举例说明异常模块中 try except else finally 的相关意义

try...except...else没有捕获到异常,执行else语句try...except...finally不管是否捕获到异常,都执行finally语句

10. 遇到 bug 如何处理

1、细节上的错误,通过print()打印,能执行到print()说明一般上面的代码没有问题,分段检测程序是否有问题,如果是js的话可以alert或console.log2、如果涉及一些第三方框架,会去查官方文档或者一些技术博客。3、对于bug的管理与归类总结,一般测试将测试出的bug用teambin等bug管理工具进行记录,然后我们会一条一条进行修改,修改的过程也是理解业务逻辑和提高自己编程逻辑缜密性的方法,我也都会收藏做一些笔记记录。4、导包问题、城市定位多音字造成的显示错误问题

语言特性

1. 谈谈对 Python 和其他语言的区别

1、语言特点:简洁,省略了各种大括号和分号,还有一些关键字,类型说明;缩紧表达逻辑
2、语言类型:解释型语言,运行的时候是一行一行的解释,并运行,所以调试代码很方便,开发效率很高;但运行速度慢。
3、第三方库:python是开源的
4、可移植性

2.简述解释型和编译型编程语言
在这里插入图片描述

  • 解释型
使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行,所以只要某一平台提供了相应的解释器即可运行该程序。解释型语言每次运行都需要将源代码解释称机器码并执行,效率较低;只要平台提供相应的解释器,就可以运行源代码,所以可以方便源程序移植;Python等属于解释型语言。
  • 编译型
使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。在编译型语言写的程序执行之前,需要一个专门的编译过程,把源代码编译成机器语言的文件,如exe格式的文件,以后要再运行时,直接使用编译结果即可,如直接运行exe文件。因为只需编译一次,以后运行时不需要编译,所以编译型语言执行效率高。一次性的编译成平台相关的机器语言文件,运行时脱离开发环境,运行效率高;与特定平台相关,一般无法移植到其他平台;现有的C、C++、Objective等都属于编译型语言。
  • 区别
主要区别在于,编译源程序编译后即可在该平台运行,翻译是在运行期间才编译。所以编译性语言运行速度快,翻译性语言跨平台性好。

在这里插入图片描述
在这里插入图片描述

  • 有关java是什么语言?
确切的说java就是解释型语言,其所谓的编译过程只是将.java文件编译成平台无关的字节码.class文件,并不是向C一样编译成可执行的机器语言,请注意Java中所谓的“编译”和传统的“编译”的区别)。作为编译型语言,JAVA程序要被统一编译成字节码文件——文件后缀.class。此种文件在java中又称为类文件。java类文件不能再计算机上直接执行,它需要被java虚拟机(JVM)翻译成本地的机器码后才能执行,而java虚拟机的翻译过程则是解释性的。java字节码文件首先被加载到计算机内存中,然后读出一条指令,翻译一条指令,执行一条指令,该过程被称为java语言的解释执行,是由java虚拟机完成的。而在现实中,java开发工具JDK提供了两个很重要的命令来完成上面的编译和解释(翻译)过程。两个命令分别是java.exe和javac.exe,前者加载java类文件,并逐步对字节码文件进行编译,而另一个命令则对应了java语言的解释(javac.exe)过程。在次序上,java语言是要先进行编译的过程,接着解释执行。

3.Python 的解释器种类以及相关特点?

当我们编写完Python代码时,我们会得到一个包含Python代码的以.py为扩展名的文件,这个时候,我们要运行这个代码,就需要Python解释器去执行.py文件。
  • CPython
用C语言实现的Python解释器,也是官方的并且最广泛使用的Python解释器;CPython是使用字节码的解释器,任何程序源代码在执行之前都先要编译成字节码,它还有和几种其他语言交互的外部函数接口,特点就是使用最广的解释器
  • IPython
基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的,好比国产浏览器虽然外观不同,但是内核其实都是调用了IDE,特点就是交互方式很强。
  • PyPy
目标是执行速度,采用JIT技术(Just-In-Time,即时编译器),对Python代码进行动态编译,所以可以显著提高Python代码的执行速度,所以它最大的特点就是可以提高执行效率。
  • JPython
运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
  • IronPython
和JPython类似,只不过IronPython是运行在微软.net平台上的Python解释器,可以直接把Python代码编译成.net的字节码,其优势也是显而易见的。

4. 说说你知道的Python3 和 Python2 之间的区别?

  • print
在 Python 2 中,print 是一条语句;在py2中,print语句后面接的是一个元组对象。而 Python3 中作为函数存在。而py3中,print函数可以接收多个未知参数。
# py2
>>> print("hello", "world")
('hello', 'world')# py3
>>> print("hello", "world")
hello word
  • 编码
Python2的默认编码是ASCII码;Python3默认采用UTF-8编码,因此不需要在文件顶部写# coding=utf-8了。
  • 字符串
py2py3表现转换作用
strbyte字节encode存储、传输
unicodestr字符decode展示
  • True和False
在Python2中,True和False是两个全局变量(名字),数值上分别对应1和0,因为是变量,可以指向其他对象。
# py2
>>> True = False
>>> print(True)
False
>>> True is False
True
Python3中修正了这个缺陷,True和False变为两个关键字,永远指向两个固定的对象,不允许被重新赋值。
# py3
>>> True = 1File "<stdin>", line 1
SyntaxError: cant't assign to keyword
  • 迭代器
在python2中很多返回列表对象的内置函数和方法在python3中都改成了类似于「迭代器」的对象,因为迭代器的惰性加载特性使得操作大数据更有效率。Python2中的range和xragne函数合并成了range函数。
另外,字典对象的dict.keys()、dict.values()方法都不在返回列表,而是以一个类似迭代器的“view”对象返回。高阶函数map、filter、zip返回的也不是列表对象。Python2的迭代器必须实现next方法,而python3改成了__next__
  • nonlocal
Python2中可以在函数里面用关键字global声明某个变量为全局变量,但是在嵌套函数中,想要给一个变量声明为非局部变量是没法实现的,在python3中,新增了关键字nonlocal,使得非局部变量成为可能。
def func():c = 1def foo():c = 12foo()print(c)func()输出:
1
def func():c = 1def foo():nonlocal cc = 12foo()print(c)func()输出:
12

5. Python3 和 Python2 中 int 和 long 区别?

Python2:long(长整型)数字末尾有一个L64位机器,范围-2^63~2^63-1超出上述范围,python 自动转化为 long (长整型)python3:所有整型都是 int,没有 long (长整型)

6. xrange 和 range 的区别?

python2:xrange:不会在内存中立即创建,而是在循环时,边循环边创建  range:在内存立即把所有的值创建  python3:只有 range,相当于 python2 中的 xrange  range:不会在内存中立即创建,而是在循环时,边循环边创建  

编码规范

7.什么是 PEP8?

8.了解 Python 之禅么?

9.了解 docstring 么?

10.了解类型注解么?

11.例举你知道 Python 对象的命名规范,例如方法或者类等

12.Python 中的注释有几种?

13.如何优雅的给一个函数加注释?

14.如何给变量加注释?

15.Python 代码缩进中是否支持 Tab 键和空格混用。

16.是否可以在一句 import 中导入多个库?

17.在给 Py 文件命名的时候需要注意什么?

18.例举几个规范 Python 代码风格的工具

数据类型

字符串

19.列举 Python 中的基本数据类型?

20.如何区别可变数据类型和不可变数据类型

21.将"hello world"转换为首字母大写"Hello World"

22.如何检测字符串中只含有数字?

23.将字符串"ilovechina"进行反转

24.Python 中的字符串格式化方式你知道哪些?

25.有一个字符串开头和末尾都有空格,比如“ adabdw ”,要求写一个函数把这个字符串的前后空格都去掉。

26. 获取字符串”123456“最后的两个字符。

s = "123456"
tmp = s[4:6:1]
print(tmp)输入:
56

27. 一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?

demo_str = "demo".encode("gbk")
demo = demo_str.decode('gbk').encode('utf-8'

28. (1)s=“info:xiaoZhang 33 shandong”,用正则切分字符串输出[‘info’, ‘xiaoZhang’, ‘33’, ‘shandong’]a = "你好 中国 ",去除多余空格只留一个空格。
29. 怎样将字符串转换为小写?

print(s.lower())
# 注意s.lower()不会改变原来字符串s里的大小写
  1. 单引号、双引号、三引号的区别?
1、在Python中,单引号和双引号都可以用来表示一个字符串,在没有遇到转义字符的情况下,是完全一样的;有转义字符的话,分情况。2、用单引号或者双引号定义一个字符串的时候只能把字符串连在一起写成一行,如果非要写成多行,就得在每一行后面加一个\表示连字符,或者用转义字符\n;此时就可以用三引号了,单双一样;三引号还有注释的作用。

列表

30. 已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。

tmp = set(AList)
AList = list(tmp)
print(AList)输出:
[1, 2, 3]

31. 如何实现 “1,2,3” 变成 [“1”,“2”,“3”]

s = "1,2,3"
lst = list(map(str, s.split(',')))
print(lst)输出:
['1', '2', '3']

32. 给定两个 list,A 和 B,找出相同元素和不同元素

A=[1,2,3,4,5,6,7,8,9]
B=[1,3,5,7,9]
print('A、B中相同元素:')
print(set(A)&set(B))
print('A、B中不同元素:')
print(set(A)^set(B))

33.[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]

34.合并列表[1,5,7,9]和[2,2,6,8]

35. 如何打乱一个列表的元素?

from random import shufflelst = [1, 3, 4]
shuffle(lst)
print(lst)输出:
[4, 3, 1]

字典

36.字典操作中 del 和 pop 有什么区别

37.按照字典的内的年龄排序

38.请合并下面两个字典 a = {“A”:1,“B”:2},b = {“C”:3,“D”:4}

39.如何使用生成式的方式生成一个字典,写一段功能代码。

40.如何把元组(“a”,“b”)和元组(1,2),变为字典{“a”:1,“b”:2}

综合

41. Python 常用的数据结构的类型及其特性?

42. 如何交换字典 {“A”:1,“B”:2}的键和值?

new_dic = {v: k for k, v in dic.items()}

43. Python 里面如何实现 tuple 和 list 的转换?

lst = [1,2,3]
tup = tuple(lst)
print(tup)输出:
(1, 3, 4)

44.我们知道对于列表可以使用切片操作进行部分元素的选择,那么如何对生成器类型的对象实现相同的功能呢?

45. 请将[i for i in range(3)]改成生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
(i for i in range(3))

46. a="hello"和 b="你好"编码成 bytes 类型

a = b"hello"
b = bytes("你好", 'utf-8')
c = "hello".encode(encoding='utf-8')
d = "你好".encode(encoding='utf-8')
print(a, end='\n')
print(b, end='\n')
print(c, end='\n')
print(d, end='\n'输出:
b'hello'
b'\xe4\xbd\xa0\xe5\xa5\xbd'
b'hello'
b'\xe4\xbd\xa0\xe5\xa5\xbd'

操作类题目

49.Python 交换两个变量的值

50.在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用

51.json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?

52.json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?

53.有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。

54.如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期,(比如 N 为 2,则输出 20190601)。

55.写一个函数,接收整数参数 n,返回一个函数,函数的功能是把函数的参数和 n 相乘并把结果返回。

56.下面代码会存在什么问题,如何改进?

57.一行代码输出 1-100 之间的所有偶数。

  1. with 语句的作用,写一段代码?

  2. python 字典和 json 字符串相互转化方法

  3. 请写一个 Python 逻辑,计算一个文件中的大写字母数量

  4. 请写一段 Python连接 Mongo 数据库,然后的查询代码。

  5. 说一说 Redis 的基本类型。

  6. 请写一段 Python连接 Redis 数据库的代码。

  7. 请写一段 Python 连接 MySQL 数据库的代码。

  8. 了解 Redis 的事务么?

  9. 了解数据库的三范式么?

  10. 了解分布式锁么?

  11. 用 Python 实现一个 Reids 的分布式锁的功能。

  12. 写一段 Python 使用 Mongo 数据库创建索引的代码。

高级特性

70.函数装饰器有什么作用?请列举说明?

71.Python 垃圾回收机制?

72.魔法函数 __call__怎么使用?

73.如何判断一个对象是函数还是方法?

74.@classmethod 和@staticmethod 用法和区别

75.Python 中的接口如何实现?

76.Python 中的反射了解么?

77.metaclass 作用?以及应用场景?

78.hasattr() getattr() setattr()的用法

79.请列举你知道的 Python 的魔法方法及用途。

80.如何知道一个 Python 对象的类型?

81.Python 的传参是传值还是传址?

82.Python 中的元类(metaclass)使用举例

83.简述 any()和 all()方法

84.filter 方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

85.什么是猴子补丁?

86.在 Python 中是如何管理内存的?

87.当退出 Python 时是否释放所有内存分配?

正则表达式

88.使用正则表达式匹配出

百度一下,你就知道

中的地址 a=“张明 98 分”,用 re.sub,将 98 替换为 100

89. 正则表达式匹配中(.*)和(.*?)匹配区别?

(.*)是贪婪匹配,会把满足正则的尽可能多的往后匹配(.*?)是非贪婪匹配,会把满足正则的尽可能少匹配
import re
s= str("<a>哈哈</a><a>啦啦</a>")
res1 = re.findall("<a>(.*)</a>",s)
print(res1)
res2 = re.findall("<a>(.*?)</a>",s)
print(res2)

90. 写一段匹配邮箱的正则表达式

合法邮箱的例子:
1234@qq.com(纯数字)
wang@126.com(纯字母)
wang123@126.com(数字、字母混合)
wang123@vip.163.com(多级域名)
wang_email@outlook.com(含下划线 _)
wang.email@gmail.com(含英语句号 .)
根据对以上邮箱的观察,可将邮箱分为两部分(“@”左边和右边部分)来进行分析:1 左边部分可以有数字、字母、下划线(_)和英语句号(.),因此可以表示成:[A-Za-z0-9]+([_\.][A-Za-z0-9]+)*。
2 右边部分是域名,按照域名的规则,可以有数字、字母、短横线(-)和英语句号(.),另外顶级域名一般为 2 ~ 6 个英文字母(比如“cn”、“com”、“site”、“group”、“online”),故可表示为:([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}。
要注意两点:
1 考虑到匹配邮箱时字符串的一头一尾不能有其它字符,故要加上开始标志元字符 ^ 和结束标志元字符 $。
2 英语句号(.)是正则表达式的元字符,因此要进行转义(\.)。
email = /^[A-Za-z0-9]+([_\.][A-Za-z0-9]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}$/

其他内容

91.解释一下 python 中 pass 语句的作用?

92.简述你对 input()函数的理解

93.python 中的 is 和==

94. Python 中的命名空间和作用域

命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过Python字典来实现的。命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。一般有三种命名空间:
1、内置名称(built-in names),Python语言内置的名称,比如函数名 abs、char 和异常名称BaseException、Exception 等等。
2、全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
3、局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)命名空间查找顺序:
假设我们要使用变量runoob,则 Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间。
如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:
NameError: name 'runoob' is not defined。命名空间的生命周期:
命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。
因此,我们无法从外部命名空间访问内部命名空间的对象。
作用域就是一个Python程序可以直接访问命名空间的正文区域。在一个python程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:
L(Local):最内层,包含局部变量,比如一个函数/方法内部。
E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。
比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
G(Global):当前脚本的最外层,比如当前模块的全局变量。
B(Built-in): 包含了内建的变量/关键字等。,最后被搜索
规则顺序: L –> E –> G –>gt; B。
在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。注意:Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,

95.三元运算写法和应用场景?

96.了解 enumerate 么?

97.列举 5 个 Python 中的标准模块

98.如何在函数中设置一个全局变量

99.pathlib 的用法举例

100.Python 中的异常处理,写一个简单的应用场景

101.Python 中递归的最大次数,那如何突破呢?

102.什么是面向对象的 mro

103.isinstance 作用以及应用场景?

104.什么是断言?应用场景?

105.lambda 表达式格式以及应用场景?

106.新式类和旧式类的区别

107.dir()是干什么用的?

108.一个包里有三个模块,demo1.py, demo2.py, demo3.py,但使用 from tools import *导入模块时,如何保证只有 demo1、demo3 被导入了。

109.列举 5 个 Python 中的异常类型以及其含义

110.copy 和 deepcopy 的区别是什么?

111.代码中经常遇到的*args, **kwargs 含义及用法。

112.Python 中会有函数或成员变量包含单下划线前缀和结尾,和双下划线前缀结尾,区别是什么?

113.w、a+、wb 文件写入模式的区别

114.举例 sort 和 sorted 的区别

115.什么是负索引?

116.pprint 模块是干什么的?

117.解释一下 Python 中的赋值运算符

118.解释一下 Python 中的逻辑运算符

119.讲讲 Python 中的位运算符

120.在 Python 中如何使用多进制数字?

121.怎样声明多个变量并赋值?

算法和数据结构

122.已知:

(1) 从 AList 和 BSet 中 查找 4,最坏时间复杂度那个大?

(2) 从 AList 和 BSet 中 插入 4,最坏时间复杂度那个大?

123.用 Python 实现一个二分查找的函数

124.python 单例模式的实现方法

125.使用 Python 实现一个斐波那契数列

126.找出列表中的重复数字

127.找出列表中的单个数字

128.写一个冒泡排序

129.写一个快速排序

130.写一个拓扑排序

131.python 实现一个二进制计算

132.有一组“+”和“-”符号,要求将“+”排到左边,“-”排到右边,写出具体的实现方法。

133.单链表反转

134.交叉链表求交点

135.用队列实现栈

136.找出数据流的中位数

137.二叉搜索树中第 K 小的元素

爬虫相关

138.在 requests 模块中,requests.content 和 requests.text 什么区别

139.简要写一下 lxml 模块的使用方法框架

140.说一说 scrapy 的工作流程

141.scrapy 的去重原理

142.scrapy 中间件有几种类,你用过哪些中间件

143.你写爬虫的时候都遇到过什么?反爬虫措施,你是怎么解决的?

144.为什么会用到代理?

145.代理失效了怎么处理?

146.列出你知道 header 的内容以及信息

147.说一说打开浏览器访问 百度一下,你就知道 获取到结果,整个流程。

148.爬取速度过快出现了验证码怎么处理

149.scrapy 和 scrapy-redis 有什么区别?为什么选择 redis 数据库?

150.分布式爬虫主要解决什么问题

151.写爬虫是用多进程好?还是多线程好? 为什么?

152.解析网页的解析器使用最多的是哪几个

153.需要登录的网页,如何解决同时限制 ip,cookie,session(其中有一些是动态生成的)在不使用动态爬取的情况下?

154.验证码的解决(简单的:对图像做处理后可以得到的,困难的:验证码是点击,拖动等动态进行的?)

155.使用最多的数据库(mysql,mongodb,redis 等),对他的理解?

网络编程

156.TCP 和 UDP 的区别?

157.简要介绍三次握手和四次挥手

158.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

并发

159.举例说明 conccurent.future 的中线程池的用法

160. 说一说多线程,多进程和协程的区别。

1、进程是操作系统分配的最小单位,线程是CPU调度的最小单位,协程既不是进程也不是线程,协程仅仅是一个特殊的函数,协程和进程、线程不是一个维度的。2、一个进程由一个或者多个线程组成,线程是一个进程中代码的不同执行路线,协程是属于一种操作,是由用户自己去操作线程的切换(在用户态进行切换),这样的话,就可以大大降低线程切换(在内核态切换)的花销。3、切换进程需要的花销(时间、资源等)比切换线程要大,切换线程也是需要花销的,协程与进程一样,切换是存在上下文切换问题的。4、一个进程可以包含多个线程,一个线程可以包含多个协程。5、一个线程内的多个协程虽然可以切换,但是多个协程是串行执行的,只能在一个线程内运行,没法利用CPU多核能力。
# 多进程执行多任务
import os
import time
from multiprocessing import Pool# multiprocessing模块提供了一个Pool进程池的方式批量创建子进程。def long_time_task(name):print('Run task %s (%s)...' % (name, os.getpid()))start = time.time()time.sleep(1)  # 线程推迟执行的时间end = time.time()print('Task %s runs %0.2f seconds.' % (name, (end - start)))if __name__ == '__main__':print('Parent process %s.' % os.getpid())p = Pool(5)  # Pool对象,参数5表示调用多少个并行进程进行程序运行,pool的默认容量为CPU的计算核数量for i in range(10):p.apply_async(long_time_task, args=(i,))  # p.apply_async()函数给进程池添加进程任务,它的参数包括待运行程序和程序的传入参数。print('Waiting for all subprocess done ...')p.close()  # 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。p.join()  # join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。print('All subprocesses done.')# 多线程执行多任务
import time
import threading
# threading模块# 新线程执行的代码:def loop():print('thread %s is running...' % threading.current_thread().name)# threading.current_thread()永远返回当前线程的实例n = 0while n < 5:n = n + 1print('thread %s >>> %s' % (threading.current_thread().name, n))time.sleep(1)print('thread %s ended.' % threading.current_thread().name)print('thread %s is running...' % threading.current_thread().name)t = threading.Thread(target=loop, name='LoopThread')  # 用LoopThread命名子线程t.start()t.join()print('thread %s ended.' % threading.current_thread().name) 

161. 简述 GIL

  • 预备知识
并行与并发的理解:并发:交替处理多个任务的能力; 
并行:同时处理多个任务的能力; 并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力,强调的是同时.最大的区别:是否是『同时』处理任务。
  • GIL(全局解释器锁)
通过代码可以发现多进程可以充分使用cpu的两个内核而多线程却不能充分使用cpu的两个内核 问题:通过验证我们发现多线程并不能真正的让多核cpu实现并行。 原因: 
cpython解释器中存在一个GIL(全局解释器锁),其作用就是保证同一时刻只有一个线程可以执行代码, 
这造成使用多线程的时候无法实现并行。结论: 
1.在处理像科学计算这类需要持续使用cpu的任务的时候单线程会比多线程快,可以使用多进程利用多核的CPU资源。
2.在处理像IO操作等可能引起阻塞的这类任务的时候多线程会比单线程,因为遇到IO阻塞会自动释放GIL锁 解决方案法: 
1:更换解释器比如使用jpython(java实现的python解释器) 
2:使用多进程完成多任务的处理

162. 进程之间如何通信

Process之间肯定是需要通信的,操作系统提供了很多机制来实现进程间的通信。Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。
from multiprocessing import Process, Queueimport os, time, random# 写数据进程执行的代码:def write(q):print('Process to write: %s' % os.getpid())for value in ['A', 'B', 'C']:print('Put %s to queue...' % value)q.put(value)time.sleep(random.random())# 读数据进程执行的代码:def read(q):print('Process to read: %s' % os.getpid())while True:value = q.get(True)print('Get %s from queue.' % value)if __name__=='__main__':# 父进程创建Queue,并传给各个子进程:q = Queue()pw = Process(target=write, args=(q,))pr = Process(target=read, args=(q,))# 启动子进程pw,写入:pw.start()# 启动子进程pr,读取:pr.start()# 等待pw结束:pw.join()# pr进程里是死循环,无法等待其结束,只能强行终止:pr.terminate()

163.IO 多路复用的作用?

164.select、poll、epoll 模型的区别?

165.什么是并发和并行?

166.一个线程 1 让线程 2 去调用一个函数怎么实现?

167.解释什么是异步非阻塞?

168. threading.local 的作用?

内部自动为每个线程维护一个空间(字典),用于当前存取属于自己的值。保证线程之间的数据隔离。{
线程ID: {...}
线程ID: {...}
线程ID: {...}
线程ID: {...}
}

Git 面试题

169.说说你知道的 git 命令

170.git 如何查看某次提交修改的内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux负载均衡软件LVS之一(概念篇)

2019独角兽企业重金招聘Python工程师标准>>> 一、 LVS简介 LVS是Linux Virtual Server的简称&#xff0c;也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目&#xff0c;它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分…

学成在线--10.页面预览

文章目录一.需求分析二. 搭建环境1.在cms服务中集成freemarker&#xff1a;2.在application.yml配置freemarker三.Service四.Controller五.页面预览测试-- 配置Nginx代理六.页面预览测试-- 添加“页面预览”链接一.需求分析 页面在发布前增加页面预览的步骤&#xff0c;方便用…

【代码刷题】排序算法总结(python实现)

排序算法总结&#xff08;Python实现&#xff09;算法介绍算法分类相关概念1. 冒泡排序&#xff08;Bubble Sort&#xff09;1.1 思想1.2 python实现1.3 复杂度1.4 稳定性2. 快速排序&#xff08;Quick Sort&#xff09;2.1 思想&#xff08;伪代码&#xff09;2.2 python实现2…

学成在线--11.RabbitMQ快速入门

文章目录一.RabbitMQ简介二.相关知识1.AMQP2.JMS是什么 &#xff1f;三.RabbitMQ的工作原理四.Hello World1.创建Maven工程2.生产者3.消费者五.总结一.RabbitMQ简介 MQ全称为Message Queue&#xff0c;即消息队列&#xff0c; RabbitMQ是由erlang语言开发&#xff0c;基于AMQP…

maven工程建立和SSM(springMVC+spring+mybatis)整合

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.环境&#xff1a; maven 版本&#xff1a;3.5.1 ecelipse mars.2 JDK : jdk1.8.0_45 tomcat : apache-tomcat-8.0.0-RC1 2. 建…

Java——网络编程(实现基于命令行的多人聊天室)

2019独角兽企业重金招聘Python工程师标准>>> 目录&#xff1a; 1.ISO和TCP/IP分层模型 2.IP协议 3.TCP/UDP协议 4.基于TCP的网络编程 5.基于UDP的网络编程 6.基于TCP的多线程的聊天室的实现 1.ISO和TCP/IP分层模型&#xff1a; OSI分层模型&#xff08;Open System …

一网打尽中文编码转换---6种编码30个方向的转换

一网打尽中文编码转换——6种编码30个方向的转换 1.问题提出 在学编程序时&#xff0c;曾经有人问过“你可以编一个记事本程序吗?”当时很不屑一顾&#xff0c;但是随着学习MFC的深入&#xff0c;了解到记事本程序也并非易事&#xff0c;难点就是四种编码之间的转换。 对于编…

十万服务器秒级管控 腾讯云如何将AIOps用于日常管理?

AIOps&#xff0c;是指基于算法的 IT运维&#xff08;Algorithmic IT Operations&#xff09;&#xff0c;由 Gartner定义的新类别&#xff0c;源自业界之前所说的 ITOA&#xff08;IT Operations and Analytics&#xff09;。我们已经到达了这样的一个时代&#xff0c;数据科学…

ssm(springMVC + spring+MyBatis) 小例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 整体环境参见本人另一文&#xff1a;http://blog.csdn.net/jiangyu1013/article/details/51983360 此工程访问入口为index.jsp页面. 工…

学成在线--13.RabbitMQ工作模式

文章目录一.Work queues二.Publish/subscribe1.工作模式2.代码1&#xff09;生产者2&#xff09;消费者3.测试4.思考三.Routing1.工作模式2.代码1&#xff09;生产者2&#xff09;消费者3.测试4.思考四.Topics1.工作模式2.代码1&#xff09;生产者2&#xff09;消费者3.测试4.思…

《C++字符串完全指南——第一部分:win32 字符编码》

《C字符串完全指南--第一部分:win32 字符编码》 原作者:Michael Dun 译 者:Dingqiao Wang 引言 毫无疑问&#xff0c;你肯定见过像TCHAR, std::string, BSTR等等这类字符串类型.也包括一些以_tcs开头的奇怪的宏。也许你正盯着屏幕"哇哇"的发愁&#xff0c;然…

学成在线--14.使用RabbitMQ完成页面发布

文章目录一.技术方案二.页面发布——消费方1.需求分析2.创建Cms Client工程1&#xff09;创建maven工程2&#xff09;配置文件3&#xff09;启动类3.RabbitmqConfig配置类4.定义消息格式5.PageDao1&#xff09;使用CmsPageRepository 查询页面信息2&#xff09;使用CmsSiteRepo…

Log4J日志配置详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、Log4j简介 Log4j有三个主要的组件&#xff1a;Loggers(记录器)&#xff0c;Appenders (输出源)和Layouts(布局)。这里可简单理解为日…

中文编码杂谈

编码问题的例子 在windows自带的notepad&#xff08;记事本&#xff09;程序中输入“联通”两个字&#xff0c;保存后再次打开&#xff0c;会发现“联通”不见了&#xff0c;代之以“”的乱码。这是windows平台上典型的中文编码问题。即文件保存的时候是按照ANSI编码&#xff…

easyUI 日期控件修改...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 个人觉得easyUI挺好用的。 它的中文文档地址&#xff1a; http://www.zi-han.net/case/easyui/ 日期本来效果是这样的&#xff1a; 改…

面向对象分析的三个模型与5个层次

在面向对象分析中&#xff0c;主要由对象模型、动态模型和功能模型组成。对象模型是最基本、最重要、最核心的。 面向对象建模得到的模型包含系统的3个要素&#xff0c;即静态结构(对象模型)、交互次序(动态模型)和数据变换(功能模型)。解决的问题不同&#xff0c;这3个子模型…

学成在线--15.课程计划查询

文章目录一.需求分析二.页面原型1.tree组件介绍2.webstorm配置jsx三.API接口1.数据模型2.自定义模型类3.接口定义四.sql语句五.服务器端1.Dao1&#xff09;Mapper接口2&#xff09;Mapper映射文件2.Service3.Controller4.测试六.前端1.Api方法2.Api调用1&#xff09;定义查询课…

团队作业-项目答辩

1. 王书磊 1600802063 http://www.cnblogs.com/wsl-1117/ 刘令斌 1600802017 http://www.cnblogs.com/liulingbin/ 许浩然 1600802066 https://www.cnblogs.com/xuhaoran1/ 成明龙 1600802038 http://www.cnblogs.com/CMLCML/ 2这是我们的效果图. 3.&#xff08;1&#xff09;修…

Java构造和解析Json数据的两种方法详解一

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在www.json.org上公布了很多JAVA下的json构造和解析工具&#xff0c;其中org.json和json-lib比较简单&#xff0c;两者使用上差不多但还是…

JsRender 前端渲染模板常用API学习

JsRender 常用API 1. $.templates() $.templates()方法是用来注册或编译模板的&#xff0c;使用的情况有以下几种。 把html字符串编译编译成模板获取使用script标签声明的模板&#xff0c;并返回一个模板对象把html字符串或者在script标签中声明的模板注册成命名模板获取之前就…