python面试题之手写代码(1)

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)

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

非常棒的讲解:http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html

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)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外 
http://www.cnblogs.com/ma6174/archive/2013/04/15/3022548.html

https://foofish.net/python-closure.html

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 True
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

详解:https://blog.youkuaiyun.com/franktan2010/article/details/38229641

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

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

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

详情:https://zhidao.baidu.com/question/90232880

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

详情:https://blog.youkuaiyun.com/qq_33363973/article/details/78773144

def medin(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))
<think>嗯,用户问的是2025年的Python面试题,我需要先理解用户的需求。可能用户正在准备面试,想提前了解未来可能会出现的题目。不过实际上,2025年的具体面试题现在还不存在,毕竟技术发展很快,每年的趋势都会变化。但作为回答,我可以根据当前的技术趋势和Python的发展方向,预测可能会被问到的题目类型,同时结合一些经典问题,帮助用户做好准备。 首先,用户可能希望了解哪些方面的内容?Python基础、算法与数据结构、Web开发、数据分析、机器学习、异步编程、设计模式、新特性等等。这些都是常见的面试题范围。另外,考虑到Python的版本更新,比如Python 3.10以后的新特性,比如模式匹配(match case)、类型提示的增强等,可能会成为考点。 接下来,我需要考虑用户可能的背景。如果是初级开发者,基础题和算法可能更重要;如果是中级或高级,可能会涉及更深入的问题,比如并发、性能优化、框架原理等。但用户没有明确说明,所以需要覆盖多个层次,同时给出一些趋势性的预测。 然后,我需要整理常见的Python面试题,并加入未来可能流行的元素。例如,随着AI和机器学习的发展,相关库如PyTorch、TensorFlow的问题可能会增多。另外,异步编程在Python中的应用越来越广泛,async/await的相关问题也可能被问到。 还要注意,系统指令中提到要使用中文回答,使用正确的LaTeX格式,结构清晰。因此,回答需要分点列出,每个部分明确,使用标题和子标题,用列表或代码块展示示例。 最后,要提醒用户,虽然预测了2025年的趋势,但扎实的基础和解决问题的能力才是关键,建议结合最新动态和公司需求进行准备。可能还需要包括一些学习资源或建议,帮助用户进一步学习。</think>以下是根据当前技术趋势和Python发展预测的**2025年Python面试题方向及典型问题示例**,分为核心知识点和新兴领域两类: --- ### 一、Python核心基础 1. **内存管理与垃圾回收** - 解释引用计数与分代回收机制 - `__slots__`的作用与使用场景 - 深浅拷贝的区别(示例:`a = [[1,2], 3]; b = copy.deepcopy(a)`) 2. **异步编程** - `async/await`与`yield`的区别 - 如何用`asyncio`实现协程并发? - 代码分析: ```python async def task(): print("Start") await asyncio.sleep(1) print("End") async def main(): await asyncio.gather(task(), task(), task()) asyncio.run(main()) ``` 3. **元编程与装饰器** - 手写一个记录函数执行时间的装饰器 - `__getattr__`与`__getattribute__`的区别 - 用元类实现单例模式 --- ### 二、算法与数据结构 1. **高频算法题** - 二叉树层序遍历(需输出每层节点值) - 实现LRU缓存(时间复杂度$O(1)$) - 动态规划问题(如零钱兑换、最长递增子序列) 2. **优化技巧** - 分析代码时间复杂度:`for i in range(n): for j in range(i): ...` - 用生成器优化内存占用的场景 --- ### 三、领域专项 #### A. Web开发(Django/Flask/FastAPI) 1. **FastAPI特性** - 如何用Pydantic做请求体验证? - 实现JWT认证的中间件 2. **数据库优化** - Django中`select_related`与`prefetch_related`的区别 - 如何避免N+1查询问题? #### B. 数据分析/机器学习 1. **Pandas高级操作** - 用`groupby`实现分层聚合(如同时计算均值与标准差) - 处理时间序列数据的`resample`方法 2. **PyTorch原理** - 自动微分(autograd)实现机制 - 解释`DataLoader`的`num_workers`参数作用 --- ### 四、新兴趋势预测 1. **Python新特性** - 模式匹配(Pattern Matching)的应用场景 ```python match response.status: case 200 if response.data: print("Success") case 404 | 500: print("Error") ``` - 类型提示的强化(如`TypeAlias`、`ParamSpec`) 2. **AI工程化** - 模型部署工具链(ONNX、TorchServe) - 解释大模型训练中的梯度累积策略 --- ### 五、系统设计 1. **高并发场景** - 用Celery实现分布式任务队列 - 如何设计API限流系统? 2. **性能调优** - 用`cProfile`分析代码瓶颈 - Cython加速Python代码的实践步骤 --- ### 学习建议 1. 持续关注Python PEP提案(如2023年发布的[PEP 703](https://peps.python.org/pep-0703/)) 2. 实战项目推荐: - 用FastAPI构建RESTful API + 异步数据库访问 - 实现简易版PyTorch自动微分系统 3. 刷题平台:LeetCode(标签:Python、算法)、HackerRank *注:实际面试题会根据公司技术栈调整,建议结合目标企业产品特点准备。*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值