第三套面试题
1、如何在Python中拷贝一个对象?并说明他们之间的区别
- copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。 - copy.deepcopy 深拷贝 拷贝对象及其子对象 举例说明 import copy l1 = [1,2,3,4,['a','b']] a = l1 #赋值,传对象的引用 b = copy.copy(l1) #对象拷贝,浅拷贝 c = copy.deepcopy(l1) #对象拷贝,深拷贝 a.append(5) #修改对象a a[4].append('c') #修改a列表里面列表 print('a=',a) #a= [1, 2, 3, 4, ['a', 'b', 'c'], 5] print('b=',b) #b= [1, 2, 3, 4, ['a', 'b', 'c']] print('c=',c) #c= [1, 2, 3, 4, ['a', 'b']] 明显的可以看出: 浅拷贝:只拷贝父对象,不会拷贝对象的内部的子对象 深拷贝:拷贝对象及其子对象
2、谈谈你对Python装饰器的理解
在不修改原函数及其调用方式的情况下对原函数的功能进行扩展
当我们写登录认证的时候,好多页面都得判断带没带cookie,如果带了就可以访问,这时候如果函数
不多的时候我们就可以用加装饰器的方法来判断,而不用一个一个的判断。当然,如果页面太多的话,
我们还可以考虑中间件的方式来进行判断。
3、Python里面match()和search()的区别
match:只从字符串的开头进行匹配,也就是说只有在索引0的位置匹配成功的话才有返回值,如果不是开始位置匹配成功的话,返回none
search:会把整个字符串扫描一遍,并返回第一个成功匹配的
4、如何判断一个变量是不是字符串?
s = 'aaaa' print(type(s) ==str) #True print(isinstance(s,str)) #True
5、xrange和range的不同?
xrange和range的用法相同 不同的是: range(5) #[0,1,2,3,4] 生成的是一个列表 xrange(5) #xrange(5) 生成的是一个生成器,通过list(xrange(5)) 就能看到结果了 xrange做循环的性能比range好,尤其是返回很大的时候。
6、如何生成[1,4,9,16,25,36,49,64,81,100]?尽量用一行实现
#方式一 print([i*i for i in range(1,11)]) #方式二 print(list(map(lambda x:x*x,range(1,11))))
7、生成器是什么?有什么作用?请写一个生成器
含有yield的就是生成器,也有__next__方法,具有迭代特性 作用:就是一下子不会在内存中生成太多的数据,生成器的本质就是一个迭代器。 Python有两种不同的方式提供生成器 生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。 yield语句一次返回一个结果,在每个结果中间,挂起函数的状态, 以便下次重它离开的地方继续执行 生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象, 而不是一次构建一个结果列表 生成器示例: def aaa(): for i in range(0,10): yield i s = aaa() print(next(s)) #0 print(next(s)) #1 print(next(s))#2 for i in s: print(i) 0 1 2 3 4 5 6 7 8 9
8、map(str,[1,2,3,4,5,6,7,8,9]) #输出什么
<map object at 0x00000000025B3550> 输出的是map对象
9、如何在一个函数里面设置一个全局的变量
用global强转一下
10、介绍一下except的用法和作用
作用:try,except主要用作异常处理,吧有可能出异常的代码放在try里面,except里面放处理的机制
用法:
def tryexcept():
try:
int('aaa')
except ValueError as e:
print(e)
tryexcept()
11、def f(a,b=[])这种写法中有什么陷阱?
举例说明: def f(a,b=[]): b.append(a) print(b) f('hiayn') #['hiayn'] f('zzz') #['hiayn', 'zzz'] f('rrrr') #['hiayn', 'zzz', 'rrrr'] 明显的看出:每次传入参数的时候,都是在以前的基础上添加了
12、用Python实现九九乘法表(用两种不同的方式实现)
#方式一 for i in range(1,10): for j in range(1,i+1): print('%s*%s=%s'%(i,j,i*j),end=" ") print() #方式二:左上三角形 for i in range(1,10): for j in range(i,10): print("%d*%d=%d"%(i,j,i*j),end=" ") print("") https://www.cnblogs.com/suiy-160428/p/5594389.html
第四套面试题
1、输入一个字符串,返回倒序排序的结果,:如:‘abcdef’ 返回:'fedcba'
#方式一:将字符串翻转,步长设为-1 def re_sort(): s = input('请输入一串字符串:>>') return s[::-1] #从开头到结尾步长为-1 # obj = re_sort() # print(obj) #方式二:借助列表进行翻转 def re_sort2(): s = input('请输入一串字符串:>>') li = [] for i in s: li.append(i) li.reverse() #将列表反转 return ''.join(li) #将列表转化成字符串 obj2 = re_sort2() print(obj2)
2、django中如何在model保存前做一定的固定操作,比如写一句日志
可以写装饰器或者是中间件,还是推荐用中间件的方式
3、获取Python解释器版本的方法是?
Python --version #获取解释器的版本信息 在环境变量里面设置版本,在cmd里面运行,输入Python3 或者Python2
4、Python中,什么语句能直接显示释放内存资源?
del 可以删除多个变量,del a,b,c,d 办法: a = [1,2,3,4] import gc del a gc.collect()
5、有一个数组[3,4,1,2,5,6,6,5,4,3,3],请写一个函数,找出该数组中没有重复的数的总和?结果:1+2 = 3
from collections import Counter li = [3,4,1,2,5,6,6,5,4,3,3] def func(): new_li = [] sum = 0 number_count = Counter(li) #统计出现的个数的,打印的结果是一个字典 for i in number_count.items(): # print(i) #打印的i是一个元组的形式,一个是key,一个是value if i[1]==1: #i[1]代表的是个数 new_li.append(i[0]) #i[0]代表的是取出的列表中没有重复的数 for i in new_li: sum = sum+i return sum ret = func() print(ret)
6、从0-99这100个数中随机取出10个,要求不能有重复,可以自己设计数据结构
import random print(random.sample(range(0,99),10)) 1 )、random().randint() 返回0<=n<1之间的随机实数n; 2 )、choice(seq) 从序列seq中返回随机的元素; 3 )、getrandbits(n) 以长整型形式返回n个随机位; 4 )、shuffle(seq[, random]) 原地指定seq序列; 5 )、sample(seq, n) 从序列seq中选择n个随机且独立的元素;
7、cookie和session有什么区别?
cookie和session都可以存储用户信息,cookie存在浏览器端,session存在服务器端
8、Http协议是有状态协议还是无状态协议,如何从两次请求中判断是同一个用户
由于http协议是无状态的,每次请求进来都不知道是谁,是不会保存状态的,
这就有了cookie和session。我们可以根据每次请求带的cookie的值做判断
10、以下代码输出什么?
li = ['a','b','c','d','e'] print(li[10:]) #会报错,因为列表里面就没有第10个元素
浙公网安备 33010602011771号