python basic

python basic 数据类型 list array, 列表, 数组 list/dict str to list/dict >>> import ast >>> x = '[ "A","B","C" , " D"]' >>> x = ast.literal_eval(x) >>> x ['A', 'B', 'C', ' D'] >>> x = [n.strip() for n in x] >>> x ['A', 'B', 'C', 'D'] colon syntax # check if two list equal sorted(a) == sorted(b) : is the delimiter of the slice syntax to 'slice out' sub-parts in sequences , [start:end] [1:5] is equivalent to "from 1 to 5" (5 not included) [1:] is equivalent to "1 to end" [:20] from start to 20 # Python 合并两个列表 # 法一: # Python合并两个列表, 相加是拼接 list1=[1,2,3] list2=[4,5,6,7] list3=list1+list2 print('list3',list3)#输出[1,2,3,4,5,6,7] # 注意:Python合并两个NumPy数组,相加时候是对应相加 import numpy as np arr1=np.array([1,2,3]) arr2=np.array([4,5,6]) arr3=arr1+arr2 print(arr3)#输出[5 7 9] #那么NumPy数组怎么拼接呢,使用concatenate arr4=np.concatenate((arr1,arr2),axis=0) print('arr4',arr4) # 法二: l3=[] l1=[1,2,3] l2=[4,5,6] l3.append(l1) l3.append(l2) print('l3',l3)#输出[[1, 2, 3], [4, 5, 6]],注意这里是二维列表,不是我们想要的结果 # 如何才能达到我们要的结果,使用 extend l1.extend(l2) print('l1',l1)#[1, 2, 3, 4, 5, 6] # 总结: # Python合并两个列表,可用两个列表相加存入新列表,或者使用extend在原列表修改 ———————————————— ...

2026-01-29 · 38 min · 8022 words · -

Python 3.12 新特性探索

Python 3.12 新特性概览 Python 3.12 于 2023 年 10 月发布,带来了多项重要改进和新特性。 主要新特性 1. 更灵活的 f-string 解析器 Python 3.12 重写了 f-string 的解析器(PEP 701),解决了之前版本的引号限制问题。 Python 3.11 及之前的限制: f-string 内部不能使用与外部相同的引号类型 如果外部用双引号 f"...",内部只能用单引号 '...' 不支持反斜杠转义 不支持多行表达式 Python 3.12 的改进: # 支持嵌套引号 songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism'] # Python 3.11 及之前版本:语法错误! # print(f"This is the playlist: {", ".join(songs)}") # ❌ 引号冲突 # 必须这样写: # print(f"This is the playlist: {', '.join(songs)}") # ✅ 内部用单引号 # Python 3.12:可以自由嵌套 print(f"This is the playlist: {", ".join(songs)}") # ✅ 支持! # 支持多行表达式和注释 value = f"{ # 计算总和 sum([1, 2, 3]) }" # 支持反斜杠转义 print(f"换行符: {'\n'}") 2. 改进的错误消息 Python 3.12 提供了更详细、更有帮助的错误消息: ...

2026-01-16 · 5 min · 978 words · -

Python 3.14 新特性探索

Python 3.14 概述 Python 3.14 于 2025 年 10 月 7 日正式发布(当前最新版本:3.14.2,2025年12月5日),带来多项重大改进和新特性。这是 Python 发展历程中的重要里程碑,包括注解系统的重大变革、模板字符串、多解释器支持等令人期待的功能。 核心新特性 PEP 649 & PEP 749: 延迟注解求值 Python 3.14 最重大的变化! 注解不再立即求值,而是存储在特殊的注解函数中,仅在需要时才求值。 关键改进: 大幅提升运行时性能(注解定义成本最小化) 不再需要使用字符串包裹前向引用 新增 annotationlib 模块用于处理注解 三种注解格式: from annotationlib import get_annotations, Format def func(arg: Undefined): pass # VALUE 格式:求值为运行时值 try: get_annotations(func, format=Format.VALUE) except NameError: print("会抛出 NameError") # FORWARDREF 格式:未定义的名称替换为特殊标记 print(get_annotations(func, format=Format.FORWARDREF)) # {'arg': ForwardRef('Undefined', owner=<function func>)} # STRING 格式:以字符串形式返回 print(get_annotations(func, format=Format.STRING)) # {'arg': 'Undefined'} PEP 734: 标准库中的多解释器支持 突破性功能! 在同一进程中运行多个独立 Python 解释器的能力现已暴露给 Python 层。 ...

