Python面试180道题

版权声明:本文为CSDN博主「CSDN学院官方账号」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/csdngkk/article/details/99116607

本题答案基于Python3.6.4解释器作答。

本文答案为本人自己作的可能有错,错了麻烦各位大佬留言告诉我一下。

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

1 import os
2 import random
3 import pymysql
4 import tkinter
5 import pillow

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

bool 
int
float
str
list
dict
tuple
set

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

1 with open("1.txt", "w") as file:
2     my_str = "asfdg"
3     file.write(my_str)
4 
5 自动关闭文件

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

可变数据类型:
    列表、字典、集合
    可以在内存空间内修改数据
不可变数据类型:
    字符串、数字、字符串  
    不可以在内存空间内修改数据,一但修改数据,内存空间地址会发生变化

5.Python 获取当前日期?

import datetime

print(datetime.datetime.now())
print(datetime.datetime.today())

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

1 my_str = "asssssss"
2 print(my_str.count("s"))

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

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

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

1 try:尝试运行可能出错的代码
2 except:捕获异常,并对异常进行处理
3 else:当程序没有异常时执行else语句内的代码
4 finally:无论程序是否出现异常都执行finall语句内的代码

10.遇到 bug 如何处理 

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

Python 是一门解释型语言,其特点是简单易学习。
Java是一门编译型语言,代码第二次执行时比Python代码执行速度快。

2.简述解释型和编译型编程语言

解释型语言在执行时,一句一句执行,
每执行一句就编译一句,每次代码执行的速度几乎不变。

编译型语言先将代码编译成二进制可执行文件,
然后再执行编译后生成的文件,第二次执行代码时速度会比第一次快

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

1 Cpython:python官方的解释器
2 Jpython:JAVA平台的Python解释器
View Code

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

Python3 中可以使用f-string
Python3中的字典变为有序字典
Python2中的字典是无需字典,想要定义有序字典需要使用OrderDic

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

python3 int 包含long型数据

6.xrange 和 range 的区别?

7.什么是 PEP8?

8.了解 Python 之禅么?

9.了解 docstring 么?

10.了解类型注解么?

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

Python的命名规则(使用变量、类、方法等):
    变量名可以使用下划线、数字、字母等进行组合,但不能以数字开头;
    模块或者包如果使用数字开头将不能被其他模块导入。
View Code

12.Python 中的注释有几种?

单行注释:以#开头
多行注释:'''注释'''"""注释"""
View Code

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

14.如何给变量加注释?

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

在Python代码中不支持Tab键和空格混用,在一部分编辑器里1个Tab键等于4个空格,但在记事本里1个Tab键等于8个空格。
View Code

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

可以,但不推荐

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

当python文件需要当做模块使用时,不能使用数字开头,并且在实际开发中不能使用中文命名。

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

PyCharm
SubLime

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

1 int:整型
2 float:浮点型(小数)
3 str:字符串
4 tuple:元组
5 list:列表
6 dict:字典
7 set:集合
8 range:范围
9 bytes:字节
View Code

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

可变数据类型:列表、字典、集合
    可以再指定的内存空间内对数据进行修改、删除、增加等操作
不可变数据类型:字符串、数字型、元组
    不能再指定的内存空间内对数据进行操作,一但操作元素内存地址就会发生改变。
View Code

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

my_str = "hello world"

print(my_str.title())

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

my_str = "1234567890"
print(my_str.isdigit())

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

my_str = "ilovechina"
print(my_str[::-1])

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

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

my_str = "  adabdw  "
new_str = my_str.strip()
print(new_str)

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

my_str = "123456"
print(my_str[-1],my_str[-2])

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

28. (1)s="info:xiaoZhang 33 shandong",用正则切分字符串输出['info', 'xiaoZhang', '33', 'shandong'](2) a = "你好 中国 ",去除多余空格只留一个空格。

29. (1)怎样将字符串转换为小写 (2)单引号、双引号、三引号的区别?

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

AList = [1,2,3,1,2]
my_set = set(AList)
AList = list(my_set)
print(AList)

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

my_str = "1,2,3" 
my_list = my_str.split(",")
print(my_list)

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

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

1 my_list = [[1, 2], [3, 4], [5, 6]]
2 new_list = [data for data_list in my_list for data in data_list]
3 print(new_list)

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

list_1 = [1, 5, 7, 9]
list_2 = [2, 2, 6, 8]
list_1.extend(list_2)
print(list_1)
View Code

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

给列表转成集合,再将集合转成列表

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

del关键字,删除字典中的数据
pop方法删除字典中额数据后会返回所删除的数据值

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

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

1 a = {"A": 1, "B": 2}
2 b = {"C": 3, "D": 4}
3 for key, value in b.items():
4     a[key] = value
5 print(a)
View Code

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

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

tuple_1 = ("a", "b")

