python面试题
1.一行代码实现1-100的和
print(sum(range(1,101))) #range中的参数是1<=i<101 #sum是计算参数的和
2.在函数内部改变全局变量
a = 5 def foo1(): global a a = 4 foo1() print(a)
3.列出5个python标准库
time,获取时间戳,时间等。
os获取系统信息,如目录,pid。
subprocess,与linux shell交互
re,正则表达式,如match,findall,search
sys,获取程序的参数,路径,退出消息等
psutil,获取系统运行状态,如cpu,mem,disk,net。
4.如何删除字典中的元素,如何更新元素的值,如何合并两个字典
dictA = {'age':18,'name':'jab'} del dictA['age'] #删除一个键值对 dictA['name'] = 'eric' #改变一个key的value tel = {'tel':'131111111'} dictA.update(tel) #将tel字典合并到dictA字典 print(dictA)
5 如何删除列表中的元素,如何将删除的元素赋值给变量,如何在列表头部插入元素,如何在列表尾部插入元素
listA = [1,2,3] del listA[0] #删除index=0的元素 num = listA.pop(-1) #将index为-1的元素弹出,赋值给num listA.insert(0,1) #在index为0的位置插入元素1 listA.append(3) #在尾部追加元素3
6 fun(*args,**kwargs)中的*args,**kwargs什么意思?
*args 传递多个值时使用
**kwargs 传递多组关键字时使用,比如django中的model定义,可能会有多组关键字,后面的函数就会用它作为形参
appid = models.IntegerField(primary_key=True)
7 什么样的语言能使用装饰器?
函数能作为参数传递的语言
8 面向对象中__new__和__init__的区别
init是初始化方法,对象创建后,就被调用,并且可以接受参数。
9 简述with方法打开处理文件帮我我们做了什么?
f = open('admin.py','r') try: str = f.read() print(str) except: pass finally: f.close() #这样打开文件,需要处理异常,还要在finally里关闭文件 #with中会自己close,也可以处理异常
10.列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]
listA = [1,2,3,4,5] def fn(i): return i*i listB = map(fn,listA) listC = [i for i in listB if i > 10] print(listC) #map()是 python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的object并返回。(python2返回列表,Python3返回迭代对象) #[i for i in listB if i > 10]为列表推导式,把listB中大于10的元素给listC
11 解释 Python 中的三元表达式
根据一个表达式判断,x的值是什么。
a = 1 b = 2 x = a if a > b else b
12 python如何实现多线程
13 join()和split的区别
join是把一个字符串的字典组成成一个字符串,用确定的分隔符。
split是把一个字符串按特定分隔符转化成一个列表
13 如何删除字符串中的前置空格,或者最后的/字符。
前置 lstrip(' ') 后置 rstrip('/')
14 改字母大小写,查字母大小写
str.lower 改小写
str.upper 改大写
str.islower 判断是否小写,字符串需要全部小写
str.ipupper 判断是否大写,字符串需要全部大写
答:要把bytes类型解码为str类型的时候,ascii码不能解码,因为这个bytes不是由ascii码编码的,可以换一个试试,像utf-8,gbk。
正则表达式
python里match()和search()的区别
import re sql = 'select * from table' match_sql = re.match('from',sql) print(match_sql) search_sql = re.search('from',sql) print(search_sql.span()) --> None (9, 13) #match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配; #span()用于给出匹配字符范围
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。
#输入文件名和匹配字符串,返回出现次数 def countof(file_name,str): with open(file_name,'r') as file_obj: parse = file_obj.read() count = len(re.findall(str,parse)) return count
列表字典字符处理
python如何实现tuple和list的转换
t = (1,2,3) l = [2,3,4] print(list(t)) print(tuple(l))
写一段python代码,删除列表里的重复元素(删除字符串里的重复字符)
list1 = [1,2,3,4,2,3,4] s1 = set(list1) print(s1) str1 = 'google' s2 = set(str1) print(s2) --> {1, 2, 3, 4} {'g', 'l', 'o', 'e'} #set函数将list或str里的重复项删除,并返回一个无序字典
上下文管理
设计一个类Foo,使其满足以下代码输出
with Foo() as a:
print("2")
输出为:123 (每个整数数字为一行)
class Foo(): def __enter__(self): print('1') def __exit__(self, exc_type, exc_val, exc_tb): print('3') with Foo() as a: print('2') #将Foo()这个类赋值给a #在执行with下面的语句之前,会调用__enter__方法 #执行完之后,会执行__exit__方法。 #扩展 class foo(): def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): print('type',exc_type) print('value',exc_val) print('trace',exc_tb) def func1(self): pass with foo() as foo: foo.func1() #将foo()赋值给foo,可知返回一个实例 #然后执行这个实例下的func1函数 #如果with下面的代码有异常,__exit__就被执行 #开发库时,清理资源,关闭文件等等操作,都可以放在__exit__方法当中。 #Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。
装饰器
设计一个装饰器"addhttp",使其满足以下代码输出
@addhttp
def test():
return www.changyou.com
print(test()) #输出为http://www.changyou.com
def addhttp(func): def wrapper(*args,**kwargs): return "http://%s" %func() return wrapper
设计一个装饰器,在函数执行前先执行附加功能
def add_func(func): def wrapper(): print('[DEBUG]:func {}() start'.format(func.__name__)) func() return wrapper()
迭代器&生成器
1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身。对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数。在没有后续元素时,next()会抛出一个StopIteration异常
2)生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)
区别:生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常