python面试题总结

一、下列函数的执行结果

执行结果

重点fn(3)为什么是01014,因为list是可变对象,之前操作过fn(2)改变了列表l

二、python迭代器和生成器的区别

先说迭代器,对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束。
生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)。

生成器是特殊的迭代器,用yield替代了__iter__和__next__方法

三、redis数据类型有哪些,缓存在系统中起到了什么作用。

str  hash list set zset  

尽量减少IO的操作,特别是磁盘IO的操作;使用缓存可以有效的避免这种情况

四、python有几种方式实现单例模式?

1.使用模块。模块在导入时候,会产生pyc文件,在第二次导入时,会直接加载pyc文件,而不是再次执行模块代码,

用的时候直接导入,这个singleton就是单例对象

2、使用装饰器。

3.使用类

4、使用__new__

5、使用元类

五、将整型转换成货币型1234567----$1,234,567

a = 12345678
a = format(int(a),',')
print(a)

六、正则匹配

七、按照列表中的k键的值排列

方法1 

方法2

八、sql语句

1,select sid from sc;

2case then else end用来定制上面那一排课程名

九、python常见任务队列

celery

十、profile方式扩展auth_user字段

由于Django自带的User模型字段邮箱,所以我们需要对其扩展,最便捷的方式就是创建UserProfile的模型,如下所示。我们添加了org和telephone两个字段。

(参考 https://blog.csdn.net/weixin_42134789/article/details/80656289

十一、

题目运行结果

解决方式 iterator的()改成[]就好了

分析下过程 为啥原来的不行。

iterator是一个生成器,每次调用只返回一个值,例第一次为1,第二次为2,第三次3

关于列表生成式嵌套,自己搜资料。

先看外层 x,调用一次iterator,x为1

此时内部继续调用iterator,y值为2, x*y=2

注意,这里类似于两层for 循环,所以y继续循环,y值为3,x依旧是1,x*y为3

到此为第一次大循环结束

继续第二次,但是由于iterator是个生成器,只能有1 2 3 三个结果,第四次就超出边界了,所以这是外层x会报错。

所以最后的结果[[2, 3]]

 

十二、闭包作用于试题

运行结果为[6,6,6,6]

解释下原因。

return 返回的实际是个列表,里面放着四个lambda函数的内存地址,

外层for循环控制循环次数,lambda的内部命名空间只有一个x = 2,   那个i实际是外层函数的,lambda需要去外面拿,i是一个指针,指向它的值,而且i只能在外面被修改,lambda只有调用的份,所以

第一次 i → 0,第二次 i→1 第三次 i→2 第四次 i→3,指针经过四次变化最终停在了3,对应内层函数也受影响,所以四个i都是3。

最后结果也就是[6,6,6,6]

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值