南风金融网 - 中原最权威行情财经门户

热门关键词:  缪学刚  www.ymwears.cn  xxx    
热门: Python数据分析,学习路径 产教融合 | 长江师范学院应 干货 | 18个 Python 高效编 干货分享--统计学知识大梳 小白必看:数据分析5个常见 攀登数据科学家和数据工程

常见Python面试题 — 手写代码系列

来源:南风金融网 作者:南风金融网 人气: 发布时间:2020-04-05 10:15:26

1.如何反向迭代一个序列

#如果是一个list,最快的方法使用reverse
tempList = [1,2,3,4]
tempList.reverse()
for x in tempList:
? ?print x


#如果不是list,需要手动重排
templist = (1,2,3,4)
for i in range(len(templist)-1,-1,-1):
? ?print templist[i]

2.如何查询和替换一个文本中的字符串

#最简单的方法使用replace()
tempstr = "hello you hello python are you ok"
print tempstr.replace("you","python")


#还可以使用正则,有个sub()
tempstr = "hello you hello python are you ok"
import re
rex = r'(hello|Use)'
print re.sub(rex,"Bye",tempstr)

3.使用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()

4.重新实现str.strip()

def rightStrip(tempStr,splitStr):
? ?endindex = tempStr.rfind(splitStr)
? ?while endindex != -1 and endindex == len(tempStr) - 1:
? ? ? ? tempStr = tempStr[:endindex]
? ? ? ? endindex = tempStr.rfind(splitStr)
? ?return tempStr

def leftStrip(tempStr,splitStr):
? ?startindex = tempStr.find(splitStr)
? ?while startindex == 0:
? ? ? ?tempStr = tempStr[startindex+1:]
? ? ? ?startindex = tempStr.find(splitStr)
? ?return tempStr

str = " ?H ?"
print str
print leftStrip(str,' ')
print rightStrip(str,' ')
#输出
?H ?
H ?
?H

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



6.闭包

常用的装饰器就是闭包的一种?

def make_adder(addend): 
? ?def adder(addend):
? ? ? ?return addend+addend
return adder

P1 = make_adder(5)
P2= make_adder(4)

print p1(10)
#输出15
print p2(10)
#输出14

闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外?


7.给列表中的字典排序

list 对象 alist [{“name”:”a”,”age”:20},{“name”:”b”,”age”:30},{“name”:”c”,”age”:25}]按照 age 从大到小排序

alist = [{"name":"a","age":20},{"name":"b","age":30},{"name":"c","age":25}]
alist.sort(key=lambda:x:-x.get("age"))
print alist

8.合并两个列表排除重复元素

用简洁的方法合并alist = [‘a’,’b’,’c’,’d’,’e’,’f’]?
blist = [‘x’,’y’,’z’,’e’,’f’]并且元素不能重复

alist = ['a','b','c','d','e','f']
blist = ['x','y','z','e','f']
def merge_list(*args):
? ?s = set()
? ?for i in args:
? ? ? ?s = s.union(i)
? ?print(s)
? ?return s

merge_list(alist,blist)

9.打乱一个排好序的列表

from random import shuffle
alist = range(10)
print(alist)
shuffle(alist)
print(alist)

10.简单的实现一个栈结构 stack

class Stack(object):
? ?def __init__(self):
? ? ? ?self.value = []

? ?def push(self,x):
? ? ? ?self.value.append(x)

? ?def pop(self):
? ? ? ?self.value.pop()

stack = Stack()

stack.push(1)
stack.push(2)
stack.push(3)
print(stack.value)
stack.pop()
print(stack.value)

11.输入一个日期,返回时一年中的哪一天

from datetime import datetime
def which_day(year,month,day):
? ?return (datetime(year,month,day)-datetime(year,1,1)).days+1

print(which_day(2017,1,15))

12.把字符串”k1:1|k2:2|k3:3”处理成 python 字典的形式:{k1:1,k2:2,k3:3}

def string_to_dict(string):
? ?d = {}
? ?for kv in string.split("|"):
? ? ? ?k,v = kv.split(":")
? ? ? ?if v.isdigit():
? ? ? ? ? ?v=int(v)
? ? ? ?d[k]=v
? ?return d

print(string_to_dict("k1:1|k2:2|k3:3"))

13.判断输入的值是否在矩阵之中(杨氏矩阵)

在一个二维数组之中,每一行都按照从走到右递增的顺序排序,每一列到按照从上到下的顺序排序.请完成一个函数,输入这样的一个二维手术和一个整数,判断数组中是否含有该整数

#处理数组矩阵
arr = [[1,4,7,10,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]]
def get_num(num,data=None):
? ?while data:
? ? ? ?if num > data[0][-1]:
? ? ? ? ? ?del data[0]
? ? ? ?elif num<data[0][-1]:
? ? ? ? ? ?data = list(zip(*data))
? ? ? ? ? ?del data[-1]
? ? ? ? ? ?data = list(zip(*data))
? ? ? ?else:
? ? ? ? ? ?return True
? ? ? ? ? ?data.clear()
? ?return False
print (get_num(18,arr))

不处理数组矩阵?
使用 step-wise 线性搜索

def getvalue(data,value):
? ?m = len(data)-1
? ?n = len(data[0])-1
? ?r = 0
? ?c = n
? ?while c>=0 and r<=m:
? ? ? ?if value == data[r][c]:
? ? ? ? ? ?return True
? ? ? ?elif value>data[r][c]:
? ? ? ? ? ?r = r+1
? ? ? ?else:
? ? ? ? ? ?c = c-1
? ?return False

14.获取最大公约数(欧几里得算法)

a= 25
b=15

def max_common(a,b):
? ?while b:
? ? ? ?a,b=b,a%b
? ?return a


15.求两个数的最小公倍数(公式法)

两个数的乘积等于这两个数的 最大公约数与最小公倍数的积

a=25
b=15
def min_common(a,b):
? ?c= a*b
? ?while b:
? ? ? ?a,b=b,a%b
? ?return c//a


16.获取中位数

如果总数个数是奇数,按从小到大的顺序,取中间的那个数;如果总数个数是偶数个的话,按从小到大的顺序,取中间那两个数的平均数。

#计算中位数
def mediannum(num):
? ?listnum = [num[i] for i in range(len(num))]
? ?listnum.sort()
? ?lnum = len(num)
? ?if lnum % 2 == 1:
? ? ? ?i = int((lnum + 1) / 2)-1
? ? ? ?return listnum[i]
? ?else:
? ? ? ?i = int(lnum / 2)-1
? ? ? ?return (listnum[i] + listnum[i + 1]) / 2

def median(data):
? ?data.sort()
? ?half = len(data)//2
? ?return (data[half]+data[~half])/2
l = [1,3,4,53,2,46,8,42,82]
print (median(l))
责任编辑:南风金融网

上一篇:n种方式教你用python读写excel等数据文件

下一篇:没有了

最火资讯

首页 | 财经资讯 | 金融理财 | 价格行情

Copyright © 2012-2015 南风金融网门户站 版权所有 Power by DedeCms 豫ICP备12016580号  技术支持:南风金融网

电脑版 | 移动版