自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 Python线程条件对象(Condition)

在Python线程中,`threading`模块提供了条件变量`condition`来支持线程之间的复杂同步。条件变量运行一个或多个线程等待,直到另一个线程发出特定的通知信号。条件变量通常与锁(`Lock`或`RLock`)一起使用。`threading.Condition()`的锁对象可以通过传入的方式获得,或者在缺省的情况下自动创建(此时自动创建的锁对象为递归锁对象`RLock`)。当多个条件变量需要共享同一个锁时,传入一个锁很有用。锁是条件对象的一部分,你不必单独跟踪它。

2024-05-21 10:12:55 659

原创 Python线程中start,run,join方法及守护线程模式的作用

单个进程中的执⾏单元。⼀个进程启动后,只使⽤⼀个线程,即主线程。通过调⽤操作系统 API ,进程可以创建更多线程,执⾏并发操作。⼀个进程内的线程共享相同的内存空间(存储活动的 Python 对象)。因此,线程之间可以轻松地共享数据,但是如果多个线程同时更新同⼀个对象,则可能导致数据损坏。与进程⼀样,线程在操作系统调度程序的监督下也可以实现抢占式多任务处理。对于同⼀份作业,线程消耗的资源⽐进程少。

2024-05-16 14:36:10 643

原创 Python上下文管理器with块及@contextmanager的用法

上下文管理器对象存在的目的是为了管理with块,就像迭代器的存在是为了管理for循环一样with 语句存在的意义是对一些常用的 try/finally 结构予以简化。这种结构能够保障一段代码在运行完成后实施某项操作,就算该段代码因为 return 语句、异常或者 sys.exit() 调用而停止,也依旧执行指定的操作。finally 子句中的代码往往用于释放重要的资源,亦或是还原临时变动的状态。

2024-05-14 10:03:36 821 1

原创 yield from的具体用法

yield from 是 Python 3.3 引入的语法,用于在生成器中委托生成器。它允许一个生成器函数可以将执行委托给另一个生成器,从而简化了代码结构。在一个生成器函数内部,yield from 语句用于将控制权转移到另一个生成器,然后将其产生的值直接发送给生成器的调用者,而不是在当前生成器中进行处理。

2024-05-09 16:41:44 482

原创 Python标准库中的生成器函数大全(非常详细)

用于筛选的生成器函数:从输入的可迭代对象中产生项的子集,而且不修改项本身。多数可筛选生成器接收一个predicate参数。这个参数的值是个布尔函数,接收一个参数,应用到输入中的每一项上,用于判断项是否包含在输出中。

2024-05-08 20:18:10 1024

原创 Python中的生成器是什么

只要Python函数的主体中有yield关键字,该函数就是生成器函数。调用生成器函数,返回一个生成器对象。也就是说,生成器函数是生成器工厂。

2024-05-07 17:24:15 1282

原创 Fastapi中怎么一次性运行多个Scrapy爬虫

运行Scrapy爬虫很简单,直接"Scrapy crawl 爬虫名称"即可。但是我们如果想在Fastapi中通过接口的方式一次性运行多个爬虫。那该怎么实现?

2024-05-06 16:17:55 616 2

原创 详细解析Python可迭代对象与迭代器

迭代是数据处理的基石:程序将计算应用于数据序列。如果数据太大,在内存中放不下,则需要采用“惰性”的方式获取数据,即只按需获取和处理数据项的一部分,而不是一次性加载整个数据集。这就是迭代器的作用。

2024-05-05 23:24:26 1137 3

原创 深入剖析序列的特殊方法

在面向对象编程中,协议是非正式的接口,只在文档中定义,不在代码中定义。例如:Python的序列协议只要实现__len__和__getitem__这两个特殊方法。任何类,只要使用标准的签名和语义实现了这两个方法,就能用在任何预期序列的地方。

2024-05-03 14:12:57 593 2

原创 Python中覆盖类属性最好的方法

有一种修改方法更为符合Python风格,而且效果持久,也更有针对性。类属性是公开的会被子类继承,于是我们经常会创建一个子类,只用于定制类的数据属性。Django基于类的视图就大量使用这种技术。

