当前位置: 首页 > news >正文

5个面向Python高级开发者的技巧

使用这些用于自定义类行为、编写并发代码、管理资源、存储和操作数据以及优化代码性能的高级技术来探索 Python 的深度。

本文探讨了 Python 中的五个高级主题,它们可以为解决问题和提高代码的可靠性和性能提供有价值的见解和技术。从允许您在定义类时自定义类行为的元类编程,到支持并发代码执行的异步编程,再到上下文管理器、集合类和类型提示,这些主题提供了一系列工具和方法来处理这些问题Python 中的复杂挑战。无论您是初学者还是经验丰富的程序员,这些高级主题都可以帮助您编写更强大、更有效的代码。

元类编程:

元类是在 Python 中自定义类行为的强大工具。它们允许您定义类的创建方式,并可用于实现单例或工厂模式等设计模式。

要创建元类,您需要定义一个继承自“type”内置的类。例如:

class MyMeta(type):          def __new__(cls, name, bases, namespace):          # Customize the class creation process here          return super().__new__(cls, name, bases, namespace)

元类的方法__new__在定义新类时调用,并允许您通过修改其名称、基类或命名空间来自定义类。

下面是一个如何使用元类来实现单例模式的示例:

class SingletonMeta(type):          _instances = {}          def __call__(cls, *args, **kwargs):          if cls not in cls._instances:          cls._instances[cls] = super().__call__(*args, **kwargs)          return cls._instances[cls]          class MySingleton(metaclass=SingletonMeta):          pass          s1 = MySingleton()          
s2 = MySingleton()          
assert s1 is s2

在此示例中,SingletonMeta元类重写__call__方法以在每次调用时返回类的相同实例。MySingleton这确保在任何给定时间只有一个类实例。

元类编程是在 Python 中实现高级面向对象模式的有用技术。但是,它可能难以理解和调试,应谨慎使用。

异步编程:

异步编程是一种使用异步/等待语法编写并发代码的方法。它允许您编写可以同时执行 I/O 绑定或高级 CPU 绑定操作的代码,而无需多线程。

在 Python 中编写异步代码,需要使用async关键字定义异步函数,使用await关键字调用异步函数并等待其结果。例如:

import asyncio          async def fetch_url(url):          # Perform an HTTP request to the given URL          response = await asyncio.sleep(1)          return response          async def main():          # Run the tasks concurrently          task1 = asyncio.create_task(fetch_url('http://example.com/1'))          task2 = asyncio.create_task(fetch_url('http://example.com/2'))          await asyncio.gather(task1, task2)          asyncio.run(main())

在此示例中,该fetch_url函数对给定 URL 执行 HTTP 请求,并且该main函数创建两个使用该函数并发运行的任务asyncio.gather。

异步编程对于提高执行 I/O 绑定操作(例如网络通信或从数据库读取)的程序的性能很有用。它对于以并发方式实现高级 CPU 绑定操作(例如数据处理或机器学习)也很有用。

以下是如何使用异步编程并发执行 HTTP 请求的示例:

import aiohttp          
import asyncio          async def fetch_url(session, url):          async with session.get(url) as response:          return await response.text()          async def main():          async with aiohttp.ClientSession() as session:          # Run the tasks concurrently          task1 = asyncio.create_task(fetch_url(session, 'http://example.com/1'))          task2 = asyncio.create_task(fetch_url(session, 'http://example.com/2'))          responses = await asyncio.gather(task1, task2)          print(responses)          asyncio.run(main())

在此示例中,该fetch_url函数使用该aiohttp库对给定 URL 执行 HTTP GET 请求,并且该main函数创建两个使用该asyncio.gather函数并发运行的任务。

异步编程可以成为提高 Python 程序性能和可扩展性的强大工具。但是,它可能难以理解和调试,特别是对于刚接触并发编程的程序员而言。

上下文管理器:

上下文管理器是一种使用“with”语句管理文件句柄或锁等资源的方法。它们有助于确保资源在不再需要时得到适当清理。

要创建上下文管理器,您需要定义一个带有__enter__方法和__exit__方法的对象。例如:

class MyContext:          
    def __init__(self, value):          
        self.value = value          
    def __enter__(self):          
        print(f'Entering context with value {self.value}')          
        return self          
    def __exit__(self, exc_type, exc_value, traceback):          
        print('Exiting context')          
         
with MyContext(42) as context:          
    print(f'Value inside context: {context.value}')

在此示例中,该类MyContext定义了一个__enter__在输入“with”语句时调用的方法,以及一个__exit__在退出“with”语句时调用的方法。

以下是如何使用上下文管理器管理文件句柄的示例:

with open('myfile.txt', 'w') as f:          
    f.write('Hello, world!')

在此示例中,内置open函数返回管理文件句柄的上下文管理器。当退出“with”语句时,文件自动关闭。

上下文管理器是一种方便可靠的 Python 资源管理方式。它们确保资源得到适当清理,并有助于防止资源泄漏和其他问题。

集合类:

Python 有许多内置的集合类,例如 deque、Counter 和 OrderedDict,它们提供了用于存储和操作数据的专门功能。在某些情况下,这些类比传统的列表和字典更有效、更易于使用。

以下是如何使用该类deque实现简单队列的示例:

from collections import deque          
         
q = deque()          
q.append('a')          
q.append('b')          
q.append('c')          
print(q.popleft())  # Output: 'a'          
print(q.popleft())  # Output: 'b'          
print(q.popleft())  # Output: 'c'

在此示例中,该类deque实现了一个双端队列,允许您从任一端添加和删除元素。它比使用列表作为队列更有效,因为它支持两种操作的 O(1) 时间复杂度。

下面是一个示例,说明如何使用该类Counter来计算序列中元素的出现次数:

from collections import Counter          
         
c = Counter([1, 2, 2, 3, 3, 3])          
print(c)  # Output: Counter({3: 3, 2: 2, 1: 1})          
print(c[1])  # Output: 1          
print(c[4])  # Output: 0

在此示例中,该类Counter计算输入序列中每个元素的出现次数,并将它们存储在类似字典的对象中。它提供了一种对数据执行基本统计操作的便捷方式。

下面是一个示例,说明如何使用该类OrderedDict来保留字典中元素的插入顺序:

from collections import OrderedDict          
         
d = OrderedDict()          
d['a'] = 1          
d['b'] = 2          
d['c'] = 3          
for k, v in d.items():          
    print(k, v)  # Output: a 1, b 2, c 3

在此示例中,该类OrderedDict保留了字典中元素的插入顺序。如果您需要保持元素的原始顺序,或者如果您想要以可预测的顺序迭代元素,这将很有用。

集合类可以成为在 Python 中存储和操作数据的有用工具。它们提供了专门的功能,在某些情况下比传统数据结构更有效、更易于使用。

类型提示:

类型提示是 Python 3 的一项功能,它允许您使用预期的类型来注释变量和函数。这可用于静态类型检查、文档和优化。

要使用类型提示,您需要使用typing模块来定义预期的变量和函数类型。例如:

from typing import List, Dict          
         
def greet(name: str) -> str:          
    return f'Hello, {name}!'          
         
def count_words(s: str) -> Dict[str, int]:          
    words = s.split()          
    return {word: words.count(word) for word in set(words)}          
         
def add_numbers(numbers: List[int]) -> int:          
    return sum(numbers)

在此示例中,greet函数使用其参数的预期类型(字符串)及其返回值(也是字符串)进行注释。该count_words函数使用其参数的预期类型(字符串)及其返回值(将字符串映射到整数的字典)进行注释。该add_numbers函数使用其参数的预期类型(整数列表)及其返回值(整数)进行注释。

类型提示可用于使用诸如mypy. 它还可以用于文档目的,向您的代码用户提供有关变量和函数的预期类型的信息。最后,它可以通过优化编译器来生成更快的代码。

类型提示是提高 Python 程序的可靠性和性能的有用工具。它可以帮助及早发现错误并优化代码以提高性能。但是,它不能替代测试,应与其他工具和实践结合使用。

