Python面试题(二)列表去重,单例
来源:互联网 发布:淘宝cad画图接活群 编辑:程序博客网 时间:2024/05/16 13:46
1.Python里面如何实现tuple和list的转换python中,tuple和list均为内置类型,
以list作为参数将tuple类初始化,将返回tuple类型 tuple([1,2,3]) #list转换为tuple 以tuple作为参数将list类初始化,将返回list类型 list((1,2,3)) #tuple转换为list
1.函数tuple(seq)可以把所有可迭代的(iterable)序列转换成一个tuple, 元素不变,排序也不变。
例如,tuple([1,2,3])返回(1,2,3), tuple(‘abc’)返回(‘a’.'b’,'c’).
如果参数已经是一个tuple的话,函数不做任何拷贝而直接返回原来的对象,所以在不确定对象是不是tuple的时候来调用tuple()函数也不是很耗费的。
2.函数list(seq)可以把所有的序列和可迭代的对象转换成一个list,元素不变,排序也不变。
例如 list([1,2,3])返回(1,2,3), list(‘abc’)返回['a', 'b', 'c']。
如果参数是一个list, 她会像set[:]一样做一个拷贝
2.Python里面re模块match()和search()的区别?
# 一、解释: # match()函数只检测RE是不是在string的开始位置匹配 # search()会扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配 # 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none # 二、例子: # match(): # print(re.match(‘super’, ‘superstition’).span())会返回(0, 5) # print(re.match(‘super’, ‘insuperable’))则返回None search(): # print(re.search(‘super’, ‘superstition’).span())返回(0, 5) # print(re.search(‘super’, ‘insuperable’).span())返回(2, 7)
3.下面代码会输出什么:
def f(x,l=[]): for i in range(x): l.append(i*i) print(l)f(2)#[0,1]f(3,[3,2,1])#[3,2,1,0,1,4]f(3)#[0,1,0,1,4]
4.请用至少一种方法删除下面list里面的重复元素
li = [1, 1, 2, 3, 3, 4, 4, 5, 5, 6]a = []# 列表去重方法一:集合方法b = set(li)print(b)# 列表去重方法二:遍历统计次数,删除重复选项for i in li: while li.count(i) > 1: del li[li.index(i)]print(li)# 列表去重方法三:遍历列表,添加新列表对比a = []for i in li: if i in li: if i not in a: a.append(i)print(a)#列表去重方法四:先对元素进行排序,然后从列表的最后开始扫描list = [1, 1, 2, 3, 3, 4, 4, 5, 5, 6]if list: list.sort() last = list[-1] for i in range(len(list)-2,-1,-1): if last == list[i]: del list[i] else:last = list[i]print(list)#列表去重方法五:利用map的fromkeys来自动过滤重复值l1 = [1, 1, 2, 3, 3, 4, 4, 5, 5, 6]l2 = {}.fromkeys(l1).keys()print(l2)
5.请简述python中单例模式的特点,并手写一个单例模式?
# 所谓单例,是指一个类的实例从始至终只能被创建一次。# 方法1:# 如果想使得某个类从始至终最多只有一个实例,使用__new__方法会很简单。Python中类是通过__new__来创建实例的:class Singleton(object): _instance = None def __new__(cls, *args, **kw): if not cls._instance: cls._instance = super(Singleton, cls).__new__(cls, *args, **kw) return cls._instanceclass MyClass(Singleton): a = 1one=MyClass()two=MyClass()print(id(one),id(two))# 结果:id相同# 在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,# 如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance。# 方法2:# 有时候我们并不关心生成的实例是否具有同一id,而只关心其状态和行为方式。# 我们可以允许许多个实例被创建,但所有的实例都共享状态和行为方式:class Borg(object): _shared_state={} def __new__(cls,*args,**kwargs): obj=super(Borg,cls).__new__(cls,*args,**kwargs) obj.__dict__=cls._shared_state return obj # 将所有实例的__dict__指向同一个字典,这样实例就共享相同的方法和属性。# 对任何实例的名字属性的设置,无论是在__init__中修改还是直接修改,所有的实例都会受到影响。# 不过实例的id是不同的。要保证类实例能共享属性,但不和子类共享,注意使用cls._shared_state,# 而不是Borg._shared_state。# 因为实例是不同的id,所以每个实例都可以做字典的key:if __name__=='__main__': class Example(Borg): pass a=Example() b=Example() c=Example() adict={} j=0 for i in a,b,c: adict[i]=j j+=1 for i in a,b,c: print(adict[i] )# 结果:# 0# 1# 2# 如果这种行为不是你想要的,可以为Borg类添加__eq__和__hash__方法,# 使其更接近于单例模式的行为:class Borg(object): _shared_state={} def __new__(cls,*args,**kwargs): obj=super(Borg,cls).__new__(cls,*args,**kwargs) obj.__dict__=cls._shared_state return obj def __hash__(self): return 1 def __eq__(self,other): try: return self.__dict__ is other.__dict__ except: return Falseif __name__=='__main__': class Example(Borg): pass a=Example() b=Example() c=Example() adict={} j=0 for i in a,b,c: adict[i]=j j+=1 for i in a,b,c: print(adict[i])# 结果:# 2# 2# 2# 所有的实例都能当一个key使用了。# 方法3# 当你编写一个类的时候,某种机制会使用类名字,基类元组,类字典来创建一个类对象。新型类中这种机制默认为type,而且这种机制是可编程的,称为元类__metaclass__ 。class Singleton(type): def __init__(self,name,bases,class_dict): super(Singleton,self).__init__(name,bases,class_dict) self._instance=None def __call__(self,*args,**kwargs): if self._instance is None: self._instance=super(Singleton,self).__call__(*args,**kwargs) return self._instance if __name__=='__main__': class A(object): __metaclass__=Singleton a=A() b=A() print (id(a),id(b))# 结果:# 34248016 34248016# id是相同的。# 例子中我们构造了一个Singleton元类,并使用__call__方法使其能够模拟函数的行为。# 构造类A时,将其元类设为Singleton,那么创建类对象A时,行为发生如下:# A=Singleton(name,bases,class_dict),A其实为Singleton类的一个实例。# 创建A的实例时,A()=Singleton(name,bases,class_dict)()=Singleton(name,bases,class_dict).__call__(),这样就将A的所有实例都指向了A的属性_instance上,这种方法与方法1其实是相同的。 # 方法4# python中的模块module在程序中只被加载一次,本身就是单例的。可以直接写一个模块,将你需要的方法和属性,写在模块中当做函数和模块作用域的全局变量即可,根本不需要写类。# 而且还有一些综合模块和类的优点的方法:class _singleton(object): class ConstError(TypeError): pass def __setattr__(self,name,value): if name in self.__dict__: raise self.ConstError self.__dict__[name]=value def __delattr__(self,name): if name in self.__dict__: raise self.ConstError raise NameError import sys sys.modules[__name__]=_singleton() # python并不会对sys.modules进行检查以确保他们是模块对象,# 我们利用这一点将模块绑定向一个类对象,而且以后都会绑定向同一个对象了。# 将代码存放在single.py中: import single single.a=1 single.a=2 ConstError>>> del single.aConstError# 方法5:# 最简单的方法:class singleton(object): passsingleton=singleton() # 将名字singleton绑定到实例上,singleton就是它自己类的唯一对象了。
阅读全文
0 0
- Python面试题(二)列表去重,单例
- python面试总结(二)列表去重与单例
- 面试题(二) 单例模式
- python列表去重
- python列表去重
- Python列表去重
- python列表去重方法
- Python 列表list去重
- python列表元素去重
- Python面试题(二)
- html之js数组去重(面试题)
- 【面试题】连续重复字符串去重
- 通用面试题:海量数据去重
- 面试题:异或去重
- 【经典面试题】JavaScript数组去重
- 前端面试题之数组去重
- 使用python对列表(list)去重
- 学习总结-python列表去重
- 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap
- Word Amalgamation
- xml两种解析原理对比
- 感悟
- Uncaught Error: Bootstrap's JavaScript requires jQuery
- Python面试题(二)列表去重,单例
- Java static(一)
- C# 词频统计
- MAC中为Mysql设置初始密码
- 恶意代码--样本分析学习资料整理网络地址
- shell脚本
- CentOS安装killall
- Java数组及其内存分配
- C++11常用新特性使用经验总结