2024-05-02 18:39:48 410 2

原创 Python中备选构造函数,classmethod和staticmethod的用法

定义操作类而不是操作实例的方法。由于classmethod改变了调用方法的方式,因此接收的第一个参数是类本身(一般叫做cls),而不是实例。classmethod可以访问类的属性,并且可以通过cls参数来创建类的实例。classmethod最常见的用途是定义备选构造函数。

2024-05-02 10:33:53 570 3

原创 使用一等对象函数重构策略模式

策略模式是一种软件设计模式,它允许在运行时根据需要选择算法或策略。这种模式通过将每个算法封装到一个独立的类中,并使这些类可相互替换来实现这一点。策略模式使得算法可以独立于其使用者而变化,同时还可以简化使用者的代码。策略模式的核心思想是将算法的实现与其使用者解耦,使得算法可以独立于其使用者进行变化。这种灵活性使得策略模式在需要动态切换算法、避免代码膨胀以及实现复杂的条件逻辑时非常有用。

2024-04-30 14:56:42 1847

原创 标准库中让人印象深刻的装饰器:Cache和单分派

functools.cache装饰器实现了备忘。这是一项优化技术,能把耗时的函数得到的结果保存起来,避免传入相同参数时重复计算。@lru_cache的优势主要在于可以通过maxsize参数限制内存用量上限。maxsize参数的默认值相当保守,只有128,即缓存最多只有128条。

2024-04-28 22:08:31 612 1

原创 git如何将多个commit合并成一个?

我们使用git进行版本控制,在本地开发完某个功能时,需要提交commit,然后push至开发分支。简单的功能还好,几个commit可能就好了。但是如果功能比较复杂,commit多达十几甚至几十个时,commit管理就会很冗长。比如下面多达40多个的commit

2024-04-28 11:15:00 324

原创 装饰器与闭包不为人知的一面

装饰器是 Python 中一种强大的工具,它允许你在不修改原始函数代码的情况下,动态地修改或扩展函数的行为。装饰器通常用于修改函数的行为、添加额外的功能、验证输入、记录日志等。

2024-04-26 20:35:40 407 2

原创 函数是Python的一等对象?

在Python中,函数是一等对象。编程语言中的一等对象的定义:在运行时创建,能赋值给变量或数据结构中的元素,能作为参数传递给函数,能作为函数的返回结果。

2024-04-26 10:30:06 894 2

原创 搜索Mysql的JSON字段的值

我们在查询mysql数据时,查询某个字段的数剧是我们经常接触的,直接使用sql语句或者更方便的直接使用数据库的orm语句查询。但是如果需要查询某个json字段里面的某些数据,orm模型可能都无法达到效果,还不如直接使用sql语句进行查询来的直观。下面总结了一些sql语句查询json字段里面的值。

2024-04-25 14:15:45 985 1

原创 Python对象引用、可变性及垃圾回收

在Cpython中,垃圾回收使用的主要算法是引用计数。实际上,每个对象都会统计有多少引用指向自己。当引用计数归零时,对象立即销毁:Cpython对象上调用__del__方法,然后释放分配给对象的内存。Cpython2.0增加了分代垃圾回收算法,用于检测引用循环中涉及的对象组——如果一组对象之间全是相互引用,那么即使再出色的引用方式也会导致组中的对象不可达。分代垃圾回收算法能把引用循环中不可达的对象销毁。

2024-04-24 22:23:33 861 1

原创 Python数据类构建器(二)

collections.namedtuple是一个工厂函数,用于构建增强的tuple子类,具有字段名称,类名等属性。namedtuple构建的类可在任何需要元祖的地方使用。甚至以前Python标准库中发挥元祖的很多函数,现在都返回具名元祖,这对用户的代码没有任何影响,可读性也大大提高。

2024-04-24 19:02:45 660

原创 Python数据类构建器(一)

Python提供几种构建简单类的方式,这些类只是字段的容器,几乎没有额外的功能,这种模式被称为“数据类”(data class)。下面介绍3个可简化数据类构建过程的类构建器。collectons.namedtuple,最简单的构建方式,从Python2.6开始提供typing.NamedTuple,需要为字段添加类型提示,从Python3.5开始提供。class句法在3.6中添加@dataclasses.datacless,与前两种相比,可定制的内容更多,添加了大量选项,可实现更复杂的功能。

