Python面试攻略(嗨谈篇)

选出了其中出现频率最高的十个题目,附上答案供各位小伙伴参考!

1.*args和**kwargs是什么意思?

答:*args表示可变参数(variadic arguments),它允许你传入0个或任意个无名参数,这些参数在函数调用时自动组装为一个tuple; **kwargs表示关键字参数(keyword arguments),它允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。同时使用*args和**kwargs的时候,必须保证*args在**kwargs之前。

扩展阅读:

https://blog.csdn.net/mbugatti/article/details/53884455

2.python里面如何拷贝一个对象?

答:

(1) 赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个;

(2)浅拷贝(copy.copy()),创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另一个也会被改变);

(3)深拷贝(copy.deepcopy()),创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另一个不会改变)

注意:并不是所有的对象都可以拷贝

扩展阅读:

http://www.cnblogs.com/wilber2013/p/4645353.html

3.简要描述python的垃圾回收机制

答:python中的垃圾回收是以引用计数为主,标记-清除和分代收集为辅。

引用计数:python在内存中存储每个对象的引用计数,如果计数变成0,该对象就会消失,分配给该对象的内存就会释放出来。

标记-清除:一些容器对象,比如说list、dict、tuple、instance等可能会出现引用循环,对于这些循环,垃圾回收器会定时回收这些循环(对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边)。

分代收集:python把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代是被优先处理的,因此越晚创建的对象越容易被回收。

扩展阅读:

https://www.jianshu.com/p/1e375fb40506

4.什么是lambda函数?它有什么好处?

答:lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。

Python允许你定义一种单行的小函数。定义lambda函数的形式如下(lambda参数:表达式)lambda函数默认返回表达式的值。你也可以将其赋值给一个变量。lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个。

扩展阅读:

https://www.zhihu.com/question/20125256

5.python如何实现单例模式?

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

__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

2.共享属性

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

3.装饰器版本

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:
...

4.import方法

class My_Singleton(object):
  def foo(self):
      pass

my_singleton = My_Singleton()

# to use
from mysingleton import my_singleton

my_singleton.foo()

扩展阅读:

https://blog.csdn.net/sirodeng/article/details/17426543

6.python自省

答:自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型,简单一句就是运行时能够获得对象的类型,比如type(),dir(),getattr(),hasattr(),isinstance().

a = [1,2,3]
b = {‘a‘:1,‘b‘:2,‘c‘:3}
c = True
print type(a),type(b),type(c) # <type ‘list‘> <type ‘dict‘> <type ‘bool‘>
print isinstance(a,list)  # True

扩展阅读:

https://kb.cnblogs.com/page/87128/

7.谈一谈python的装饰器

答:装饰器本质上是一个python函数,它可以让其他函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景。比如:插入日志、性能测试,事务处理、缓存、权限验证等。有了装饰器我们就可以抽离出大量的与函数功能无关的雷同代码进行重用。

扩展阅读:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000

8.什么是鸭子类型?

答:在鸭子类型中,关注的不是对象的类型本身,而是他如何使用的。例如,在不适用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。

class duck():
  def walk(self):
      print(‘I am duck,I can walk...‘)
  def swim(self):
      print(‘I am duck,I can swim...‘)
  def call(self):
      print(‘I am duck,I can call...‘)

duck1=duck()
duck1.walk()
    # I am duck,I can walk...
duck1.call()      # I am duck,I can call...

扩展阅读:

https://blog.csdn.net/handsomekang/article/details/40270009

[email protected]和@staticmethod

答:@classmethod修饰符对应的函数不需要实例化,不需要self参数,第一个参数需要是表示自身类的cls参数,cls参数可以用来调用类的属性,类的方法,实例化对象等。@staticmethod返回函数的静态方法,该方法不强制要求传递参数,如下声明一个静态方法:

Class C(object):

@staticmethod

Def f(arg1, arg2,…):

以上实例声明了静态方法f,类可以不用实例化就可以调用该方法C.f(),也可以实例化后调用C().f()。

扩展阅读:

https://zhuanlan.zhihu.com/p/28010894

10.谈一谈python中的元类

答:一般来说,我们都是在代码里定义类,用定义的类来创建实例。而使用元类,步骤又是同,定义元类,用元类创建类,再使用创建出来的类来创建实例。元类的主要目的就是为了当创建类时能够自动地改变类。

扩展阅读:

https://blog.csdn.net/wenyu826/article/details/66972933

  • 来源:DataCastle数据城堡
  • https://mp.weixin.qq.com/s/6LAlubLiTe-vxcoatQSEnQ

原文地址:https://www.cnblogs.com/tianqizhi/p/9465278.html

时间: 2024-10-05 04:56:32

Python面试攻略(嗨谈篇)的相关文章

思维导图学 Linux Shell攻略之干货篇 mysql数据库脚本管理系统

