1. Python 面试问题及答案
Q. Python 的特点和优点是什么?
Python 可以作为编程的入门语言,因为他具备以下特质:
1. 解释性
2. 动态特性
3. 面向对象
4. 语法简洁
5. 开源
6. 丰富的社区资源
Q.复制的值是可变对象(列表和字典)
浅拷贝copy有两种情况:
第一种情况:复制的 对象中无 复杂 子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。
第二种情况:复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表), 改变原来的值 中的复杂子对象的值 ,会影响浅复制的值。
深拷贝deepcopy:完全复制独立,包括内层列表和字典
Q. Python的可变类型和不可变类型包含哪些?
可变类型 包含: 列表(List)、字典(Dict)、集合(Set)。
不可变类型 包含: 字符串(String)、整数(int)、小数(Float) 布尔(Bool)、元组(Tuple)
Q. 什么是 Python 字典?
字典是可变的,我们也可以用推导式的方式创建它.
{25: 5, 16: 4, 9: 3, 4: 2, 1: 1}
Q. 列表和元祖有什么不同?
主要区别在于列表是可变的,元祖是不可变的。看下面的例子:
会出现以下错误提示:
TypeError: ‘tuple’ object does not support item assignment
关于列表和元祖的更多内容参考 Tuples vs Lists( https://data-flair.training/blogs/python-tuples-vs-lists/)
列表:
(1)添加
- 往列表a的尾部追加元素:a.append(i)
- 往列表a中的任何位置追加元素:a.insert(i,elem),其中i表示索引位置,elem表示元素。
(2)删除:
- 删除指定位置的元素:del a[i]
- 删除列表中的元素: a.remove(elem)
- 删除列表尾部的元素(有点像栈pop哈哈):a.pop()
(3)拓展:
- 将列表b追加到a的尾部:a.extend(b)
(4)统计元素出现的次数:a.count(elem)
(5)排序:list.sort(self,key=None,reverse=False)其中key只在元素为字符串时才有用,表示按照关键字(如字符串长度)进行排序
数字:
- 按照从小到大排序(默认从小到大排序):a.sort()
- 若想要按照从大到小排序,则为:a.sort(reverse=True)
字符串:
- 按照ASCII码的大小按照从小到大排序:
- 从大到小排序:a.sort(reverse=True)
- 按照字符串的长度进行从大到小排序:a.sort(key=len,reverse=True)
(6)翻转:
- 列表中元素翻转:a.reverse()
(7)返回列表a长度:len(a)
(8)获取元素下标:list.index(elem)
元组:
元组中有两种操作:
(1)返回元组中元素的个数:tuple.count(elem)
(2)查找元素的位置:tuple.index(elem,start)
Q. Python里面如何实现tuple和list的转换?
答:直接使用tuple和list函数就行了,type()可以判断对象的类型
Q、L = [1, 2, 3, 11, 2, 5, 3, 2, 5, 3],用一行代码得出 [11, 1, 2, 3, 5]
答:list(set(L))、
Q、L = [1, 2, 3, 4, 5],L[10:]的结果是?
答:空列表(当时有点紧张,一直在“空列表”和“索引超出范围”两个答案之间徘徊)。
Q、L = [1, 2, 3, 5, 6],如何得出 '12356'?
答:注意,个人觉得这个题有坑,列表的元素不是字符串,所以不能 ''.join(L) 。
以下是过程:
Q、数据类型转换
list004 = [1,5,2,8,6,3,7,4,10]
要点二:字符串分割成列表:
str002 = 'abc'
list004.extend(str002)
要点三:两个列表转换为字典:
list005=['key1','key2']
list006=['a','b']
dict(zip(list005,list006))
执行结果:
要点二结果: [1,5,2,8,6,3,7,4,10,a,b,c]
要点三结果:{'key1': 'a', 'key2': 'b'}
Q. 解释 Python 中的三元表达式
与 C++不同, 在 Python 中我们不需要使用 ? 符号,而是使用如下语法:
[on true] if [expression]else [on false]
如果 [expression] 为真, 则 [on true] 部分被执行。如果表示为假则 [on false] 部分被执行
Q. lambda省去了定义函数,map省去了写for循环过程
Q. 什么是lambda函数?它有什么好处?
答:lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数
lambda函数:首要用途是指点短小的回调函数
lambda [arguments]:expression
>>> a=lambdax,y:x+y
>>> a(3,11)
Q. Python 中如何实现多线程?
线程是轻量级的进程,多线程允许一次执行多个线程。众所周知,Python 是一种多线程语言,它有一个多线程包。
GIL(全局解释器锁)确保一次执行单个线程。一个线程保存 GIL 并在将其传递给下一个线程之前执行一些操作,这就产生了并行执行的错觉。但实际上,只是线程轮流在 CPU 上。当然,所有传递都会增加执行的开销。
Q. 解释继承
一个类继承自另一个类,也可以说是一个孩子类/派生类/子类,继承自父类/基类/超类,同时获取所有的类成员(属性和方法)。
1. 单继承- 一个子类继承自单个基类
2. 多重继承- 一个子类继承自多个基类
3. 多级继承- 一个子类继承自一个基类,而基类继承自另一个基类
Q. 什么是 Flask?
Flask 是一个使用 Python 编写的轻量级 Web 应用框架,使用 BSD 授权。其 WSGI 工具箱采用 Werkzeug,模板引擎则使用 Jinja2。除了 Werkzeug 和 Jinja2 以外几乎不依赖任何外部库。因为 Flask 被称为轻量级框架。
Flask 的会话会话使用签名 cookie 来允许用户查看和修改会话内容。它会记录从一个请求到另一个请求的信息。但如果要修改会话,则必须有密钥 Flask.secret_key。
我们将在后续的课程中进一步讨论 Flask。
Q.8. 如何在 Python 中管理内存?
Python 用一个私有堆内存空间来放置所有对象和数据结构,我们无法访问它。由解释器来管理它。不过使用一些核心 API,我们可以访问一些 Python 内存管理工具控制内存分配。
Q.当退出 Python 时是否释放所有内存分配?
答案是否定的。那些具有对象循环引用或者全局命名空间引用的变量,在 Python 退出是往往不会被释放
另外不会释放 C 库保留的部分内容。
Q. 什么是猴子补丁?
在运行时动态修改类和模块
Hi, monkey
Q.能否解释一下 *args 和 **kwargs?
如果我们不知道将多少个参数传递给函数,比如当我们想传递一个列表或一个元组值时,就可以使用*args。
3
2
1
4
7
当我们不知道将会传入多少关键字参数时,使用**kwargs 会收集关键字参数。
a.1
b.2
c.7
使用 args 和 kwargs 作为参数名只是举例,可以任意替换。
Q. 编程实现计算文件中的大写字母数
Q. 如何随机打乱列表中元素,要求不引用额外的内存空间?
我们用 random 包中的 shuffle() 函数来实现。
代码输出为:
Q. 如何用Python来进行查询和替换一个文本字符串?
答:可以使用re模块中的sub()函数或者subn()函数来进行查询和替换,
格式:sub(replacement, string[,count=0])(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量)
>>> import re
>>>p=re.compile(‘blue|white|red’)
>>>print(p.sub(‘colour’,'blue socks and red shoes’))
colour socks and colourshoes
>>>print(p.sub(‘colour’,'blue socks and red shoes’,count=1))
colour socks and redshoes
subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量
Q. Python里面match()和search()的区别?
答:re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。
re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。
>>>print(re.match(‘super’, ‘superstition’).span())
(0, 5)
>>>print(re.match(‘super’, ‘insuperable’))
None
>>>print(re.search(‘super’, ‘superstition’).span())
(0, 5)
>>>print(re.search(‘super’, ‘insuperable’).span())
(2, 7)
Q. 介绍一下Python下range()函数的用法?
答:列出一组数据,经常用在for in range()循环中
>>> nums = ["a","b","c","d","e"]
>>> for i in range(len(nums)):
print(nums[i])
a
b
c
d
e
Q. Python里面如何生成随机数?
答:random模块: import random
随机整数:random.randint(a,b):返回随机整数x,a<=x<=b
random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值。
随机实数:random.random( ): 返回[0,1)范围内的随机浮点数
random.uniform(a,b):返回指定范围内的浮点数。
Q. 解释 Python 中的 join() 、split() 、replace()函数
join() 函数可以将指定的字符添加到字符串中。
‘1,2,3,4,5’
split() 函数可以用指定的字符分割字符串
[‘1’, ‘2’, ‘3’, ‘4’, ‘5’]
Ps: 在Python中使用split函数是使用定义的分隔符将字符串分解为更短的字符串。它给出了字符串中存在的所有单词的列表。
Q. 如何删除字符串中的前置空格
前置空格是第一个非空格字符前的所有空格,使用 lstrip() 函数来删除.
‘Ayushi ‘
如图这个字符串既包含前置空格也包含后置空格. 调用 lstrip() 函数去除了前置空格。如果想去除后置空格,使用 rstrip() 函数。
a = ‘ Ayushi’
a.strip()
Q. Python代码实现删除一个list里面的重复元素
答:
1,使用set函数,set(list)
2,使用字典函数,
>>>a=[1,2,4,2,4,5,6,5,7,8,9,0]
>>> b={}
>>>b=b.fromkeys(a)
>>>c=list(b.keys())
>>> c
Q. 举例sort和sorted对列表排序,list=[0,-1,3,-10,5,9]
Q. sorted:分别按字母和数字排序
Q. sorted: 列表嵌套列表排序,年龄数字相同按照字母排序
Q. Python 区分大小写吗?
验证 Python 是否区分大小写的方法是测试 myname 和 Myname 在程序中是不是算同一个标识符。观察以下代码的返回结果:
Myname
NameError: name ‘Myname’ is not defined
如你所见,这里出现了 NameError,所以 Python 是区分大小的语言。
Q. 如何在一个function里面设置一个全局的变量?
答:解决方法是在function的开始插入一个global声明:
def f()
global x
Q. 单引号,双引号,三引号的区别
1、单引号和双引号没有什么区别,不过单引号不用按shift,打字稍微快一点。表示字符串的时候,单引号里面可以用双引号,而不用转义字符,反之亦然。
'She said:"Yes." ' or "She said: 'Yes.' "
2、但是如果直接用单引号扩住单引号,则需要转义,像这样:
' She said:\'Yes.\' '
3、三引号可以直接书写多行,通常用于大段,大篇幅的字符串
Python中的注释以#字符开头。也可以使用doc-strings(三重引号中包含的字符串)进行注释。
"""
hello
world
"""
Q. 在Python中切片是什么?
从序列类型(如列表,元组,字符串等)中选择一系列项目的机制称为切片。
list001 =['001', '001', '002', '003', '003', '004', '005', '006', '006', '008', '009', '010', 'a', 'b', 'c']
要点一: 截取前三个元素: list001[:3]
要点二: 截取后三个元素: list001[-3:]
要点三: 截取第三个以后的元素: list001[3:]
要点四: 翻转元素: list001[::-1]
执行结果:
截取列表前3个元素 ['001', '001', '002']
截取列表后3个元素 ['a', 'b', 'c']
截取列表第3个以后的元素 ['003', '003', '004', '005', '006', '006', '008', '009', '010', 'a', 'b', 'c']
列表按照index逆序排序: ['c', 'b', 'a', '010', '009', '008', '006', '003', '001', '006', '005', '004', '003', '002', '001']
Q、[:: - 1]表示什么?
[:: - 1]用于反转数组或序列的顺序。
Q、寻找最值max()、 min()
list002 = [1,5,2,8,6,3,7,4,10]
最小值: min(list002)
最大值: max(list002)
执行结果:
最小值:1
最大值:10
Q. Python 中标识符的命名规则?
Python 中的标识符可以是任意长度,但必须遵循以下命名规则:
1. 只能以下划线或者 A-Z/a-z 中的字母开头。
2. 其余部分只能使用 A-Z/a-z/0-9。
3. Python 标识符区分大小写。
4. 关键字不能作为标识符。Python 有以下这些关键字:
Q. 如何将字符串转换为小写?
使用 lower() 函数
‘ayushi’
转换为大写用 upper() 函数
‘AYUSHI’
要检查字符串是否为全大写或全小写,使用 isupper() 和 islower() 函数
像 @ 和$这样的字符即满足大写也满足小写。
istitle() 可以检查字符串是否是标题格式。
True
Q. Python 中的 break / continue /pass 语句有什么作用?
我们在写代码时,有时可能只写了函数声明而没想好函数怎么写,但为了保证语法检查的正确必须输入一些东西。在这种情况下,我们使用 pass 语句。
类似的 break 语句可以跳出循环。
0
1
2
continue 语句可以跳到下一轮循环。
0
1
2
4
5
6
Q. 请解释 Python 中的闭包?
如果在一个内部函数里。对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就是一个闭包。
7
闭包的详细解释请点击 Closures in Python。(https://data-flair.training/blogs/python-closure/)
Q. 解释 Python 中的//,%和**运算符
//运算符执行地板除法,返回结果的整数部分 (向下取整)。3
用/符号除法结果为 3.5。
**符号表示取幂. a**b 返回 a 的 b 次方
% 是取模符号。返回除法后的余数。
Q. Python 中有多少种运算符,解释算术运算符。
在 Python 中我们有 7 中运算符:算术运算符、关系 (比较) 运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符。
1. 加号 (+) 将两个对象的值相加。
2. 减号 (-) 将第一个对象的值减去第二个对象的值。
3. 乘号 (*) 将两个对象的值相乘。
4. 除号 (/) 将第一个对象的值除以第二个对象的值。
0.875
1.0
Q. 解释 Python 中的关系运算符。
关系运算符用来比较两个对象。
1. 判断小于 (<):如果符号左边的值比右边小则返回 True。
2. 判断大于 (>):如果符号左边的值比右边大则返回 True。
3. 判断小于等于 (<=):如果符号左边的值小于或等于右边则返回 True。
4. 大判断于等于 (>=):如果符号左边的值大于或等于右边则返回 True。
5. 判断等于 (==) 如果符号两边的值相等则返回 True。
6. 判断不等于 (!=) 如果符号两边的值不等则返回 True。
Q. 解释 Python 中的赋值和算数运算符?
这是面试中的常见题目。我们将算数运算符和赋值符号放在一起介绍。
Q. 解释 Python 中的逻辑运算符
Python 中有三个逻辑运算符:and、or、not
Q. 解释 Python 中的成员运算符
使用 in 和 not in 运算符我们可以判断某个值是否在成员中。
Q. 解释 Python 中的身份运算符
is 和 not is 运算符可以判断两个对象是否相同
Q. 解释 Python 中的位运算符
此运算符按二进制位对值进行操作。
1. 与 (&) 返回按位与结果
2
2. 或 (|) 返回按位或结果
3
3. 异或 (^) 返回按位异或结果
1
4. 取反 (~) 返回按位取反结果
-3
5. 左移位 (<<) 将符号左边数的二进制左移右边数位
4
1 的二级制 001 左移 2 位变成 100 也即十进制的 4
6. 右移位 (>>)
1
想了解关于位运算符的更多内容请点击 Operators in Python(https://data-flair.training/blogs/python-operators/)
Q. 如何在 Python 使用多进制数字?
除十进制以外,在 Python 中还可以使用二进制、八进制、十六进制。
1. 二进制数有 0 和 1 组成,我们使用 0b 或 0B 前缀表示二进制数
10
使用 bin() 函数可以将数字转换为二进制
‘0b1111’
2. 八进制数由数字 0-7 组成,使用前缀 0o 或 0O 表示 8 进制数
‘0o10’
3. 十六进数由数字 0-15 组成,使用前缀 0x 或者 0X 表示 16 进制数
‘0x10’
‘0xf’
Q. 如何获取字典中的所有键?
使用 keys() 来获取字典中的所有键
Q. 使用pop和del删除字典中的"name"字段
Q. IOError、AttributeError、ImportError、IndentationError、IndexError、KeyError、SyntaxError、NameError分别代表什么异常
IOError:输入输出异常
AttributeError:试图访问一个对象没有的属性
ImportError:无法引入模块或包,基本是路径问题
IndentationError:语法错误,代码没有正确的对齐
IndexError:下标索引超出序列边界
KeyError:试图访问你字典里不存在的键
SyntaxError:Python代码逻辑语法出错,不能执行
NameError:使用一个还未赋予对象的变量
Q. 问什么标识符不建议使用下划线开头?
因为在 Python 中以下划线开头的变量为私有变量,如果你不想让变量私有,就不要使用下划线开头。
Q. 介绍一下except的用法和作用?
答:try…except…except…[else…][finally…]
执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行
如果存在finally语句,最后总是会执行。
Q. python中读取Excel文件的方法
应用数据分析库pandas
Q. python正则中search和match
Q、什么是python模块?Python中有哪些常用的内置模块?
Python模块是包含Python代码的.py文件。
此代码可以是函数类或变量。一些常用的内置模块包括:sys、math、random、data time、JSON。
Q、什么是__init__?
__init__是Python中的方法或者结构。在创建类的新对象/实例时,将自动调用此方法来分配内存。所有类都有__init__方法。