2024-04-23 19:36:45 1026

原创 非常详细的Python字典高级用法介绍(三)

Python 使用哈希表实现 dict,因此字典的效率非常高,不过这种设计对实践也有⼀些影响,不容忽视。键必须是可哈希对象,必须正确实现__hash__和__eq__方法通过键访问项速度非常快,对于一个包含数百万个键的dict对象,Python通过计算哈希码就可以直接定位键,然后找出索引在hash表中的偏移量,稍微尝试几次就可以找到匹配的条目,因此开销不大在CPython3.6中,dict的内存布局更为紧凑,顺带的一个副作用是键的顺序得以保留。Python3.7正式支持保留顺序

2024-04-22 21:16:52 327

原创 非常详细的Python字典高级用法介绍(二)

dict基类本身没有定义这个方法,但是如果dict子类定义了这个方法,那么dict.__getitem__找不到键时将会调用__missing__方法,不抛出KeyError。标准库中的 shelve 模块持久存储字符串键与(以 pickle ⼆进制格式序列化的)Python 对象之间的映射,这部分这里不作太多介绍,感兴趣可以去看Python文档。在字典高级用法(一)中介绍过自动处理缺失的键的第一种方法是使用defaultlist对象,现在我们接着介绍第二种方法,使用__missing__方法。

2024-04-21 21:10:11 475 1

原创 非常详细的Python字典高级用法介绍(一)

没有Python程序不使用字典,即使不直接出现在我们编写的代码中,我们也会间接的用到,因为字典dict是实现Python的基石,也可以说Python就是包裹在一堆语法糖中的字典。由于字典的关键作用,Python对字典做了高度优化,并且在持续改进,Python字典之所以高效,要归功于哈希表。除了字典以外,内置类型中的set和frozenset也是基于哈希表。这两种类型的API和运算符比其他流行语言的集合更加丰富。接下来就开始字典常见的高级用法介绍

2024-04-21 14:06:37 958 1

原创 当Python列表不适用时,该如何选择?

在编写Python代码时,我们有时过渡使用列表,因为列表实在是太方便了。list类型简单灵活,不过有时针对具体的需求,或许还有更好的选择。

2024-04-20 22:25:49 960

原创 Fastapi,tortoise-orm怎么实现数据库的迁移

在你添加完以后,需要把@app.on_event("startup")事件函数中await command.migrate()注释解开,重新启动服务即可,此时你会发现migrations/models文件夹下面新增了一个文件1_时间_update.py文件(注意生成新的迁移文件后,你需要再次把wait command.migrate()部分重新注释,避免误操作生成新的迁移文件),这时你会发现已经数据表结构已经更改成功了。1、在fastapi中配置tortoise-orm所需要注册的配置信息。

2024-04-19 17:04:42 435

原创 Python Match/Case高级用法之匹配序列

python标准库用c语言实现了丰富的序列,主要分成两列:容器序列:可存放不同类型的项,其中包括嵌套容器。⽰例:list、tuple和collections.deque。扁平序列:可存放⼀种简单类型的项。⽰例:str、bytes 和array.array。

2024-04-19 11:39:44 487

原创 元祖不仅仅作为不可变列表?

python解释器求解元祖字面量时,经过一次操作即可生成元祖常量的字节码,求解列表字面量时,⽣成的字节码将每个元素当作独⽴的常量推⼊数据栈,然后构建列表。元祖被称为不可变列表,但是这并没有完全概况元祖的特点,元祖除了可以用作不可变列表的使用,还可以用做没有字段名称的记录,但是这种用法往往被忽略。然而,元组的不可变性仅针对元组中的引⽤⽽⾔。只有值永远不可变的对象才是可哈希的,不可哈希的元祖不可作为字典的键,也不可作为集合的元素。⽤元组存放记录,元组中的⼀项对应⼀个字段的数据,项的位置决定数据的意义。

2024-04-18 17:10:45 204

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除