tuple_2 = (1, 2)

my_dict = {}
for lengh in range(len(tuple_1)):
    my_dict[tuple_1[lengh]] = tuple_2[lengh]

print(my_dict)
View Code

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

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

my_dict = {"A": 1, "B": 2}

my_dict["A"], my_dict["B"] = my_dict["B"], my_dict["A"]
print(my_dict)
View Code

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

my_tuple = (0, 1, 2, 3)
my_list = list(my_tuple)
print(my_list)
View Code

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

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

(i for i in range(3))

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

a = "hello"
b = "你好"

print(a.encode())
print(b.encode())

49.Python 交换两个变量的值

x,y = y,x

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

read : 将文件中的内容以字符串方式读出来
readline : 逐行读取文件中的内容
readlines : 将文件中的数据读取出来,并以列表方式返回

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

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

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

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

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

def outer(n):
    def inner(a):
        return a * n

    return inner


f = outer(1)
print(f(2))

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

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

new_list = [num for num in range(1, 101) if num % 2 == 0]
print(new_list)

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

with语句接收类中__enter__返回的对象,并给对象起个别名,
然后通过接受到的对象进行相应的操作,
当with语句内的代码执行完毕后,自动执行__exit__方法。
import socket


class MyClient(object):
    def __enter__(self):
        self.__ck = socket.socket(socket.AF_INET, socket.SO_REUSEADDR)
        return self.__ck

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.__ck.close()


def main():
    with MyClient() as cl:
        cl.connect(('127.0.0.1', '8000'))
        send_data = '请给我返回数据!'
        cl.send(send_data.encode('utf-8'))
        result = cl.recv(1024).decode('utf-8')
        print(result)


if __name__ == '__main__':
    main()

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

import josn
data_list = []
for i in rang(5):
    data_dict= {}
    data_dict['key'] = 'value'
    data_list.append(data_dict)
josn.dumps(data_list,ensure_ascii=False)

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

import re

with open('data.txt', 'r') as file:
    data = file.read()
print(re.findall(r'[A-Z]', data).__len__())

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

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

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

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

import pymysql

con = pymysql.connect(host='localhost',port=3306,user='root',password='password',database='database',charset='utf8')
cur = con.cursor()
sql = ''' select/update/delect/insert '''
cur.execute(sql,(参数,))
cur.close()
con.close()

65.了解 Redis 的事务么?

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

数据库的第一范式要求数据需要具有原子性;
数据库的第二范式要求数据库需要在满足第一范式的基础上,一张表只描述一件事;
数据库的第三范式要求数据库需要在满足第二范式的基础上,数据表中存储的数据不能冗余。

67.了解分布式锁么?

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

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

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

装饰器的作用:在不改变原有函数代码的基础上,对原有函数进行功能的扩充。
举例:
def outer(func):
    def inner():
        print('装饰器代码')
        func()
    return inner

@outer
def show():
    print('show run.....')


show()

71.Python 垃圾回收机制?

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

通过在子类中对call进行重写,然后通过子类创建的对象名后加()进行调用。
案例:
class Person(object):
    def __init__(self, name):
        self.__name = name

    def __call__(self, *args, **kwargs):
        print(self.__name)

xiaoming = Person('小明')
xiaoming()

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

定义在类外面的叫函数。
定义在类里的叫做方法,其本质也是一个函数。

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

@classmethod:类方法
@staticmethod:类中的静态方法

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

76.Python 中的反射了解么?

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

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

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

__init__()方法:初始化对象
__str__()方法:当调用print()方法时输出str方法中的数据
__del__方法:销毁对象
__dict__方法:查看对象的所有属性和方法
__class__方法:获取对象所在的类

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

type(对象)

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

传递的是变量或函数在内存空间中的地址。

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

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

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

85.什么是猴子补丁?

通过monkey补丁让gevent识别主线程中的所有耗时操作

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

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

88.使用正则表达式匹配出<html><h1>百度一下,你就知道</html>中的地址

str = '<html><h1>百度一下,你就知道</h1></html>'
res = re.match(r'<([a-zA-Z]+)><([hH1-6]+)>.*</(\2)></(\1)>', str)
print(res.group())

a="张明 98 分",用 re.sub,将 98 替换为 100

str = "张明 98 分"
str = re.sub(r'\d+','100',str)
print(str)

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

.*表示贪婪匹配,匹配最大长度数据
.*?表示非贪婪匹配,匹配最小长度数据

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

import re
# 12345667@qq.com
email = '12345667@139.com'
res = re.match(r'\w{4,16}@(163|qq|139)\.com',email)
print(res.group())

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

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

接受用户从键盘上输入的值,并返回字符串

93.python 中的 is 和==

94.Python 中的作用域

Python中变量或函数的作用域可以分为全局和局部,
定义在类外面或函数外面的变量和函数作用范围为全局即整个.py文件中,
定义在类中或函数中的变脸会函数作用范围为局部即只能在当前的类中或函数中使用。

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