2025-12-24 · 3 min · 631 words · -

devpi

什么是 devpi? devpi 是一个强大的 Python 包服务器,提供以下核心功能: PyPI 镜像缓存 - 缓存从 PyPI 下载的包,加速后续安装 私有包仓库 - 托管私有仓库的包 多源聚合 - 统一访问多个上游源(官方 PyPI、私有仓库) 离线使用 - 缓存后即使网络断开也能安装包 Web 管理界面 - 提供友好的 Web 界面,方便浏览包列表、查看索引配置、管理用户等操作 devpi 默认运行在 http://localhost:3141,可以通过浏览器访问 Web 界面进行可视化管理。 快速开始 如果你只想快速体验 devpi 的缓存功能,执行以下最简步骤: # 1. 启动 devpi 容器 sudo nerdctl run -d --name devpi --restart unless-stopped \ --network host docker.io/devpi/devpi-server:latest # 2. 配置 pip 使用 devpi(使用默认索引) pip config set global.index-url http://localhost:3141/root/pypi/+simple/ pip config set global.trusted-host localhost # 3. 测试安装包(第一次会从 PyPI 下载并缓存) pip install requests # 4. 再次安装体验缓存加速 pip uninstall -y requests && pip install requests 说明:这个配置使用 devpi 默认的 root/pypi 索引,自动缓存官方 PyPI 的包。数据存储在容器内部,适合快速测试。生产环境建议使用下文的完整配置。 ...

2025-12-02 · 9 min · 1766 words · -

python set

python set 线上的某一个业务模块常规的执行时间大概是这样的 📊 总体统计: 完成的 xxx 总数: 379 最短耗时: 0.190 秒 最长耗时: 2815.415 秒 平均耗时: 67.626 秒 中位数耗时: 9.585 秒 标准差: 258.304 秒 ⏱️ 耗时分布: < 1秒: 33 次 ( 8.7%) 1-5秒: 101 次 ( 26.6%) 5-10秒: 64 次 ( 16.9%) 10-30秒: 99 次 ( 26.1%) 30-60秒: 9 次 ( 2.4%) 1-5分钟: 62 次 ( 16.4%) 5-10分钟: 2 次 ( 0.5%) 10-30分钟: 6 次 ( 1.6%) > 30分钟: 3 次 ( 0.8%) ...

2025-07-31 · 2 min · 287 words · -

python signal pause

python signal.pause() vs time.sleep() signal.pause() 系统调用实现, 直接向内核发起系统调用, 让当前线程进入休眠状态, 直到接收到信号为止. 内核将进程状态从 RUNNING → INTERRUPTIBLE_SLEEP 进程从CPU运行队列(CPU Run Queue)中移除 time.sleep() 是一个非阻塞函数, 它会在指定的时间内暂停当前线程的执行. 用户空间循环实现, 用户空间循环:完全在用户模式下运行 进程状态:持续保持 RUNNING 状态 CPU调度:获得常规CPU时间片 系统调用:重复调用 nanosleep() 或 select() CPU运行队列 (Run Queue) CPU运行队列是一个数据结构(通常是链表或红黑树),包含所有准备执行但正在等待CPU时间的进程/线程。 CPU运行队列是包含所有准备执行的进程/线程的数据结构,这些进程已经准备好使用CPU,只是在等待CPU时间片。 状态:进程处于 READY 状态 CPU占用:这些进程会消耗CPU时间 调度:调度器从这里选择下一个执行的进程 负载计算:运行队列长度影响系统负载平均值 等待队列 (Wait Queue) 等待队列包含不能立即执行的进程,它们在等待某些事件发生(如I/O完成、信号到达、锁释放等)。 状态:进程处于 WAITING/BLOCKED 状态 CPU占用:不消耗CPU时间, 0%(进程不被调度) 上下文切换:最少(仅当信号到达时) 事件驱动:等待特定事件唤醒 负载计算:不计入系统负载 INTERRUPTIBLE_SLEEP INTERRUPTIBLE_SLEEP 是一种进程状态。在 Linux 操作系统中,进程会经历多种状态,而可中断睡眠(Interruptible Sleep,通常用 ‘S’ 表示)就是其中之一。 进程不会占用 CPU 资源,而是自愿放弃 CPU,以便系统可以更有效地管理资源。 与 INTERRUPTIBLE_SLEEP 相对的是不可中断睡眠(Uninterruptible Sleep,通常用 ‘D’ 表示),处于此状态的进程通常正在执行关键的 I/O 操作,并且不能被信号中断,直到操作完成。 ...

