美文网首页
记两次Python面试经历

记两次Python面试经历

作者: Cluas | 来源:发表于2017-11-03 21:48 被阅读424次

    随笔

    从离职到杭州找工作大概过了一周多了,首先庆幸自己有这么多好朋友好同学,在我没地方落脚的地方时候慷慨的提供住宿,也许我不善表达,但内心真的是无比感激。
    说起来自己也是第一次在外面独立生活。第一次面对了这个太真实的社会,投了很多简历,但是大都因为专业不符或者其他什么原因被刷了。我一边自我调节,一边告诫自己,让自己足够优秀才能让别人发现你。希望自己这次能真正的成长,能够独当一面,将来能够承受得起自己应当承受的责任。

    面试一(电话面试)

    北京的一个公司,面试采用电话面试,先是hr了解了下我的基本情况,说还是挺满意的,就让技术电面我。可能是自己准备不够,加上一些基础知识不扎实,自我感觉面试答的不够好。当时技术先介绍了下他的情况,是一个 运维主管,然后一开始问了我好多linux系统的问题,- - 我一想,我liunx只会用些基本的命令,导致它问我一些命令我几乎没使用过,所以几乎答不上来,当时就觉得liunx开发人员必学啊。技术想了下,就说问我python问题吧。具体问了啥可能记不全了,就把记得的几个记录下。
    python的装饰器,虽然我在平时也经常用到装饰器,但是让我详细说出定义我还真说不出来,我就回答,相当于一个函数外包了一层函数,可以给一些函数额外加一些功能,比如日志记录等。我并不知道自己回答如何,技术说差不多把就继续问下一个问题。
    python的自省,当时我第一时间没反应过来这是啥意思,然后技术引导了下我,就是打个比方python怎么知道变量的类型。然后我立马说type()方法,技术问,还有吗,我吞吞吐吐得说isinstance(obj, class),可能我答得有点犹豫,技术就没问更多了,可能他觉得我基础不够扎实吧,我只好尴尬的说比较紧张,确实比较紧张,我应该回答前先经过大脑的... 后来查了下,自省有五种(可能更多):
    type(),isinstance(obj, class),dir(), hasattr(), getattr()
    然后技术问了下生成器的知识,问我有在生产环境里用过吗,还有生成器的优点是啥。我当时第一反应就是省内存,技术说可以这么说,后来回去查了下生成器,边循环,边计算的机制,的确是节省内存的优点。然后我就感觉自己说话方式不好,表达不够坚定,明明自己知道的东西,回答确感觉像蒙的一样。让人感觉不够自信吧
    然后技术又问了Python并发的模型,当时我是真懵逼了,根本想不起来,最后说是不是同步IO,异步IO?然后技术说不是....说了下生产者消费者模型...当时我心里恍然大悟,这个我以前知道啊。。。以前看基础的时候学过,但是忘记了...说到底还是基础不够扎实。
    后面技术又问了几个问题,记不清了,后来他说就问到这了,可能对我的回答不是很满意吧。

    总结一

    linux真的很重要很重要很重要,还有Python基础必须再去过一遍,又想起了当年看《Python学习手册》- - 就是那本超级无敌啰嗦超级无敌细的Python教程那段日子。

    面试二(金融方向)

    首先不得不说,办公位置真是高大上,- - 楼下的电梯,按6楼愣是上不去....我就纳闷了,最后为了避免尴尬。。。我选择了走楼梯...是的你没听错...走楼梯,一口气上六楼,喘气的不行,在外面稳定了下气息。就进去了,还好从小就有守时的习惯,为我赢了点印象分吧。然后我填了基本资料,填完后,先是hr面试我。日常尴尬的自我介绍,我简单表达了我的情况。总体对自己不是很满意,可能不够自然吧,应该多锻炼下自己的沟通能力。回来了时候,还有了个想法,要是能够打字面试就好了,哈哈哈哈哈哈哈哈哈哈。跟HR聊完了之后,技术总监进来了,一看就是大牛,我有点慌,因为不是科班出身,我特别怕被问操作系统还有计算机底层的问题。总监了解下我的基本情况后,一看,我还没写笔试题目呢..当时我就直接说没事直接问吧(少年,我真佩服你的勇气...),然后总监开始问了些我简历上写的技术栈,现在脑子一片空白,当时问我啥我都记不太清了,就记得那几个我感觉答得不够好的问题。
    django orm里的Q代表什么?...当时我真的不知道啥意思,脑子里第一反应是query,应该跟数据库有关吧,最后说了下数据库,然后问了F,我一开始以为是Form表单呢...后来又想了下filter过滤..回去立马查了一下
    原来是在django.db.models里的东西,使用场景比方说:有一张表,保存着公司员工的工资,公司普涨工资,如何在model中操作,这就用到了F,首先需要导入此模块:

    from django.db.models import F
    操作:

    models.UserInfo.objects.filter().update(salary=F('salary')+500)
    Q操作是主要用来构造搜索条件
    model中查询搜索有三种方式:

    1. 传参数
    2. 传字典
    3. 就是传Q对象
      传参数
      models.UserInfo.objects.filter(id=3,name='alex')
      传字典
      需要注意的是,传入字典时,字典前面需要加 **,标记为字典
      dic = {'id':123,'name':'alex'} models.UserInfo.objects.filter(**dic)
      传Q对象构造搜索条件
      首先导入模块
      from django.db.models import Q
      传入条件进行查询:
    q1 = Q()
    q1.connector = 'OR'
    q1.children.append(('id', 1))
    q1.children.append(('id', 2))
    q1.children.append(('id', 3))
       
    models.Tb1.objects.filter(q1)
    

    合并条件进行查询:

    con = Q()
    
    q1 = Q()
    q1.connector = 'OR'
    q1.children.append(('id', 1))
    q1.children.append(('id', 2))
    q1.children.append(('id', 3))
    
    q2 = Q()
    q2.connector = 'OR'
    q2.children.append(('status', '在线'))
    
    con.add(q1, 'AND')
    con.add(q2, 'AND')
    
    models.Tb1.objects.filter(con)
    

    天呐- - 我当时答的真是一塌糊涂....
    后来又问了Djangorestfulframework模块的知识,怎么构造了,我答了,需要先构造一个序列器,我应该答得更加详细才对,我一紧张,来Serializer都拼不出来了...只好说自己英语不好...贼尴尬。
    后来还问了一个python程序的设计模式,平时真的没注意这个问题,一时答不上来,后来总监说了个单例模式,脑子里一下子有了印象,我说import就是一个单例模式,还能用装饰器实现,还有就是在构造类的时候,在new方法里加个判断,但是我是想这么说的...但是我当时不知道说了啥...总监后来给我解释了下,相当于一个全局里的字典。- -

    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

    new()在init()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例

    1. 使用new方法
    class Singleton(object):
        def __new__(cls, *args, **kw):
            if not hasattr(cls, '_instance'):
                orig = super(Singleton, cls)
                cls._instance = orig.__new__(cls, *args, **kw)
            return cls._instance
    
    class MyClass(Singleton):
        a = 1
    
    1. 共享属性(总监应该是说这个..)
      创建实例时把所有实例的dict指向同一个字典,这样它们具有相同的属性和方法.
    class Borg(object):
       _state = {}
       def __new__(cls, *args, **kw):
           ob = super(Borg, cls).__new__(cls, *args, **kw)
           ob.__dict__ = cls._state
           return ob
    
    class MyClass2(Borg):
       a = 1
    
    1. 装饰器版本
    def singleton(cls, *args, **kw):
        instances = {}
        def getinstance():
            if cls not in instances:
                instances[cls] = cls(*args, **kw)
            return instances[cls]
        return getinstance
    
    @singleton
    class MyClass:
      ...
    
    1. import方法
      作为python的模块是天然的单例模式
    # mysingleton.py
    class My_Singleton(object):
        def foo(self):
            pass
    
    my_singleton = My_Singleton()
    
    # to use
    from mysingleton import my_singleton
    
    my_singleton.foo()
    

    啊- - 真是被自己气到,这题应该答得出来才对.
    后面还问了写线程跟协程的问题,我其实就在写爬虫的时候用过多线程,我应该写了解不应该写熟悉的,总监懂得很多,跟我说了下锁之类的东西。还问了我docker的部署,- - 我说当初搭shadowsocks时候用过...
    其他问题记不太清了,好像还问了前端框架的了解情况,我就会基本的,总监说主要用vue.js(回头要好好了解下了)。

    总结

    第一个感觉还是linux很重要,必学必学必学,还有就是需要补充计算机基础知识,设计模式这些,还有算法也是必须的...近期准备把C语言学一遍,还有算法。感觉自己还是太欠缺了,啥时候能面试的时候对答如流啊啊啊啊..沟通能力也欠缺,我应该表现的更加坚定的...哎,希望能顺利通过,多看书多做事, 自勉!

    相关文章

      网友评论

          本文标题:记两次Python面试经历

          本文链接:https://www.haomeiwen.com/subject/clrxmxtx.html