常见 python 基础面试题
1,文件操作时:xreadlines和readlines的区别?
readlines()是把文件的全部内容读取到内存,并解析一个list,当文件的体积很大的时候,需要占用很多内容。
xreadlines()则直接返回一个iter(file)迭代器,在python2.3之后已经不推荐这种表示方法了,直接使用for循环迭代文件对象
***2,列举布尔值为False的常见值?
用type打印下
0,[],(),'',False,None
***3,is 和 == 的区别?
is 比较的是id
== 比较的是值
***4,现有字典 dict={‘a’:24, ‘g’:52, ‘i’:12, ‘k’:33}请安字典中的value值进行排序?
sorted(dict.items().key = lambda x:x[1])
案例:
dict = {"a": 24, "g": 52, "i": 12, "k": 33}
In [2]: sorted(dict.items(),key=lambda x:x[1])
Out[2]: [('i', 12), ('a', 24), ('k', 33), ('g', 52)]
5,请反转字符串“aStr”?
print("aStr[::-1]")
案例:
s = 'hello'
s[::-1]
'olleh'
6,请按list1中元素的age由大到小排序
list1 = [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]
sorted(list1,key=lambda x:x['age'],reverse=True)
reverse=True --- 代表从大到小
7,常见的字符串格式化哪几种?
name = '张三'
1,占位符
s1 = “%s DSB 你好”%name
2,format
s2 = '{} DSB 你好'.format(name)
3, f-string (python3.6之后有的特性)
s3 = f'{name} DSB 你好'
8, 下面代码的输出结果将是什么?
list = ['a','b','c','d','e']
print(list[10:])
'''
下面的代码将输出[],不会产生IndexError错误,就像所期望的那样,
尝试用超出成员的个数的index 来获取某个列表的成员。例如,
尝试获取list[10]和之后的成员,会导致IndexError.
***9,写一个列表生成式,产生一个公差为11的等差数列
1. print([x*11 for x in range(10)])
10,给定两个列表,怎么找出他们相同的元素和不同的元素?
1, list1 = [1,2,3]
2, list2 = [3,4,5]
3, set1 = set(list1)
4, set2 = set(list2)
5, print(set1&set2)
6, print(set1^set2)
11, 请写出一段python代码实现删除一个list里面的重复元素?
---------比较容易记忆的是用内置的set:
set 是天然去重的
1, l1 = ['b','c','d','b','c','a']
2, l2 = list(set(l1))
***12,列举字符串,列表,元组,字典每个常用的5个方法?
字符串:repleace(替换),strip(把他的空格去掉),split(分割),reverse(翻转),
upper(变大写),lower(变小写),join(把一个列表变成一个字符串).....
列表:append,pop,insert,remove,sort,count,index.....
元组:index,count,len(),dir()
字典:get,keys,values,pop,popitems,clear,update,items.....
13,什么是反射? 以及应用场景?
在绝大多数语言当中都有反射机试的存在,可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对
1,反射机制是很多框架的基石。
2,
***14,简述Python的深浅拷贝?
copy() :浅copy,浅拷贝指仅仅拷贝数据集合的第一层数据
deepcopy():深copy,深拷贝指拷贝数据集合的所有层
***15,Python 垃圾回收机制?
垃圾回收机制是自动帮助我们管理内存,清理垃圾的一种工具
1,引用计数
当一个对象的引用被创建或者复制时,对象的引用计数加1;
当一个对象的引用被销毁时,对象的引用计数减1;
当对象的引用计数减少为0时,就意味着对象已经没有被任何人使用了,可以将其所占用的内存释放了。
优点:
简单,直观
实时性,只要没有了引用就释放资源。
缺点:
维护引用计数需要消耗一定的资源
循环应用时,无法回收。也正是因为这个原因,才需要通过标记-清理和分代手机机制来辅助引用计数机制。
2,标记-清除
“标记-清除”不改动真实的引用计数,而是将集合中对象的
引用计数复制一份副本,改动连对象引用的副本,对于副本做任何的改动,都不会影响到对象生命走起的维护。
3,分代回收
将系统中的所有内存根据其存活时间划分不同的集合,
每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小,
也就是说,活的越长的对象,就越不可能是垃圾,就应该减少对他的垃圾收集频率。
那么如何来衡量这个存活时间,通过是利用几次垃圾收集动作来衡量。
如果一个对象经过的垃圾收集次数越多,可以得出、该对象存活时间越长。
16,如何打乱一个拍好序的 list 对象 alist
import random
random.shuffle(slist)
17, 从0-99这个100个数中随机取出10个,要求不能重复,可以自己设计数据结构
print([x * x for x in range(1,11)])
18,介绍一下try except的用啊和作用?
Python的except用来捕获所有异常,因为Python里面的每次错误都会抛出一个异常,
所以每个程序的错误都被当做一个运行时错误。
try:
pass
except BaseException as e:
print(e)
finally:
pass
19,Python 递归的最大层数?
*** 答案
最大数为998
20,列表推导式和生成器表达式 [i % 2 for i in range(10)] 和 (i % 2 for i in range(10)) 输出结果分别是什么?
print([i % 2 for i in range(10)])
print([i % 2 for i in range(10)])
***21,什么是闭包?
闭包函数(closure function)指的是定义在一个函数内部的函数,被外层函数包裹着,
其特点是可以访问到外层函数中的名字,如下 inner 函数
def outer():
num = 1
def inner():
print(num) # 内层函数中不存在num 但可以访问到外层的num
return inner # 基于函数对象的概念我们可以将内层函数返回到外界使用,从而打破函数调用的层级限制,
func = outer()
num = 1000
func() # 输出结果:1
22,请实现一个装饰器,限制该函数被调用的频率,如10秒一次
# 答案
import time
def time_pay(func):
def inner(*args,**kwargs):
for line in range(10):
print(line + 1)
time.sleep(1)
res = func(*args,**kwargs)
return res
return inner
@time_pay
def func1():
print('from func1...')
func1()
23,对闭包的理解。
闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,他同样提高了代码的可重复使用性。
当一个内嵌函数引用其外部作用域的变量,我们就会得到一个碧波啊,总结一下,创建一个闭包必须满足一下几点:
1. 必须有一个内嵌函数
2. 内嵌函数必须引用外部函数中的变量
3. 外部函数的返回值必须是内嵌函数
24,Python 函数调用的时候参数的传递方式是值传递还是引用传递?
Python的参数传递有:位置参数,默认参数,可变参数,关键字参数。
函数的传值到底是值传递还是引用传递,要分情况:
不可变参数用值传递:
像整数和字符串这样的不可变对象,是通过拷贝进行传递的,因为你无论如何都不可能在原处改变
不可变对象
可变参数是引用传递的:
比如像列表,字典这样的对象是通过引用传递,和c语言里面的用指针传递数组很相似,
可变对象能在函数内部改变。
25,递归函数停止的条件?
递归的终止条件一般定义在递归函数内部,在递归调用前要做一个条件判断,
根据判断的结果选择是继续调用自身,还是return;返回终止递归。
终止的条件:
1,判断递归的次数是否达到某一限定值
2,判断运算的结果是否达到某个范围等,根据设计的目的来选择
26,mro 是什么?
mro全称:Method Resolution Order. 指的是方法解析顺序。
方法调用时就需要对当前类和基类预见性搜索以确定所在的位置。而搜索的顺序就是所谓的【方法解析顺序】
***27,Python 里面的上下文你知道吗?----就是with
自己实现的话需要两个方法,__enter__() 和 __exit__() 这两个方法。
***28,实现一个Singleton单例类,
1, __new__
class Borg(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'):
ob = super(Borg, cls)
cls._instance = ob.__new__(cls, *args, **kwargs)
return cls._instance
class MyClass(Borg):
def __init__(self):
self.a = 1
29,正则表达式的一个邮箱合法
import re
if re.match(r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$',email):
print('right')
else:
print('wrong')