程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

python面试题

发布于2019-07-30 10:10     阅读(5001)     评论(0)     点赞(13)     收藏(6)


一、列表生成式

  面试题1:lambda表达式

v = [lambda : i+100 for i in range(4)]
result = v[0]()
print(result)                 #结果为103
总结:先for循环,每循环一次得到一个lambda表达式(匿名函数),共循环四次得到一个列表内有四个lambda表达式,并且for循环后的i为3.

   面试题2:

def create_multipliers():
    return [lambda x: i * x for i in range(4)]
   # multipliers内嵌套一个匿名函数
   # 该匿名函数引用外部非全局变量 i
   # 返回该嵌套函数
print([y(2) for y in create_multipliers()])
结果:[6, 6, 6, 6]
总结:和1类似循环四次得到四个lambada表达式,此时的i是循环了四次后的i,最后循环每一个lambada表达式并且赋值执行。这道题考的是python的闭包函数和延迟绑定
   闭包函数:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure),并且外部函数作用域返回内部函数,(这句话可以不满足),装饰器就是个
闭包函数
   延迟绑定:因为匿名函数中的i并不是立即引用后面循环中的i值的,而是在运行嵌套函数的时候,才会查找i的值,这个特性也就是延迟绑定,
        其实就是只有当运行嵌套函数的时候,才会引用外部变量i,不运行的时候,并不是会去找i的值
 

二、函数

def func(a1, data_list=[]):
    data_list.append(a1)
    return data_list
r1 = func(1)
print(id(r1),r1)
r2 = func(6, [11, 22, 33])
print(id(r2),r2)
r3 = func(2)
print(id(r3),r3)
结果:2169189110856 [1]
   2169189110664 [11, 22, 33, 6]
   2169189110856 [1, 2]
总结:函数传参时默认参数的值永远不会消失,而且传入参数(实参)时,形参(默认参数)不会被覆盖(内部会有两个值,即形参和实参),如果下一次传值时没有传实参会以上一次的形参为主。
注意:data_list=[]和data_list=None的区别(坑)

 

三、关于前端this的理解

关于this的面试题
注释:如果func中的f为小写就认定他是对象,如果f为大写就认定他是类
	   function func(){alter(this) }//this, 代指window,由于func是个对象,该对象是被window调用执行
	   window.func()
	  
########################################################################总结:由于对象被window执行,所以对象内的this指代的是window function Func(){this.name='alex'; } // this,代指obj对象,由于Func是个类,类实例化产生对象,而name是被obj调用 obj = new Func();
       console.log(obj.name);
########################################################################总结:由于类中数据被类实例化对象执行,所以类中的this指代的是实例化对象
	  function Func(){
		this.name='alex'; // this,代指obj对象
		this.show = function(){
			console.log(this);}}//this指定obj对象
	    obj = new Func();
	    obj.show()
		
########################################################################总结:由于类中对象被类实例化对象执行,所以类中对象中this指代的是实例化对象
	   userInfo = {name:'alex',age: 18,
	         show:function(){
				console.log(this)} }
	   userInfo.show()
################################################################################# 结论:由于对象中元素被对象执行,所以对象中this指代的是对象 userInfo = {name:'alex', age: 18, show:function(){ console.log(this); #userinfo对象 (function(){//子执行函数 console.log(this); # window })()} } userInfo.show() ################################################################################# function Func(){this.name='alex'; // this,代指obj this.show = function(){ console.log(this); # obj对象 (function(){ //自执行函数 console.log(this); # window })()}} obj = new Func(); obj.show()
##################################################################################总结:不管是在类中还是在对象中,自执行函数都是被window执行,所以自执行函数内的this指代的是window对象 userInfo = {name:'alex', age: 18, show:function(){ console.log(this); #userinfo 对象 var that = this; (function(){//子执行函数 console.log(that); # userinfo对象 })()}} userInfo.show()
#################################################################################总结:this指代userInfo对象,在上一层已经赋值给that

总结::无论是对象还是函数还是元素,被哪个对象执行那么this就是指代的那个对象

 四、python实现单例模式

  1、使用模块

    Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码

  2、使用 __new__

    __init__不是Python对象的构造方法,__init__只负责初始化实例对象,在调用__init__方法之前,会首先调用__new__方法生成对象,可以认为__new__方法充当了构造方法的角色。所以可以在__new__中加以控制,使得某个类只生成唯一对象。具体实现时可以实现一个父类,重载__new__方法,单例类只需要继承这个父类就好。

  3、使用装饰器(decorator)

    装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例

  4、使用元类(metaclass)

    元类(metaclass)可以控制类的创建过程,它主要做三件事:1、拦截类的创建,2、修改类的定义,3、返回修改后的类

五、计算该天是一年中的第几天?

  1、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年);

  2、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年);

  3、闰年2月29天,全年一共366天,平年2月28天,全年一共365天

 



所属网站分类: 技术文章 > 博客

作者:dkjf787

链接:https://www.pythonheidong.com/blog/article/2219/185fe9c4a2373fe91173/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

13 0
收藏该文
已收藏

评论内容:(最多支持255个字符)