1 sort和sorted的区别
`sort` 和 `sorted ` 是 Python 中用于对可迭代对象进行排序的两个方法,主要的区别在于它们的使用方式和影响:
1. ** `sort` 方法:** - `sort` 是列表对象的方法,作用在原列表上进行排序,不会返回一个新的列表。- 语法:`list . sort( key= None , reverse= False ) `- `key` 是一个可选参数,用于指定一个函数,该函数将应用于列表的每个元素,以进行比较。- `reverse` 是一个可选参数,如果设置为 `True `,则按降序排序;默认为 `False `,表示升序排序。my_list = [ 3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 , 5 , 3 , 5 ] my_list. sort( ) print ( my_list) 2. ** `sorted ` 函数:** - `sorted ` 是一个内置函数,接受一个可迭代对象作为参数,返回一个新的已排序的列表。- 语法:`sorted ( iterable, key= None , reverse= False ) `- 同样,`key` 和 `reverse` 参数的作用与 `sort` 方法相同。my_list = [ 3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 , 5 , 3 , 5 ] new_list = sorted ( my_list) print ( new_list) 总结:
- 如果你想就地修改原始列表并进行排序,使用 `sort` 方法。
- 如果你想创建一个新的已排序列表而不修改原始列表,使用 `sorted ` 函数。需要注意的是,`sorted ` 返回一个新的列表,而 `sort` 在原地进行排序。在某些情况下,你可能更喜欢使用一个而不是另一个,具体取决于你的需求。
2 numpy和pandas
`NumPy`(Numerical Python)和 `pandas` 是 Python 中用于数据处理和分析的两个重要库。
1. ** 数组操作:** NumPy 提供了强大的多维数组对象 `numpy. ndarray`,用于进行快速的数组操作和数学运算。
2. ** 数学函数:** 它包含了大量的内置数学函数,允许在整个数组上执行操作。
3. ** 广播功能:** NumPy 支持广播,允许对不同形状的数组执行算术运算,使代码更简洁、可读。
4. ** 线性代数:** 提供了线性代数运算的支持,如矩阵乘法、求逆等。
5. ** 随机数生成:** 包含了各种分布的随机数生成器。
1. ** 数据结构:** pandas 提供两个主要的数据结构 `Series` 和 `DataFrame`。`Series` 是一维标记数组,而 `DataFrame` 是一个二维的表格数据结构。
2. ** 数据处理:** 提供了丰富的数据操作和处理工具,包括合并、分组、透视表、时间序列功能等。
3. ** 缺失数据处理:** pandas 提供了处理缺失数据的方法,使数据清洗更加方便。
4. ** 数据导入/ 导出:** 支持从多种文件格式(如 CSV、Excel、SQL 数据库等)中导入数据,并能够将数据导出到不同的格式。
5. ** 数据分析:** 提供了各种统计和分析工具,使得数据分析更加便捷。** 关键区别:**
- ** 数据结构:** NumPy 更专注于提供多维数组,而 pandas 更专注于表格型数据结构。
- ** 用途:** NumPy 适用于数学运算和数组操作,而 pandas 更适用于数据清洗、处理和分析。
- ** 功能:** NumPy 提供的是底层的数组操作,而 pandas 在此基础上提供了更高级的数据操作和分析功能。通常,它们在数据科学和机器学习领域中一起使用,NumPy 用于数学运算,而 pandas 用于数据处理和分析。
numpy和pandas的使用
当使用 NumPy 和 pandas 进行数据处理时,通常会涉及到创建、操作和分析数据。以下是一个简单的例子,演示了如何使用这两个库:
import numpy as np
import pandas as pd
numpy_array = np. array( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] )
data = { 'Name' : [ 'Alice' , 'Bob' , 'Charlie' ] , 'Age' : [ 25 , 30 , 35 ] , 'City' : [ 'New York' , 'San Francisco' , 'Los Angeles' ] }
df = pd. DataFrame( data)
print ( "NumPy Array:" )
print ( numpy_array)
print ( "\nDataFrame:" )
print ( df)
print ( "\nAccessing NumPy Array Element:" , numpy_array[ 0 , 1 ] )
print ( "\nAccessing DataFrame Column:" )
print ( df[ 'Name' ] )
df[ 'Gender' ] = [ 'Female' , 'Male' , 'Male' ]
result = np. sum ( numpy_array)
print ( "\nSum of NumPy Array Elements:" , result)
average_age = df[ 'Age' ] . mean( )
print ( "\nAverage Age in DataFrame:" , average_age) 这个例子创建了一个 NumPy 数组和一个 pandas DataFrame,并展示了如何访问元素、添加列以及进行数学运算和数据分析。
3 进程、线程、协程
进程、线程和协程是计算机领域中常用的并发编程模型,它们用于实现程序的多任务执行。以下是对它们的简要解释:
1. ** 进程(Process)** :- 进程是程序在计算机中的一次执行活动,是系统进行资源分配和调度的一个独立单位。- 每个进程都有独立的内存空间,互不影响。- 进程间通信需要通过特定的机制,如管道、消息队列等。- 进程的切换开销较大,因为需要保存和恢复整个进程的状态。2. ** 线程(Thread)** :- 线程是进程的一部分,是一个基本的执行单元。一个进程可以包含多个线程。- 线程共享进程的内存空间,可以更方便地进行数据共享。- 线程间通信相对简单,因为它们共享相同的地址空间。- 由于线程共享进程的资源,需要注意线程之间的同步问题,以避免竞态条件等并发问题。3. ** 协程(Coroutine)** :- 协程是一种用户态的轻量级线程,也称为微线程。- 协程在执行过程中可以被挂起和恢复,可以主动让出执行权给其他协程。- 协程之间的切换开销较小,适用于高并发的 I/ O 密集型任务。- Python 3.5 引入了 `asyncio` 模块,支持异步协程编程。这三者的选择取决于具体的应用场景:
- ** 使用进程** :适用于多核 CPU,可以充分发挥多核的优势。各进程独立运行,一个进程崩溃不影响其他进程。- ** 使用线程** :适用于 I/ O 密集型任务,能够有效避免线程切换的开销。- ** 使用协程** :适用于高并发的 I/ O 密集型任务,通过异步编程模型实现。总体而言,进程、线程、协程各有优缺点,选择合适的并发模型需要考虑任务的特性、系统的性能、编程的复杂度等因素。
4 fastapi的原理
FastAPI 是一个现代的、快速(基于 Starlette 和 Pydantic)的 Web 框架,它的原理和设计思想包括以下几个关键点:
1. ** 基于标准的 Python 类型提示:** FastAPI 利用 Python 3.7 + 中引入的类型提示特性。通过类型提示,FastAPI 可以推导出请求和响应的模型,从而自动生成文档,进行验证等。这也意味着在使用 FastAPI 时,你会受益于类型检查器(如 Pyright、Mypy 等)的支持,这有助于代码的可维护性和可读性。2. ** 依赖注入系统:** FastAPI 内置了一个强大的依赖注入系统,允许你声明和注入各种依赖,如路径参数、请求体、Cookie、数据库连接等。这使得编写可测试、可扩展的代码变得更加容易。3. ** 异步支持:** FastAPI 支持异步请求处理,可以处理异步请求和使用异步模型(如 asyncio)。这对于高并发和 I/ O 密集型应用程序非常有用。4. ** Starlette 和 Pydantic:** FastAPI 构建在 Starlette(一个异步 Web 框架)和 Pydantic(一个数据验证库)之上。这两个库提供了 FastAPI 所需的核心功能,如请求处理、路由、验证和序列化等。5. ** 自动文档生成:** 借助 Pydantic 中的类型提示和 FastAPI 的依赖注入系统,FastAPI 可以自动生成 OpenAPI 和Swagger 文档。这使得开发者在构建 API 时可以更容易地查看和理解 API 的定义和使用。6. ** 请求和响应模型:** FastAPI 鼓励使用 Pydantic 模型来定义请求和响应的数据。这种方法使得输入参数的验证和文档生成变得更加简单,同时还提供了直观的模型来表示 API 的输入和输出。7. ** 内置的 OAuth2 和 JWT 支持:** FastAPI 提供了内置的 OAuth2 和 JWT 支持,以实现用户认证和授权的功能。9. ** WebSocket 支持:** FastAPI 提供了 WebSocket 支持,使得构建实时应用程序变得更加容易。总的来说,FastAPI 设计的目标是提供一种快速、现代、易用的 Web 框架,同时利用 Python 类型提示的
优势,提供自动文档生成、请求验证等功能,以提高开发效率和代码的可维护性。
5 sso的单点登录
单点登录(Single Sign- On,SSO)是一种身份验证和访问控制的机制,用户只需一次登录,就可以在多个应用中访问多个相关但独立的系统或服务。
SSO 有助于提高用户体验,简化管理,减少密码负担,并增强安全性。在实现 SSO 时,通常会有一个单独的认证中心(也称为身份提供者),用户只需在该中心进行一次登录,然后可以访问其他与该认证中心信任的应用程序而无需再次登录。在 Web 开发中,常见的 SSO 实现包括:
1. ** OAuth 和 OpenID Connect:** OAuth 2.0 和 OpenID Connect 是一种用于 Web 应用程序和移动应用程序的协议,允许用户使用现有的帐户登录到多个网站而无需在每个站点上创建新的凭证。2. ** SAML(Security Assertion Markup Language):** SAML 是一种用于通过 XML 在 Web 浏览器和身份提供者之间传递身份和认证信息的标准。3. ** JWT(JSON Web Tokens):** JWT 是一种轻量级的、自包含的令牌,用于通过网络传输信息。在身份验证场景中,JWT 通常包含用户的身份信息。5. ** CAS(Central Authentication Service):** CAS 是一种用于 Web 应用程序的开源单点登录协议。实现 SSO 通常需要对身份验证和令牌管理进行深入的了解,以确保安全性和用户体验。选择合适的 SSO 解决方案通常取决于您的应用程序、身份验证需求和安全性要求。
SSO单点登录的使用
单点登录(SSO)是一种身份验证和授权机制,允许用户使用一组凭据登录多个相关但独立的软件系统。
在实际应用中,SSO 通常基于一些标准协议,如OAuth和OpenID Connect。下面是一个简化的基于 Flask 和 OAuth 的单点登录(SSO)示例:
from flask import Flask, redirect, url_for, session
from authlib. integrations. flask_client import OAuthapp = Flask( __name__)
app. secret_key = 'your_secret_key' oauth = OAuth( app) oauth. register( name= 'example' , client_id= 'your_client_id' , client_secret= 'your_client_secret' , authorize_url= 'https://example.com/oauth/authorize' , authorize_params= None , access_token_url= 'https://example.com/oauth/token' , access_token_params= None , refresh_token_url= None , redirect_uri= 'https://your-app.com/auth/callback' , client_kwargs= { 'scope' : 'openid profile' } ,
) @app. route ( '/' )
def home ( ) : if 'user_info' in session: return f'Hello, { session[ "user_info" ] [ "name" ] } !' return 'Hello, anonymous!' @app. route ( '/login' )
def login ( ) : return oauth. example. authorize_redirect( url_for( 'auth' , _external= True ) ) @app. route ( '/auth' )
def auth ( ) : token = oauth. example. authorize_access_token( ) user_info = oauth. example. parse_id_token( token) session[ 'user_info' ] = user_inforeturn redirect( url_for( 'home' ) ) @app. route ( '/logout' )
def logout ( ) : session. pop( 'user_info' , None ) return redirect( url_for( 'home' ) ) if __name__ == '__main__' : app. run( debug= True ) 在这个例子中,我们使用 Flask 框架和 Authlib 库实现了一个基本的单点登录(SSO)系统。请注意,实际环境中需要替换 `'your_client_id' `、`'your_client_secret' ` 和其他相关参数为实际的值。此示例中,用户访问 `/ login` 路径会被重定向到 OAuth 提供商的登录页面,登录成功后将被重定向到 `/ auth` 路径,然后在该路径中获取用户信息并存储在 session 中。用户可以通过访问 `/ logout` 路径来注销。请注意,实际的 SSO 实现可能会更加复杂,涉及到用户身份的验证、安全性、多系统之间的同步等问题。
6 缓存雪崩、缓存击穿、缓存穿透
1. ** 缓存(Cache):** 一种将计算结果或数据存储在临时存储区域以供将来快速访问的技术。在计算机科学中,缓存通常用于存储频繁读取的数据,以减少对更慢的存储介质(如数据库)的访问次数。2. ** 缓存雪崩(Cache Avalanche):** 当缓存中的大量数据在同一时间失效或被清除时,新的请求无法从缓存中获得数据,导致请求直接落到底层存储(如数据库)。这会导致数据库负载激增,可能引起系统崩溃。为了避免缓存雪崩,可以采用不同的失效时间,或者使用一些高可用的缓存机制。3. ** 缓存击穿(Cache Breakdown):** 缓存中的一个或一组数据由于在缓存中过期或不存在,而导致对底层存储系统(如数据库)的直接请求。与缓存雪崩不同,缓存击穿通常是指对单个缓存键的请求。4. ** 缓存穿透(Cache Penetration):** 缓存穿透指的是对于缓存中不存在的数据的请求,由于某些原因(例如缓存键对应的数据确实不存在),这些请求直接落到底层存储系统。这可能是因为缓存层没有命中,而底层存储中也没有相应的数据。为了解决这个问题,可以使用布隆过滤器等手段,在缓存层进行简单的过滤。这些问题都涉及到在使用缓存时需要考虑的一些挑战,包括缓存的合理设置、失效策略、以及对于不存在的数据的处理。
缓存雪崩、击穿、穿透都是需要在设计和实现中考虑的问题,以保障系统的可用性和性能。
7 MySQL的binlog(归档日志)和事务日志 redo log(重做日志)和 undo log(回滚日志)
MySQL中的这些日志是数据库引擎在执行事务时记录的关键信息。以下是它们的主要作用:
1. ** Binlog(二进制日志):** - ** 作用:** 记录数据库的变更情况,包括插入、更新、删除等操作,以便用于主从复制、恢复、点播和数据同步等。- ** 实现:** 由 MySQL 的服务器层实现,而不是存储引擎。2. ** 事务日志(Transaction Log):** - ** 包含:** 事务日志主要包括 redo log(重做日志)和 undo log(回滚日志)。- ** Redo Log(重做日志):** - ** 作用:** 记录事务对数据库的物理更改,以便在系统崩溃时恢复数据。- ** 实现:** 存储引擎级别的日志,不同的存储引擎可能有不同的实现方式。- ** Undo Log(回滚日志):** - ** 作用:** 记录事务对数据库的逻辑更改,用于回滚和事务的一致性。- ** 实现:** 存储引擎级别的日志,不同的存储引擎可能有不同的实现方式。这些日志的协同工作确保了数据库的一致性和持久性。在数据库系统中,事务的执行可能会涉及到多个步骤,
而这些步骤可能在执行过程中发生错误或者系统崩溃,这时候这些日志就能够帮助数据库恢复到一个一致的状态。