以结果为导向的学习,才是最有效率学习.笔者以前也曾经隔三差五的学习linux shell编程来着.给我的感觉就是,今天学了,后天忘了,一星期之后就白学了. 还好,最近自己平时没啥事,一直照着<linux shell攻略>,学做一些小例子,看着自己写的shell程序,简单的几行程序,实现一些好玩的效果,信心满满.不知不觉间,慢慢坚持了2周. 说说自己的干货吧.其实就是一个linux 操作mysql数据库脚本管理系统. 功能谈不上复杂,就是在平时工作中,笔者要维护多套业务系统,这些业务系统主要功能

Python应用攻略 ---- Mac环境下Flask+Nginx+FastCGI实现Python应用部署

对于一个iOS开发者来说,会写后台应用并非必要的技能,然而掌握一门后台语言却无疑可以锦上添花,不仅可以对前后台架构有更加全面的了解,同时在实际开发工作中也可以自己写一些后台应用. flask框架本身集成了一个简单的服务器,可以在本机调用,然而在这种情况下要调用Python应用接口就只能使用模拟器调试,若想要使用真机调试,我们还是需要正儿八经地部署服务器. 在这里,我们介绍一种Nginx搭配FastCGI实现Mac环境下的本地服务器部署. Nginx配置 a. 安装HomeBrew ruby -e

思维导图学 Linux Shell攻略之小试牛刀篇

曾听一位大神讲过,带着目的去学,知识往往能记得牢,记得稳.借助思维导图这个工具,对一些我感兴趣的知识点进行分类管理.以后方便自己复习. 我会以思维导图+代码段的方式,回滚学习linux shell编程. 转义/色彩 与用户交互的接口 #打印一个普通的字符串 [[email protected] ~]# echo "it's isa dog" it's is a dog   #打印一个带有单引号和换行符的字符串,单引号可正常输出,但换行符没有效果 #没有达到想要的效果 [[email p

iOS面试攻略下篇:Objective-C面试题和基本概念(1)

文章转自:http://www.educity.cn/develop/1381885.html 1.Object-C有多继承吗?没有的话用什么代替?cocoa 中所有的类都是NSObject 的子类  多继承在这里是用protocol 委托代理 来实现的 你不用去考虑繁琐的多继承 ,虚基类的概念. ood的多态特性 在 obj-c 中通过委托来实现. 2.Object-C有私有方法吗?私有变量呢?  objective-c – 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向

python challenge 攻略(未完待续)

0.http://www.pythonchallenge.com/pc/def/0.html 很简单,求2^38 1 __author__ = 'lonnelan' 2 3 print 2**38 得到答案274877906944 输入地址栏:http://www.pythonchallenge.com/pc/def/274877906944.html 1.http://www.pythonchallenge.com/pc/def/274877906944.html 明显是个解密,映射就是k->

DAVINCI DM3730开发攻略——应用程序例程分析

过完2015年春节回来了,利用上班前的几天时间,先把这篇文章写完,本来是先写<DAVINCI DM3730开发攻略--linux-2.6.32移植>,但是那篇文章涉及内核的东西太多,不太好写,而本人已经很长时间没写新文章了,先发布这篇文章.后来想了想,从应用程序使用的角度分析,再一步一步深入内核里边去,也许更好. 前面几篇DM3730开发攻略讲到:一个DAVINCI  DM3730板子程序由xload,uboot, linux-2.6.32或者(linux-2.6.37),文件系统rootfs

Gradle脚本基础全攻略

[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 在开始Gradle之前请务必保证自己已经初步了解了Groovy脚本,特别是闭包规则,如果还不了解Groovy则可以先看<Groovy脚本基础全攻略>这一篇博客速成一下Groovy基础,然后再看此文即可.关于Gradle速成干货基础详情也请参考Geadle官方网站,不好意思我太Low了. Gradle核心是基于Groovy的领域特定语言(DSL,具体概念参见<

带你穷游阿里云,寻找阿里云最省钱网站建设攻略!

有人发最省钱旅游攻略,有人发最省钱美味饭功略,有人发最省钱购物攻略~今儿,小编就发一个穷游阿里云,最省钱网站建设攻略! 这篇文章主要给已经在或者准备在阿里云混迹的站长们传授下如何能够在阿里云各种淘,花最少的钱搭建并且装扮自己的网站~ 这里以搭建phpwind社区论坛为例. 准备工作: 1. 获取phpwind安装包(加商业授权) http://market.aliyun.com/products/55586021/cmjz000388.html 重点介绍下商业授权,站长们都知道phpwind是开

图像识别DM8127开发攻略——KERNEL的移植说明

图像识别DM8127开发攻略--KERNEL的移植说明 接上一篇<图像识别DM8127开发攻略--UBOOT的移植说明>的步伐,DM8127开发攻略最后一篇文章是有关Kernel的裁剪移植.基于APPRO RDK3.8.0的基础上,我们对/ti_tools/ipnc_psp_arago/kernel进行裁剪和移植,这个kernel是linux-2.6.37版本:一.第一步还是做裁剪工作,删除多余的文件夹和文件,方便程序在每个阶段备份保存.1.先在kernel/fs/hostf/Makefile