python面试-Python面试
1.args和kwargs是什么意思?
答:args表示可变参数(variadic arguments),它允许你传入0个或任意个无名参数,这些参数在函数调用时自动组装为一个tuple; kwargs表示关键字参数(keyword arguments),它允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。同时使用*args和kwargs的时候,必须保证*args在**kwargs之前。
扩展阅读:
2.python里面如何拷贝一个对象?
答:
(1) 赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个;
(2)浅拷贝(copy.copy()),创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另一个也会被改变);{1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
(3)深拷贝(copy.deepcopy()),创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另一个不会改变)
注意:并不是所有的对象都可以拷贝
扩展阅读:
3.简要描述python的垃圾回收机制
答:python中的垃圾回收是以引用计数为主,标记-清除和分代收集为辅。
引用计数:python在内存中存储每个对象的引用计数,如果计数变成0,该对象就会消失,分配给该对象的内存就会释放出来。
标记-清除:一些容器对象,比如说list、dict、tuple、instance等可能会出现引用循环,对于这些循环,垃圾回收器会定时回收这些循环(对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边)。
分代收集:python把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代是被优先处理的,因此越晚创建的对象越容易被回收。
扩展阅读:
4.什么是lambda函数?它有什么好处?
答:lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
Python允许你定义一种单行的小函数。定义lambda函数的形式如下(lambda参数:表达式)lambda函数默认返回表达式的值。你也可以将其赋值给一个变量。lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个。
扩展阅读:
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()
扩展阅读:
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) #
print isinstance(a,list) # True
扩展阅读:
7.谈一谈python的装饰器
答:装饰器本质上是一个python函数,它可以让其他函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景。比如:插入日志、性能测试,事务处理、缓存、权限验证等。有了装饰器我们就可以抽离出大量的与函数功能无关的雷同代码进行重用。
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...
扩展阅读:
9.@classmethod和@staticmethod
答:@classmethod修饰符对应的函数不需要实例化,不需要self参数,第一个参数需要是表示自身类的cls参数,cls参数可以用来调用类的属性,类的方法,实例化对象等。@staticmethod返回函数的静态方法,该方法不强制要求传递参数,如下声明一个静态方法:
Class C(object):
@staticmethod
Def f(arg1, arg2,…):
…
以上实例声明了静态方法f,类可以不用实例化就可以调用该方法C.f(),也可以实例化后调用C().f()。
扩展阅读:
10.谈一谈python中的元类
答:一般来说,我们都是在代码里定义类,用定义的类来创建实例。而使用元类,步骤又是同,定义元类,用元类创建类,再使用创建出来的类来创建实例。元类的主要目的就是为了当创建类时能够自动地改变类。
扩展阅读:
1.台阶问题/斐波那契
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少中跳法:
fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)
第二种方法:
def memo(func):
cache = {}
def wrap(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrap
@memo
def fib(i):
if i < 2:
return 1
return fib(i-1) + fib(i-2)
第三种方法:
def fib(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return b
2.去除列表中的重复元素
用集合
list(set(l))
用字典
l1 = ['b','c','d','b','c','a','a']
l2 = {}.fromkeys(l1).keys()
print (l2)
列表推导式
l1 = ['b','c','d','b','c','a','a']
l2 = []
[l2.append(i) for i in l1 if not i in l2]
3.合并两个有序列表
尾递归
def _recursion_merge_sort2(l1, l2, tmp):
if len(l1) == 0 or len(l2) == 0:
tmp.extend(l1)
tmp.extend(l2)
return tmp
else:
if l1[0] < l2[0]:
tmp.append(l1[0])
del l1[0]
else:
tmp.append(l2[0])
del l2[0]
return _recursion_merge_sort2(l1, l2, tmp)
def recursion_merge_sort2(l1, l2):
return _recursion_merge_sort2(l1, l2, [])
循环算法
思路:
定义一个新的空列表
比较两个列表的首个元素
小的就插入到新列表里
把已经插入新列表的元素从旧列表删除
直到两个旧列表有一个为空
再把旧列表加到新列表后面
def loop_merge_sort(l1, l2):
tmp = []
while len(l1) > 0 and len(l2) > 0:
if l1[0] < l2[0]:
tmp.append(l1[0])
del l1[0]
else:
tmp.append(l2[0])
del l2[0]
tmp.extend(l1)
tmp.extend(l2)
return tmp
pop弹出
a = [1,2,3,7]
b = [3,4,5]
def merge_sortedlist(a,b):
c = []
while a and b:
if a[0] >= b[0]:
c.append(b.pop(0))
else:
c.append(a.pop(0))
while a:
c.append(a.pop(0))
while b:
c.append(b.pop(0))
return c
print (merge_sortedlist(a,b))
4.二分查找
#coding:utf-8
def binary_search(list,item):
low = 0
high = len(list)-1
while low<=high:
mid = int((low+high)/2)
guess = list[mid]
if guess>item:
high = mid-1
elif guess
low = mid+1
else:
return mid
return None
mylist = [1,3,5,7,9]
print (binary_search(mylist,3))
5.快排
#coding:utf-8
def quicksort(list):
if len(list)<2:
return list
else:
midpivot = list[0]
lessbeforemidpivot = [i for i in list[1:] if i<=midpivot]
biggerafterpivot = [i for i in list[1:] if i > midpivot]
finallylist = quicksort(lessbeforemidpivot)+[midpivot]+quicksort(biggerafterpivot)
return finallylist
print (quicksort([2,4,6,7,1,2,5]))
6.使用python实现单例模式
方法一:可以使用__new__方法
在__new__方法中把类实例绑定到类变量_instance上,如果cls._instance为None表示该类还没有实例化过,实例化该类并返回。如果cls_instance不为None表示该类已实例化,直接返回cls_instance
class SingleTon(object):
def __new__(cls,*args,**kwargs):
if not hasattr(cls,'_instance'):
cls._instance = object.__new__(cls,*args,**kwargs)
return cls._instance
class TestClass(SingleTon):
a = 1
test1 = TestClass()
test2 = TestClass()
print (test1.a,test2.a)
test1.a=2
print (test1.a,test2.a)
print (id(test1),id(test2))
方法二:使用装饰器,建立过实例的就放到instances里面,下次建立的时候先检查里面有没有
def SingleTon(cls,*args,**kwargs):
instances = {}
print (instances)
def _singleton():
if cls not in instances:
instances[cls] = cls(*args,**kwargs)
print (instances)
return instances[cls]
return _singleton
@SingleTon
class LastClass(object):
a = 1
test1 = LastClass()
print (test1.a)
test2 = LastClass()
print (test2.a)
方法三:使用__metaclass__(元类)关于元类看看这个吧:http://blog.jobbole.com/21351/
class SignalTon(type):
def __init__(cls,name,bases,dict):
super(SignalTon, cls).__init__(name,bases,dict)
cls._instance = None
def __call__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(SignalTon,cls).__call__(*args,**kwargs)
return cls._instance
class TestClass(object):
__metaclass__ = SignalTon
test1 = TestClass()
test2 = TestClass()
test1.a = 2
print (test1.a,test2.a)
print (id(test1),id(test2))
方法四:共享属性
所谓单例就是所有的引用(实例,对象)拥有相同的属性和方法,同一个类的实例天生都会有相同的方法,那我们只需要保证同一个类所产生的实例都具有相同的属性。所有实例共享属性最简单直接的方法就是共享__dict__属性指向。
class SingleTon(object):
_state = {}
def __new__(cls, *args, **kwargs):
obj = object.__new__(cls,*args,**kwargs)
obj.__dict__ = cls._state
return obj
class TestClass(SingleTon):
a = 1
test1 = TestClass()
test2 = TestClass()
print (test1.a,test2.a)
test1.a = 2
print (test1.a,test2.a)
print (id(test1),id(test2))
方法五:使用同一个模版,写在mysingleton.py中
class My_Singleton(object):
def foo(self):
pass
my_singleton = My_Singleton()
#写在要使用这个实例的py文件里面,在不同的引用的地方都引用相同的实例,以此实现单例模式
from mysingleton import my_singleton
my_singleton.foo()
7.前中后序遍历
深度遍历改变顺序就好了
#coding:utf-8
#二叉树的遍历
#简单的二叉树节点类
class Node(object):
def __init__(self,value,left,right):
self.value = value
self.left = left
self.right = right
#中序遍历:遍历左子树,访问当前节点,遍历右子树
def mid_travelsal(root):
if root.left is None:
mid_travelsal(root.left)
#访问当前节点
print(root.value)
if root.right is not None:
mid_travelsal(root.right)
#前序遍历:访问当前节点,遍历左子树,遍历右子树
def pre_travelsal(root):
print (root.value)
if root.left is not None:
pre_travelsal(root.left)
if root.right is not None:
pre_travelsal(root.right)
#后续遍历:遍历左子树,遍历右子树,访问当前节点
def post_trvelsal(root):
if root.left is not None:
post_trvelsal(root.left)
if root.right is not None:
post_trvelsal(root.right)
print (root.value)
8.super函数的原理
#阅读下面的代码,它的输出结果是什么?
class A(object):
def __init__(self):
print ("enter A")
super(A, self).__init__() # new
print ("leave A")
class B(object):
def __init__(self):
print ("enter B")
super(B, self).__init__() # new
print ("leave B")
class C(A):
def __init__(self):
print ("enter C")
super(C, self).__init__()
print ("leave C")
class D(A):
def __init__(self):
print ("enter D")
super(D, self).__init__()
print ("leave D")
class E(B, C):
def __init__(self):
print ("enter E")
super(E, self).__init__() # change
print ("leave E")
class F(E, D):
def __init__(self):
print ("enter F")
super(F, self).__init__() # change
print ("leave F")
#输出
enter F
enter E
enter B
enter C
enter D
enter A
leave A
leave D
leave C
leave B
leave E
leave F
python面试-Python面试相关推荐
- 一位资深程序员面试Python工程师的岗位心得和历程
说一些面试的心得体会: 1.简历制作 我做了两份简历,用两个手机账号,两个简历名字,分别在各个招聘网站投了双份简历,一个是数据分析的简历.一个是web全栈开发的简历,我真正接触python快2年,不管 ...
- python面试-Python面试常问的10个问题
很多人想找Python工作,面试往往在基础知识点采坑了 Python是个非常受欢迎的编程语言,随着近些年机器学习.云计算等技术的发展,Python的职位需求越来越高.下面我收集了10个Python面试 ...
- Python程序员面试必备常用问题答案及解析
源 | 小象 文 | 水木华章 在发布<Python程序员面试,这些问题你必须提前准备!>一文后,应广大程序员朋友的强烈要求,小编就Python程序员面试必备问题整理了一份参考答案 ...
- python程序员面试题精选100题_在Python程序员面试中被问的最多的10道题
我们在为大家整Python程序员面试试题中,发现了一些被面试官问到的最多的一些问题,以下就是本篇内容: Python是个非常受欢迎的编程语言,随着近些年机器学习.云计算等技术的发展,Python的职位 ...
- python程序员面试算法宝典pdf-Python程序员面试笔试宝典
本书是一本讲解Python程序员面试笔试的百科全书,在写法上,除了讲解如何解答Python程序员面试笔试问题以外,还引入了相关知识点辅以说明,让读者能够更加容易理解.本书将Python程序员面试笔试过 ...
- 【Python】Python学到什么程度可以面试工作?------持续更新 ...
前言: 从事python学习,有爬虫.web后台.深度学习相关经验, 坐标北京欢迎骚扰. 本答案力求简洁和直击重点,代码部分使用Python3,更详细的解释请Google,回答有误请务必提醒答主,我将 ...
- 2020最新软件测试(Python自动化测试)面试宝典大全(一)挑战高薪必备!!!赶紧收藏!!!!
1.什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台.软件平台上是否可以正常的运行,即是通常说的软件的可移植性. 兼容的类型,如果细分的话,有平台的兼容, ...
- 2023备战金三银四,Python自动化软件测试面试宝典合集(三)
马上就又到了程序员们躁动不安,蠢蠢欲动的季节~这不,金三银四已然到了家门口,元宵节一过后台就有不少人问我: 现在外边大厂面试都问啥 想去大厂又怕面试挂 面试应该怎么准备 测试开发前景如何 面试,一个程 ...
- 绿盟python测试实习面试
1.简历问题 低级错误:时间写错 最近好像越来越马大哈了,总是犯低级错误. 上次的开题报告首页,这次的时间,每次都有小问题,确是大毛病 到底哪里出错了 2 RHCE证书好像没有用 面试官根本就不懂这个 ...
- 好程序员Python培训分享Python程序员面试技巧
好程序员Python培训分享Python程序员面试技巧,往年的这个时候,"金三银四"的招聘热潮已经扑面而至.今年,因为疫情的影响,各大公司的社招可能跟"2002的第一场雪 ...
最新文章
- 由炮灰模型到“微软钻石题”
- Java Integer类详解
- JavaScript 内存机制(前端同学进阶必备)
- php ci base url,CodeIgniter中base_url问题
- Microsoft.System.Center.Operations.Manager.2007 中文版完整光盘下载地址
- python ip,Python IP处理模块IPy(转载)
- 性能测试-了解硬件之CPU(一)
- linux零拷贝 nio,荐 面试题:NIO/Netty 中的零拷贝体现在哪里?
- 【BUAA_CO_LAB】p5p6碎碎念
- 链家全国房价数据分析 : 数据分析及可视化
- 浪曦大型企业门户综合项目的设计、实施与管理实地培训班隆重开班招生中……
- m3u8加密文件原理及下载脚本
- Spark学习(6)-Spark SQL
- python从键盘输入一个字符串、将小写字母全部_从键盘输入一个字符串_将其中的小写字母全部转换成大写字母...
- IDEA 读取maven本地仓库jar包,而不是读取module项目代码的解决方案
- windows update 80092004错误
- 以太坊源码分析(9)CMD实际操作分析
- Windows无法访问指定设备、路径或文件怎么办?
- 中国科学与技术大学计算机考研,中国科学技术大学计算机技术怎么样
- python语言是不是非开源语言_python是开元语言吗?