Python笔试面试题小结
1.字符串处理
将字符串中的数字替换成其两倍的值,例如:
修改前:"AS7G123m(d)F77k"
修改后:"AS14G246m(d)F154k"
个人思路:先用正则表达式将其中的数字匹配出来进行乘2操作,然后将字符串根据其中的数字进行切割,得到一个字符列表,最终将乘以2后的数字和原有的字符进行拼接得到最后的结果。(我脑子比较笨,想不到别的,如果您有更好更简便的方法,希望可以分享一下!)
importre text="AS7G123m(d)F77k" nums=re.findall(r'(\d+)',text)#取出字符串中数字 double_nums=[2*int(i)foriinnums]#乘以2 the_str=[]#字符列表 foriinnums: the_str.append(text.split(i,1)[0]) text=text.split(i,1)[1] result=""#结果 foriinrange(len(double_nums)): result+=the_str[i]+str(double_nums[i]) result+=text print(result)
2.Python传参是值传递还是引用传递?
答案是Python中传递参数是引用传递,那么要证明是引用传递呢?可以参考下面这个例子:
deff(x): print(id(x)) a=1 print(id(a)) f(a) #140716760159264 #140716760159264
这里分别打印了两个地址,一个是对象a的地址,一个是传入的参数x的地址,可以看到两个地址是一样的,这也就说明Python中的传参使用的引用传递!需要注意的是:对于不可变类型,在函数中对其操作并不会对原对象产生影响,但对于可变类型,在函数中对其操作则可能会改变其值,如下:
1)传入的参数是不可变类型:
deff(x): x+="666"#这里会创建一个新的对象 print(x) s="777"#字符串不可变 print(s) f(s) print(s) #777 #777666 #777
2)传入的参数是可变类型:
deff(x): x.append(4)#修改原对象的值 print(x) s=[1,2,3]#列表可变 print(s) f(s) print(s) #[1,2,3] #[1,2,3,4] #[1,2,3,4]
3.浅拷贝与深拷贝的那些事
在Python中,浅拷贝与深拷贝是一定要分清楚的!对于浅拷贝和深拷贝,可以这么理解:
1)浅拷贝:创建一个对象,但其中包含的是原对象中所包含项的引用,如果用引用的方式修改了其中的对象,就会对原对象进行改变。
2)深拷贝:创建一个对象,并且递归复制原对象中所包含的对象,此时修改数据不会对原对象产生影响。
在下面的代码中包含了赋值、浅拷贝和深拷贝,在Python中赋值即引用对象,所以对c操作也就是对原对象a进行操作,对于浅拷贝对象b和d,对其中的引用进行操作会改变对a中的对象,而对深拷贝对象e进行操作就与原对象a无关了。
importcopy a=[1,[2],3] b=a[:]#使用切片操作,浅拷贝 c=a#赋值操作,即引用 d=a.copy()#浅拷贝 e=copy.deepcopy(a)#深拷贝 b.append(4) c.append(5) d.append(6) d[1].append(2) e.append(7) e[1].append(3) print(a)#[1,[2,2],3,5] print(b)#[1,[2,2],3,4] print(c)#[1,[2,2],3,5] print(d)#[1,[2,2],3,6] print(e)#[1,[2,3],3,7]
4.Python一行式能干嘛?
下面是一些Python一行式的示例,从中可以看出Python是非常简洁和强大的!
1)一行代码输出一百以内的奇数:
print([xforxinrange(100)ifx%2])
2)一行代码求水仙花数:
print([xforxinrange(100,1000)ifint(str(x)[0])**3+int(str(x)[1])**3+int(str(x)[2])**3==x])
3)一行代码打印九九乘法表:
print("".join(["{}*{}={}\t".format(x,y,x*y)ifx!=yelse"{}*{}={}\n".format(x,y,x*y)forxinrange(1,10)foryinrange(1,x+1)]))
4)一行代码实现IP地址转换,如将192.168.12.1转换成0b11000000101010000000110000000001:
print("0b"+"".join(("00000000"+bin(int(i)).replace("0b",""))[-8:]foriinip.split(".")))
5)一行代码求1到10的和:
fromfunctoolsimportreduce;print(reduce(lambdax,y:x+y,[iforiinrange(1,11)]))
5.下面这段代码的结果是什么?
defmul(): return[lambdax:x*iforiinrange(4)] print([m(2)forminmul()])
以上这段代码输出的结果是[6,6,6,6],而不是[0,2,4,6]!
产生这个问题的原因在于Python闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内进行查找。所以当mul()返回的函数被调用时,i的值会在返回的函数里查找,而for循环完成后i的值为3,也就是i最终赋值为3。因此,每次返回的函数乘以传入的值就是最后的结果,得到的结果就是[6,6,6,6]。
如果要解决这个问题,可以参考以下方法:
1)使用Python生成器。
defmul(): foriinrange(4): yieldlambdax:x*i print([m(2)forminmul()])
2)创造一个闭包,利用默认函数进行绑定。
defmul(): return[lambdax,i=i:x*iforiinrange(4)] print([m(2)forminmul()])
这篇文章先介绍到这,后期毛票票小编会为大家分享更多的文章。