Python 常见170道面试题解析


基础

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

  • os:与操作系统相关联的函数,path 的 join()、split()、exists();mkdir()、listdir()、rename()、system() 等
  • sys:通常用于命令行参数
  • re:正则匹配,match、search、findall、sub、split、complie 等
  • math:数学运算,三角函数(sin, cos, tan…)、向上向下取整(ceil, floor)、开方(sqrt) 等
  • random:随机模块,random、randint、randrange 等
  • calendar:日历模块
  • time:时间模块,时间戳 time.time、线程休眠 time.sleep()
  • datetime:处理日期时间

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

  • Number(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Set(集合)
  • Dictionary(字典)

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

打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的 f.open 写法,我们需要 try, except, finally… 做异常判断,并且文件最终不管遇到什么情况,都要执行 finally f.close() 关闭文件,with 方法帮我们实现了 finally 中 f.close()

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

可变数据类型更改后地址不发生改变,不可变数据类型更改后地址发生改变

可变:

  • 列表 (list)
  • 字典 (dict)
  • 集合 (set)

不可变:

  • 数字 (int, float)
  • 布尔 (bool)
  • 字符串 (str)
  • 集合 (set)

5.Python 获取当前日期?

import datetime
now_time = datetime.datetime.now()

# 或者

import time
now_time = time.localtime(time.time())

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

(1)setdefault()的方法判断

	message = 'It was a bright cold day in April, and the clocks were striking thirteen.' 
	count = {
   }
	for character in message:
	    count.setdefault(character, 0) # 方法调用确保了键存在于 count 字典中(默认值是 0)
	    count[character] = count[character] + 1
	print(count)
	
(2)传统方法

	count = {
   }
	for i in message:
	    if i not in count:
	        count[i] = 1
	    else:
	        count[i] += 1
	print(count)
	
(3)Counter方法

	from collections import Counter
	count= Counter(message) 
	print(count)

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

  • Python:os.remove(path)
  • Linux:rm -f path

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

# 你随便输入一句话 看我喜不喜欢 不喜欢我就抛出异常
# 自定义异常类
class UnlikeError(BaseException):
    def __init__(self,msg,text):
        self.msg = msg
        self.text = text
        
# 函数中可能抛出异常
def hello():
    text = input("输入一段话:")
    if text == "你真帅":
        print("你说得对!")
    else:
        raise UnlikeError("你再看看...","另一个参数")
        
# 捕获异常
try:
    hello()
    
# 获取异常对象
except UnlikeError as e:
    print(e.text)

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

  • try, except, else… :没有捕获到异常,则执行 else 语句
  • try, except, finally… :不管是否捕获到异常,都执行 finally 语句
try:
	num = 100
	print(num)
except NameError as errorMsg:
	print('产生错误了:%s'% errorMsg)
else:
	print('没有捕捉到异常,则执行该语句')


try:
	num = 100
	print(num)
except NameError as errorMsg:
	print('产生错误了:%s'% errorMsg)
finally:
	print('不管是否捕捉到异常,都执行该语句')
	

运行结果如下:

100
没有捕捉到异常,则执行该语句
100
不管是否捕捉到异常,都执行该语句

10.遇到 bug 如何处理

  • 使用 debug 模式调试
  • 使用 try, except, else… 或 try, except, finally… 捕捉异常

语言特性

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

Python 是一门语法简洁优美,功能强大无比,应用领域非常广泛,具有强大完备的第三方库,他是一门强类型的可移植、可扩展,可嵌入的解释型编程语言,属于动态语言。

  • 语言特点
    简洁、优雅,省略了各种大括号和分号,还有一些关键字、类型说明

  • 语言类型
    解释型语言,运行的时候是逐行解释并运行,所以调试代码很方便,开发效率高

  • 第三方库
    python 是开源的,并且 python 的最近几年发展迅猛,应用领域很多。比如:Web、运维、自动化测试、爬虫、数据分析、人工智能;Python 具有非常完备的第三方库。

  • 缺点就是 Python 的执行速度不够快
    python 是一门解释型语言,所以它的速度相较于 C/C++ 这种编译型语言会慢一些,但是并不影响使用
    因为现在的硬件配置都非常的高,基本没什么影响,除非是一些实时性比较强的程序可能会受到一些影响,但是也是有解决办法的,可以嵌入 C/C++代码

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

  • 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将我们写的代码翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。

  • 编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统,把源高级程序编译成为机器语言文件,翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。

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

  • CPython
    C语言开发的,使用最广的解释器
  • IPython
    基于 CPython 之上的一个交互式计时器,交互方式增强,功能和 CPython 一样
  • PyPy
    目标是执行效率,采用 JIT 技术,对 python 代码进行动态编译,提高执行效率
  • JPython
    运行在 Java 上的解释器,直接把 python 代码编译成 Java 字节码执行
  • IronPython
    运行在微软 .NET 平台上的解释器,把 python 编译成. NET 的字节码

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

  • print 在 Python3 中是函数必须加括号;Python2 中 print 为 class。
  • Python2 中使用 xrange;Python3 使用 range。
  • Python2 中默认的字符串类型默认是 ASCII;Python3 中默认的字符串类型是 Unicode。
  • Python2 中1/2的结果是整型 (0);Python3 中是浮点类型 (0.5),不再区分 int 和 long。
  • Python2 中声明元类:
    _metaclass_ = MetaClass
    Python3 中声明元类:
    class newclass(metaclass = MetaClass)pass
    

详细了解可参考这篇文章:点此跳转

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

Python2 有 int 和 long 类型。int 类型最大值不能超过 sys.maxint,而且这个最大值是平台相关的。可以通过在数字的末尾附上一个L来定义长整型,显然,它比 int 类型表示的数字范围更大。在 Python3 里,只有一种整数类型 int,大多数情况下,和 Python2中的长整型类似。

6.xrange 和 range 的区别?

python3 中不存在 python2 的 xrange();python3 的 range 就是 python2 的 xrange。

  • 在 python2 中,range 返回一个列表,即 range(3) 返回 [0,1,2],
    而 xrange 返回一个 xrange 对象,即 xrange(3) 返回 iterator 对象,它与 Java 迭代器类似,并在需要时生成数字。
  • 如果我们需要多次迭代相同的序列,我们更喜欢 range(),因为 range 提供了一个静态列表。而 xrange() 每次重建序列。
  • xrange() 不支持切片和其他列表方法。
  • xrange() 的优点是,当任务迭代大范围时,它可以节省内存。
  • 在 python3 中,范围函数现在执行 xrange 在 python 2 中的功能,因此为了保持代码的可移植性,我们可能希望坚持使用范围。所以 python 3 的范围函数是来自 python 2 的 xrange。

编码规范

7.什么是 PEP8?

PEP 是 Python Enhancement Proposal 的缩写,翻译过来就是 Python 增强建议书;
PEP8 是 python 的一种编码规范,具体如下:

  1. 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用 tab,更不能混合使用 tab 和空格。
  2. 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
  3. 类和 top-level 函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。
  4. 模块导入的顺序:按标准、三方和自己编写顺序依次导入,之间空一行。
  5. 不要在一句 import 中多个库,比如 import os, sys 不推荐
  6. 避免不必要的空格
  7. 注释必须要有
  8. 函数命名要遵循规范
  9. 尽可能使用 ‘is’ ‘is not’ 取代 ‘==’,比如 if x is not None 要优于 if x
  10. 使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自 Exception。
  11. 异常中 try 的代码尽可能少。

8.了解 Python 之禅么?

适当回答几条即可:点此跳转

9.了解 docstring 么?

  • DocStrings 文档字符串是一个重要工具,用于解释文档程序,帮助你的程序文档更加简单易懂。
    我们可以在函数体的第一行使用一对三个单引号 ‘’’ 或者一对三个双引号 “”" 来定义文档字符串。
    你可以使用 __doc__(注意双下划线)调用函数中的文档字符串属性。

  • DocStrings 文档字符串使用惯例:它的首行简述函数功能,第二行空行,第三行为函数的具体描述。

10.了解类型注解么?

用 : 类型 的形式指定函数的参数类型,用 -> 类型 的形式指定函数的返回值类型。

例如:

def add(x:int, y:int) -> int:
    return x + y

然后特别要强调的是,Python 解释器并不会因为这些注解而提供额外的校验,没有任何的类型检查工作。也就是说,这些类型注解加不加,对你的代码来说没有任何影响

详细了解可参考:点此跳转

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

适当回答几条即可:点此跳转

12.Python 中的注释有几种?

  • 单行注释:#
  • 多行注释:""" """

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

函数注释通常在 def 语句下方,第一行表示函数用法,接下来对函数接受的参数进行解释,最后对函数的返回值进行注释,方便他人理解函数的用法

详细了解可参考这篇文章:点此跳转

14.如何给变量加注释?

  • 单行注释:#
  • 多行注释:""" """

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

需要统一使用 tab 或统一使用空格,不能混用
Python 是一门用空格缩进来区分代码层次的语言,其实 Python 并没有强制要求你用 Tab 缩进或者用空格缩进,甚至空格按几个都没有强制要求,但在 PEP8 中建议了使用4个空格作为缩进

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

可以是可以,但是不推荐。因为一次导入多个模块可读性不是很好,所以一行导入一个模块会比较好。同样的尽量少用 from modulename import *,因为判断某个函数或者属性的来源有些困难,不方便调试,可读性也降低了。

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

给文件命名的时候不要和标准库库的一些模块重复,比如 abc。 另外要名字要有意义,不建议数字开头或者中文命名。

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

  • pylint
  • flake8
  • YAPF,谷歌开发的代码规范工具
  • Black,依赖 Python3.6+ 的第三方库,可以直接将原代码变为符合 PEP8 标准的代码

数据类型

字符串

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

  • 整型 int
  • 浮点型 float
  • 布尔型 bool
  • 字符串 str

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

可变数据类型更改后地址不发生改变,不可变数据类型更改后地址发生改变

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

strA = 'hello world'

print(strA.title())
# 或
print(strA.capitalize())

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

使用 isdigit() 函数,返回一个 True 或 False

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

  • 使用切片:"ilovechina"[::-1]
  • 使用 reversed() 方法:''.join(reversed('ilovechina'))

注意:

  • reverse() :函数用于反向列表中元素,仅适用于列表
  • reversed():函数是返回序列 seq 的反向访问的迭代子。参数可以是列表,元组,字符串

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

  • 使用 % 号
    'Hey %s, there is a 0x%x error!' % (name, errno)
    'Hey %(name)s, there is a 0x%(errno)x error!' % {"name": name, "errno": errno }
  • 使用 format()
    'Hello, {}'.format(name)
    'Hey {name}, there is a 0x{errno:x} error!'.format(name=name, errno=errno)
  • 字符串插值/f-Strings(Python 3.6+)
    f'Hello, {name}!'

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

  • 使用 replace() 方法
    " adabdw ".replace(" ", "") 将空格替换为空
  • 使用切片
    " adabdw "[1:7]

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

"123456"[4:] 或者 "123456"[-2:]

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

a= "S".encode("gbk").decode("utf-8",'ignore')
print(a)

28
(1).s="info:xiaoZhang 33 shandong" ,用正则切分字符串输出 ["info", "xiaoZhang", "33", "shandong"]

(2).a = "你好 中国 ",去除多余空格只留一个空格。

  • 使用 replace() 方法
    "你好 中国 ".replace(" ", "") 将空格替换为空

29
(1).怎样将字符串转换为小写

strA = "ARHststh"
print(strA.lower())

(2).单引号、双引号、三引号的区别?

三种引号都表示字符串

  • 单引号表示的字符串里可包含双引号,当然不能包含单引号
  • 双引号表示的字符串里可以包含单引号,字符串都只能有一行
  • 三个引号能包含多行字符串,同时常常出现在函数的声明的下一行,来注释函数的功能,与众不同的地方在于,这个注释作为函数的一个默认属性,可以通过 函数名.__doc__ 来访问

列表

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

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

31.如何实现 "1,2,3" 变成 [“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)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值