2025-07-30 · 1 min · 82 words · -

django

django python manage.py startapp hello pytest-django runserver python manage.py runserver 0.0.0.0:1234 这个命令会启动两个进程 user0 542872 542712 2 16:47 pts/0 00:00:00 python manage.py runserver 0.0.0.0:1234 user0 543984 542872 8 16:47 pts/0 00:00:01 /path/to/venv-36/bin/python manage.py runserver 0.0.0.0:8888 本地修改代码之后第一个进程不变, 第二个进程会重启并应用新的代码

2020-03-11 · 1 min · 36 words · -

flask

flask pip install Flask flask run flask run --host=0.0.0.0 pip install flask-restful https://dormousehole.readthedocs.io/en/latest/ https://flask.palletsprojects.com/en/2.3.x/ https://flask-restful.readthedocs.io/en/latest/quickstart.html

2017-08-14 · 1 min · 15 words · -

python property

python @property 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑。为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: class Student(object): def get_score(self): return self._score def set_score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value 现在,对任意的Student实例进行操作,就不能随心所欲地设置score了: s = Student() s.set_score(60) # ok! s.get_score() 60 s.set_score(9999) Traceback (most recent call last): … ValueError: score must between 0 ~ 100! 但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。 ...

2016-01-06 · 1 min · 206 words · -

flake8

flake8 pip install flake8 flake8 --max-line-length=120 project_0 # 忽略掉 E501,E302,E122,E225,E303,W291,E221,E231 flake8 --max-line-length=120 --ignore=E501,E302,E122,E225,E303,W291,E221,E231 project_0 # 只检查 F821 undefined name flake8 --select=F821 /path/to/project_0

2015-04-12 · 1 min · 22 words · -

python mixin

python mixin 什么是Mixin设计模式 mixin设计模式可以看做是多继承的一种。那么首先,咱们谈谈为什么会出现多继承这种语法。 汽车和飞机他们都同属于交通工具,但飞机可以飞行,汽车无法做到,所以,飞行这个行为不能写到交通工具这个类中,如果每一个交通工具各自实现自己的行驶方法,就违背了代码尽可能重用的原则(如果交通工具种类越来越多,就会造成大量代码冗余)。 所以,我们要表示飞行这个行为,就需要进行多继承。但这样,我们就违背了继承关系必须是is-a原则。 在java中,虽然没有多继承,但我们可以通过interface来实现多继承。 在python中,没有interface这一语法,但它本身是支持多继承的。 在使用多继承的时候,很容易就会设计不当,导致继承链混乱,影响mro查找,所以,在编程的时候我们的原则就是,能使用其他方法代替多继承就尽量不适用多继承。 这个时候Mixin设计模式就应运而生,Mixin直译理解就是混入、补充的意思,它是多继承的一种。在多继承中,查找顺序是按mro继承链中的顺序进行的。 这样一来,我们不需要复杂而庞大的继承链,只要选择组合不同的类的功能,就可以快速构造出所需的子类。 2.Mixin设计模式实例 class Vehicle: pass class PlaneMixin: def fly(self): print(“Flying”) class Airplane(Vehicle, PlaneMixin): pass 可以看到,上述代码中,Airplane类实现了多继承,在继承链上,它继承了Vehicle类和PlaneMixin类,这里我们遵循Mixin设计模式的要求,在后面添加上后缀Mixin增强代码的可读性。 上述代码可以这么理解,Airplane只是一个Vehicle类,而不是Plane类,而Mixin后缀,它告诉其他读者,这个类是作为功能添加到子类中的,并不是作为父类,它的作用等同于Java中的interface。 使用Mixin设计模式的原则 在使用Mixin设计模式实现多重继承的时候要特别注意下列几点原则: 首先,Mixin类必须表示某一种功能,而不是某一个物体,这点跟java中的Runnable和Callable是一样的。 其次,它表示的责任必须单一,如果有多个功能,我们应该去实现多个Mixin类。 接下来,Mixin类不依赖于子类的实现,且属于抽象类,本身不能实例化,也不能继承Mixin以外的类。 最后,子类即使没有继承Mixin类,也必须照常工作,只是部分功能缺少无法使用。 Java的接口,只提供了“规格”的多重继承。Mixin类则同时提供了“规格”和“实现”的多重继承,使用上相比接口会更加简单。 补充 在其他框架或者语言中,也有类似的Mixin功能,如Ruby,Django,Vue, React等等。 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/u011544909/article/details/106890774