a= 1
b=2
print(b) if a >b else print(a)

96.了解 enumerate 么?

enumerate方法,可以结合容器类型使用,在使用时把容器类型变量当做参数写在enumerate(容器类型变量)中,
其返回值为容器类中的数据值和数据值对应的索引下标。

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

os
random
time
pymysql

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

使用global关键字

99.pathlib 的用法举例

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

try:
    f = open('1.txt','r')
    f.read()
except Exception as e:
    print(e)
else:
    print('文件打开成功')
finally:
    f.close()

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

102.什么是面向对象的 mro

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

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

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

lambda 参数:代码
多结合列表推导式使用

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

新式类:
class A(object):
    pass

旧式类:
class A():
    pass
class A:
    pass 

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

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

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

AttributeError:变量未定义
WindowsError:I/O流错误
Exception:异常类基类
BaseException:所有异常类的基类

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

copy为浅拷贝只拷贝一层对象的引用,当拷贝的对象为复杂数据时不具有数据的独立性;
deepcopy为深拷贝拷贝所有对象的引用,当拷贝的对象为复杂数据时,不会因为原数据的修改而改变,具有数据独立性。

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

*args:不定长位置参数,在使用*args时,可以使用元组进行传参
**kwargs:不定长关键字参数,使用**kwargs时可以使用字典进行关键字传参,键名为关键字名,键值为参数值

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

单下划线的变量和函数,为普通变量和函数
双下划綫的变量和函数,为私有变量和函数

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

w模式:不保存文件原有数据,在使用w模式时会清空原文件内的数据,并重新写入。
a+模式:在原文件数据内容后追加新数据。
wb模式:不保存文件原有数据,在使用wb模式时会清空原文件内的数据,并将数据以字节型式重新写入。

114.举例 sort 和 sorted 的区别

115.什么是负索引?

在pyhton中可以使用负索引,最后一个元素的索引值为-1.从右向左依次递减。

116.pprint 模块是干什么的?

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

-=:将数据先进行-操作后赋值给变量
+=:将数据先进行+操作后赋值给变量
*=:将数据先进行*操作后赋值给变量
/=:将数据先进行/操作后赋值给变量
//=:将数据先进行//操作后赋值给变量
%=:将数据先进行%操作后赋值给变量

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

and:全真为真,有假即假
or:有真为真,全假即假
not:取反

119.讲讲 Python 中的位运算符

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

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

a, b, c = 1, 2, 3

122.已知:

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

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

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

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

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

my_list = [0, 1]


def fibonacci(n):
    for i in range(n):
        my_list.append(my_list[i] + my_list[i + 1])

    print(my_list)


fibonacci(5)

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

my_List = [1, 2, 3, 4, 2, 4, 44, 3]
new_list = [value for value in my_List if not my_List.count(value) == 1]
data_set = set(new_list)
data_list = list(data_set)
print(data_list)

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

1 my_List = [1, 2, 3, 4, 2, 4, 44, 3]
2 new_list = [value for value in my_List if my_List.count(value) == 1]
3 print(new_list)

128.写一个冒泡排序

129.写一个快速排序

130.写一个拓扑排序

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

def arithmetic(num):
    list = []
    while True:
        if num / 2 == 0:
            break
        else:
            list.append(num % 2)
            num = int(num / 2)
    return list
list = arithmetic(19)
print(list[::-1])

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 的区别?

UDP是无连接的不稳定的通信协议,其传输速度快但是不稳定容易造成数据的丢失。
TCP是面向连接的稳定的通信协议,其通过建立连接、流量控制、超时重传等方法来保证数据的完整性。

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

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

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

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

进程是操作系统分配资源的最小单位,线程是CPU调度的最小单位;
线程属于进程,进程相当于地主提供土地和种地的工具,而线程相当于农民,使用地主提供的资源为地主干活。
并且进程之间不共享全局变量,而线程之间共享全局变量,
多进程消耗资源,多用于科学计算;
多线程相对多进程消耗资源小,但效率低日常开发时多实用多线程来实现多任务。
协程属于线程,主要是在一个线程中实现多任务的方式。

161.简述 GIL

162.进程之间如何通信

本机中的进程通过Queue(队列)进行数据通信,
两个设备间的进程通过socket进行数据通信。

163.IO 多路复用的作用?

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

165.什么是并发和并行?

并发是指在进程个数大于CPU内核数时,进程之间相互调用CPU进行工作。
并行是指进程个数小于CPU内核数时,每个进程同时调用不同的CPU内核进行工作。

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

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

168.threading.local 的作用?

169.说说你知道的 git 命令

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

posted @ 2019-11-13 22:43  老王同鞋  阅读(2149)  评论(0编辑  收藏  举报