zoukankan      html  css  js  c++  java
  • python面试题

    一、列表生成式

      面试题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天

  • 相关阅读:
    v:bind指令对于传boolean值的注意之处
    vue项目依赖的安装
    直接将文件存放到服务器tomcat中,就可以直接访问文件等
    什么情况下用vue.use方法
    创建Vue项目及其内容分析
    linux安装nginx以及如何启动,暂停,停止操作
    vue项目怎么搭建到云服务器上
    Nginx安装
    UNP学习笔记(第三十章 客户/服务器程序设计范式)
    UNP学习笔记(第二十六章 线程)
  • 原文地址:https://www.cnblogs.com/xuanan/p/7724497.html
Copyright © 2011-2022 走看看