2012-04-25 · 1 min · 43 words · -

python timed task, 定时任务

python timed task, 定时任务 while True sleep Timeloop threading.Timer sched schedule APScheduler Celery Apache Airflow while True: + sleep() 主要缺点: 只能设定间隔,不能指定具体的时间,比如每天早上8:00 sleep 是一个阻塞函数,也就是说 sleep 这一段时间,程序什么也不能操作。 Timeloop库 Timeloop是一个库,可用于运行多周期任务。这是一个简单的库,它使用decorator模式在线程中运行标记函数。 threading.Timer threading 模块中的 Timer 是一个非阻塞函数,比 sleep 稍好一点,timer最基本理解就是定时器,我们可以启动多个定时任务,这些定时器任务是异步执行,所以不存在等待顺序执行问题。 内置模块sched sched模块实现了一个通用事件调度器,在调度器类使用一个延迟函数等待特定的时间,执行任务。同时支持多线程应用程序,在每个任务执行后会立刻调用延时函数,以确保其他线程也能执行。 比threading.Timer更好,不需要循环调用。 调度模块schedule schedule是一个第三方轻量级的任务调度模块,可以按照秒,分,小时,日期或者自定义事件执行时间。schedule允许用户使用简单、人性化的语法以预定的时间间隔定期运行Python函数(或其它可调用函数)。 任务框架 APScheduler APScheduler(advanceded python scheduler)基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务。基于这些功能,我们可以很方便的实现一个Python定时任务系统。 它有以下三个特点: 类似于 Liunx Cron 的调度程序(可选的开始/结束时间) 基于时间间隔的执行调度(周期性调度,可选的开始/结束时间) 一次性执行任务(在设定的日期/时间运行一次任务) APScheduler有四种组成部分: 触发器(trigger) 包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行。除了他们自己初始配置意外,触发器完全是无状态的。 作业存储(job store) 存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中。一个作业的数据讲在保存在持久化作业存储时被序列化,并在加载时被反序列化。调度器不能分享同一个作业存储。 执行器(executor) 处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。 调度器(scheduler) 是其他的组成部分。你通常在应用只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。通过配置executor、jobstore、trigger,使用线程池(ThreadPoolExecutor默认值20)或进程池(ProcessPoolExecutor 默认值5)并且默认最多3个(max_instances)任务实例同时运行,实现对job的增删改查等调度控制 分布式消息系统Celery Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具, 也可用于任务调度。Celery 的配置比较麻烦,如果你只是需要一个轻量级的调度工具,Celery 不会是一个好选择。 数据流工具 Apache Airflow Apache Airflow 是Airbnb开源的一款数据流程工具,目前是Apache孵化项目。以非常灵活的方式来支持数据的ETL过程,同时还支持非常多的插件来完成诸如HDFS监控、邮件通知等功能。Airflow支持单机和分布式两种模式,支持Master-Slave模式,支持Mesos等资源调度,有非常好的扩展性。被大量公司采用。 ...

2011-10-23 · 1 min · 78 words · -