总之,本文概述了 Python 中的五个高级主题:元类编程、异步编程、上下文管理器、集合类和类型提示。这些主题中的每一个都可以为解决 Python 中的问题提供有价值的见解和技术,并可用于提高代码的可靠性和性能。

元类编程允许您在定义类时自定义类的行为,并且可用于实现高级的面向对象模式,例如单例模式或工厂模式。异步编程允许您使用 async/await 语法编写并发代码,并且对于提高执行 I/O 绑定或高级 CPU 绑定操作的程序的性能很有用。上下文管理器允许您使用“with”语句管理文件句柄或锁等资源,并确保在不再需要时正确清理资源。deque、Counter 和 OrderedDict 等集合类提供了用于存储和操作数据的专门功能,并且在某些情况下比传统数据结构更高效、更易于使用。

总体而言,这些高级主题可以为解决 Python 问题提供有价值的工具和技术,并可以帮助您编写更可靠、更高效的代码。

 

相关文章:

5个面向Python高级开发者的技巧

使用这些用于自定义类行为、编写并发代码、管理资源、存储和操作数据以及优化代码性能的高级技术来探索 Python 的深度。 本文探讨了 Python 中的五个高级主题,它们可以为解决问题和提高代码的可靠性和性能提供有价值的见解和技术。从允许您在定义类时自定义类行为的…...

Nginx简介

Nginx是什么?可以做什么事情? Nginx是高性能的HTTP和反向代理的web服务器,处理高并发的能力十分强大,能经受高负载的考研,有报告表明能能支持高达50000个并发连接数。 特点 占有内存少:一万个长连接&…...

十五分钟带你学会 Electron

文章目录 什么是 Electron为什么要选择 Electron安装 Electron桌面CSDN实战Electron 基础配置Electron 进程主进程渲染进程主进程与渲染进程的区别主进程与渲染进程的通信 Electron 跨平台问题Electron 部署打包应用程序发布应用程序 Electron 跨端原理总结 什么是 Electron E…...

设计模式-结构型模式之桥接模式

2. 桥接模式 2.1. 模式动机 设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案: 第一种设计方案是为每一种形状…...

软件测试工程师为什么要写测试用例?

软件测试工程师为什么要写测试用例?相信从事软件测试行业的从业者来讲,测试用例并不陌生。因为测试用例不仅仅是一组简单的文档,它包含前提条件、输入、执行条件和预期结果等等重要内容,并且能够完成一定的测试目的和需求。下面本…...

【DAY40】VUE练习

DOS命令: DOS(Disk Operating System)是一种操作系统,它使用命令行界面(Command Prompt)进行交互。在 DOS 中,有一些常用的命令,可以用来定位目录、创建、删除、拷贝文件和目录&…...

实模式的寄存器

实模式的寄存器有8个通用寄存器,分别为AX、BX、CX、DX、SI、DI、BP和SP。通用的意思就是它们之中的大部分可以根据需要用于多种目的。 AX: accumulator,累加寄存器 BX: base,基址寄存器 CX: count,计数寄存器 SI: Source Index&am…...

【UE 控件蓝图】通过键盘选中要点击的按钮 通过Enter键点击

上一篇【UE 控件蓝图】菜单及功能实现博客已经完成了菜单的制作,但是我们只能通过鼠标来点击菜单选项,本篇博客实现的是能够通过键盘的上下键来选中按钮,然后按下“Enter”键来实现点击按钮的效果。 效果 可以看到并没有移动鼠标也可以通过…...

SSR在天猫优品大促会场的探索实践

BBC 发现其网站加载时间每增加一秒,用户便会流失 10%。为提高页面的秒开率,我们不断探索着优化策略,仅仅在浏览器领域下的优化已经满足不了我们的极致要求,开始往服务端方向不断探索。本文将讨论业务接入SSR的几个问题&#xff1a…...

WPF教程(一)---创建一个WPF程序基础知识

