Python 面试题以及在Java的对应

你如何理解 Python 中的装饰器?

装饰器是Python中一个强大的功能,它允许用户在不修改原有函数代码的情况下,增加函数的额外功能。装饰器通过在函数定义之前使用@符号应用,实际上是一个接受函数作为参数并返回新函数的高阶函数。装饰器可以用于日志记录、性能测试、事务处理、缓存、权限校验等场景。

python 复制代码
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

输出:

python 复制代码
Something is happening before the function is called.
Hello!
Something is happening after the function is called.

在这个例子中,my_decorator 是一个装饰器,它包装了 say_hello 函数,并在调用 say_hello 之前和之后添加了一些额外的逻辑。

Spring Boot 中的类似概念

在 Spring Boot 中,装饰器的概念可以通过**AOP(面向切面编程)**来实现。AOP 允许你在不修改原有代码的情况下,在方法执行的前后插入额外的逻辑。

Python 中的 GIL 是什么?

GIL 是全局解释器锁,GIL 是一个互斥锁(mutex),它确保在任何时刻只有一个线程在执行 Python 字节码。这意味着即使在多核 CPU 上,Python 的多线程程序也无法充分利用多个 CPU 核心,因为 GIL 限制了并发执行的线程数量。

GIL 的主要特点:
  1. 单线程执行:在任何时刻,只有一个线程可以执行 Python 字节码。

  2. 线程切换:GIL 会定期释放,允许其他线程执行,但这并不意味着线程可以并行执行。

  3. 影响性能:对于 CPU 密集型任务,GIL 可能会成为性能瓶颈,因为它限制了多核 CPU 的利用率。

  4. I/O 密集型任务:对于 I/O 密集型任务(如网络请求、文件读写等),GIL 的影响较小,因为线程在等待 I/O 操作时会释放 GIL。

Spring Boot 中的相似概念

像JUC包中的线程锁概念

Flask 和 Django 的主要区别。

Flask和Django都是流行的Python Web框架,但它们在设计哲学和使用场景上有所不同。Flask是一个轻量级的微框架,它提供了Web应用开发的基础,但对项目的结构和依赖库选择有很大的灵活性,适用于小到中型项目,以及对框架扩展性有较高要求的场景。Django则是一个全栈式框架,内置了ORM、表单处理、用户认证等组件,适合快速开发大型项目,但相对来说,对项目结构和开发方式有更多约束

Spring Boot 中的相似概念

springboot和springCloud全家桶区别

Django 中,如何实现数据迁移和表结构对模型层修改

Django 数据库配置以及字段设置详解_django数据库字段-CSDN博客

WSGI是什么

WSGI 是 Python Web 开发中的一个重要标准,它定义了 Web 服务器与 Python Web 应用程序之间的接口。虽然 WSGI 本身是一个底层接口,但在实际业务开发中,开发者通常不会直接使用 WSGI,而是使用更高层次的 Web 框架(如 Flask、Django 等),这些框架内部已经封装了 WSGI。它解决了 Web 服务器(如 Nginx、Apache)与 Python Web 应用框架(如 Flask、Django)之间的兼容问题。

示例

以下是一个简单的 WSGI 应用程序示例:

python 复制代码
# wsgi_app.py

def application(environ, start_response):
    # 处理请求
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    
    # 返回响应内容
    return [b'Hello, WSGI!']

WSGI 应用程序 :通常是一个可以接收 environ(包含请求数据的字典)和 start_response 函数,并返回响应内容的可调用对象(比如一个函数)。

运行 WSGI 应用程序

要运行这个 WSGI 应用程序,可以使用一个支持 WSGI 的 Web 服务器,例如 wsgiref(Python 标准库中的一个简单 WSGI 服务器):

python 复制代码
# run_wsgi_app.py

from wsgiref.simple_server import make_server
from wsgi_app import application

# 创建一个 WSGI 服务器,监听端口 8000
httpd = make_server('', 8000, application)
print("Serving on port 8000...")

# 开始监听 HTTP 请求
httpd.serve_forever()

运行 run_wsgi_app.py 后,打开浏览器访问 http://localhost:8000/,你会看到页面显示 "Hello, WSGI!"。

Spring Boot 中的相似概念

WSGI其实感觉就是tomcat ServletApi接口

  • Spring Boot 基于 Java 的 Servlet API,Servlet API 是 Java 中用于 Web 应用程序与 Web 服务器之间通信的标准接口。Servlet API 类似于 WSGI,它定义了 Web 服务器如何与 Java 应用程序进行交互,以及如何处理请求和响应。

  • 原理 :在 Servlet 中,HttpServlet 类提供了 service() 方法,用于处理 HTTP 请求,并可以访问请求和响应对象(HttpServletRequestHttpServletResponse)。

  • Spring Boot 是基于 Servlet 规范的。Spring Boot 内置了如 Tomcat、Jetty、Undertow 之类的 Web 服务器,这些服务器就是 Servlet 容器。

|-----------|-----------------|-----------------|
| 协议/规范 | Web 服务器和应用的接口标准 | Web 服务器和应用的接口标准 |

|--------|----------------|----------------|
| 角色 | 使 Web 服务器和应用通信 | 使 Web 服务器和应用通信 |

|----------|---------------------|------------------------|
| 常用框架 | Django, Flask, etc. | Spring Boot, JSP, etc. |

|----------------|-----------------------|---------------------|
| 常用 Web 服务器 | Gunicorn, uWSGI, etc. | Tomcat, Jetty, etc. |

RESTful API 的基本原则。

RESTful API是一种基于HTTP协议,遵循REST架构风格的Web API设计方法。它的基本原则包括:

  • 使用HTTP方法明确表示操作,如GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。
  • 资源的标识,每个资源都有唯一的URI。
  • 无状态,每个请求包含所有必要的信息,独立处理。
  • 可缓存,提高API的性能和效率。
  • 统一接口,简化和解耦系统架构。

如何进行 Python 代码的性能优化?

  • Python代码的性能优化可以从多个方面入手,包括:
  • 代码剖析(Profiling)来找出瓶颈。
  • 使用更高效的数据结构,例如使用集合代替列表进行成员资格测试。
  • 利用算法优化来减少时间复杂度。
  • 使用内置函数和库,它们通常用C语言编写,执行速度更快。
  • 并行和异步编程,利用多核处理器或非阻塞IO提高效率。
  • 减少不必要的计算和数据库查询优化。
相关推荐
小爬虫程序猿22 分钟前
Python爬虫:深度解析商品详情的自动化之旅
爬虫·python·自动化
小柯J桑_24 分钟前
C++:探索AVL树旋转的奥秘
开发语言·c++·avl树
数学人学c语言25 分钟前
从熟练Python到入门学习C++(record 6)
c++·python·学习
skaiuijing2 小时前
Sparrow系列拓展篇:消息队列和互斥锁等IPC机制的设计
c语言·开发语言·算法·操作系统·arm
雯0609~3 小时前
c#:winform调用bartender实现打印(学习整理笔记)
开发语言·c#
胜天半子_王二_王半仙5 小时前
c++源码阅读__smart_ptr__正文阅读
开发语言·c++·开源
沐泽Mu5 小时前
嵌入式学习-C嘎嘎-Day08
开发语言·c++·算法
Non importa5 小时前
汉诺塔(hanio)--C语言函数递归
c语言·开发语言·算法·学习方法
LinuxST5 小时前
27、基于Firefly-rk3399中断休眠唤醒实验(按键中断)
linux·开发语言·stm32·嵌入式硬件
Tony_long74835 小时前
Python学习——猜拳小游戏
开发语言·python·学习