1.前言: 这篇主要讲WPF的开发基础,介绍了如何使用Visual Studio 2019创建一个WPF应用程序。 首先说一下学习WPF的基础知识: 1) 要会一门.NET所支持的编程语言--例如C#。 2) 会一点“标准通用标记语言”:WPF窗体程序使用的XAML语…...

【C++ 四】函数、指针

函数、指针 文章目录 函数、指针前言1 函数1.1 概述1.2 函数定义1.3 函数调用1.4 值传递1.5 函数常见样式1.6 函数声明1.7 函数分文件编写1.8 函数默认参数1.9 函数占位参数1.9 函数重载1.9.1 函数重载概述1.9.2 函数重载注意事项 2 指针2.1 指针基本概念2.2 指针变量定义和使用…...

虚拟人与娱乐传媒融合,推动综艺新模式

经过多年的更新迭代和市场的推动,虚拟人技术正在逐渐迈向成熟:3D虚拟形象的制作变得越来越精致且真实,并且出现了越来越多功能丰富使用便捷的动捕设备。因此,包括综艺影视在内的诸多领域,开始尝试将虚拟人技术融入行业…...

Linux_红帽8学习笔记分享_5

Linux_红帽8学习笔记分享_5 文章目录 Linux_红帽8学习笔记分享_51. UMASK反掩码1.1如何查看反掩码umask1.2 UMASK反掩码的作用1.2.1对于目录来说1.2.2对于文件来说 1.3如何修改UMASK反掩码1.4普通用户反掩码的测试 2.whereis的使用3. SUID权限弥补(主要针对文件,所有者执行位变…...

网络编程及项目思路

计算机和计算机之间通过网络进行数据传输 常见的软件架构: C/S:客户端/服务器 画面可以做的非常精美,用户体验好需要开发客户端,也需要开发服务端用户需要下载和更新的时候太麻烦 B/S:浏览器/服务器 不需要开发客户端,只需要…...

GD(兆易创新)系列FLASH进行FPGA和ZYNQ配置固化相操作

写在前面 本文主要针对使用GD(兆易创新)系列的FLASH做启动配置片时,遇到的相关问题进行简单整理复盘,避免后人踩坑。 本人操作固化芯片型号为:ZYNQ7045、690T(复旦微替代型号V7 690T)。 7系列…...

通过一个小例子来看一下C语言指针 p、*p、p、*p、*p分别代表什么

前言 在C语言中,指针是非常重要的概念。指针是一个变量,其值为另一个变量的地址。使用指针可以直接访问内存中的数据,这使得C语言非常灵活和强大。在学习C语言时相比大家都已经知道了&和*的区别了,但是你知道*&p和&*…...

【内摹访谈】谈谈AI爆发前夜的B端设计

本文来自摹客产品设计团队(MPD)的设计专栏“内摹访谈”。专栏介绍:专栏名称来源于西方美学理论「内摹仿说」,意指审美活动与摹仿活动紧密相连,审美不只针对表象动作,其核心在于由物及我,从表观带…...

Redis—AOF持久化

一、AOF定义 保存写操作命令到日志的持久化方式,就是 Redis 里的 AOF(Append Only File) 持久化功能 定义:以日志的形式记录每个操作,记录写指令不记录读指令,只许追加⽂件不允许修改,AOF保存的是appendonly.aof⽂件…...

OpenCV实例(五)指纹识别

OpenCV实例(五)指纹识别 1.指纹识别概述1.1概述1.2原理 2.指纹识别算法2.1特征提取2.2MCC匹配方法2.3尺度不变特征变换(SIFT) 3.显示指纹的关键点4.基于SIFT的指纹识别 作者:Xiou 1.指纹识别概述 1.1概述 指纹识别&…...

第二章 法的内容与形式

目录 第一节 法的内容与形式的概念 一、法的内容与形式的含义 二、法的内容和形式的关系 第二节 法律权利与法律义务 一、权利和义务的概念 二、权利和义务的分类 三、权利与义务的联系 第三节 法的成文形式与不成文形式 一、历史上各种法的表现形式 二、成文法与不成文…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

WebRTC调研

WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...

【2D与3D SLAM中的扫描匹配算法全面解析】

引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...