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

Python超能力:高级技巧让你的代码飞起来

文章一览

  • 前言
  • 一、with
    • 1.1 基本用法
    • 1.2 示例
    • 自定义上下文管理器
  • 二、条件表达式
  • 三、列表式推导式
      • 与 zip 结合
  • 四、map() 函数(内置函数)
    • map用于数据清洗
        • 1. 数据清洗:字母大小写规范
        • 2. filter() 函数
  • 五、匿名函数 lambda
    • 5.1 lambda的参数(argument_list)和表达式
    • 5.2 lambda 函数与其它函数搭配使用
    • 5.3 匿名函数的优势

前言

在当今这个技术日新月异的时代,Python已经成为全球开发者的首选语言之一,它以其简洁、高效和强大的功能闻名于世。然而,Python的真正魅力远不止于此——它隐藏着许多高级技巧,这些技巧能够极大地提升你的编程能力,让你的代码更加优雅、高效和强大。这些高级技巧是Python高手的秘密武器,它们能够解决复杂的问题,优化性能,甚至改变你对编程的看法。

现在,让我们一起揭开Python高级技巧的神秘面纱,探索那些让代码更智能、更灵活的高级特性。无论你是Python新手还是老手,这些高级技巧都将为你打开新世界的大门,让你的编程之路更加宽广。

准备好了吗?让我们一起踏上这段激动人心的Python高级技巧之旅,解锁编程的新高度,成为真正的Python大师!

一、with

在Python中,with语句是一种上下文管理协议,用于包装代码执行前后的初始化与清理工作。它使得代码更加简洁,易于阅读,并且能够自动管理资源,比如文件操作、线程锁的获取与释放等。with语句通过__enter__()__exit__()这两个方法来实现资源的封装管理。

1.1 基本用法

with expression as variable:# 在这个代码块中,可以使用variable# 执行一些操作# ...
# 当离开这个代码块时,会自动执行一些清理工作

这里的expression必须是一个上下文管理器(context manager)对象,它必须实现__enter__()__exit__()方法。__enter__()方法在进入代码块之前被调用,其返回值(如果有的话)会被赋值给as子句中的variable__exit__()方法在代码块执行完毕后被调用,无论是正常结束还是由于异常而结束。

1.2 示例

例1:文件操作

使用with语句进行文件操作是一个很好的例子,因为它可以自动管理文件的打开和关闭:

with open('example.txt', 'r') as file:content = file.read()print(content)
# 文件在这里自动关闭

在这个例子中,open()函数返回一个文件对象,这个对象是一个上下文管理器。当进入with语句的代码块时,__enter__()方法被调用,返回的文件对象被赋值给file变量。当离开代码块时,__exit__()方法被调用,文件被自动关闭。

自定义上下文管理器

也可以通过定义一个类,并实现__enter__()__exit__()方法来创建自己的上下文管理器:

class MyContextManager:def __enter__(self):print("Entering")return self  # 可以返回任何对象,或者Nonedef __exit__(self, exc_type, exc_val, exc_tb):print("Exiting")# 如果需要,可以在这里处理异常# 如果处理了异常,应该返回True# 否则,返回False(或者省略return,默认为False)return Falsewith MyContextManager() as cm:print("Inside the context manager")
# 输出:
# Entering
# Inside the context manager
# Exiting

​ 在这个例子中,MyContextManager类定义了一个简单的上下文管理器,它在进入和离开with语句的代码块时分别打印消息。注意,__exit__()方法接收三个参数,分别用于异常处理:exc_type是异常类型,exc_val是异常值,exc_tb是异常跟踪信息(traceback)。如果__exit__()方法返回True,则异常会被忽略(即被处理)。如果返回False(或没有返回值,默认为False),则异常会被正常抛出。

二、条件表达式

if x > 0:y = x*2
else:y = x# 使用条件表达式
y = x*2 if x > 0 else x

简单的条件表达式可以直接写到一行上,而且不用冒号了“:”

三、列表式推导式

列表推导式 是Python基础,也是最受欢迎的 Python 特性之一

>>> a = []
>>> for i in range(0,10):
>>>     a.append(i)
>>> print (a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 使用列表推导式
>>> a = [i for i in range(0,10)]
>>> print (a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

本质上可以把列表推导式理解成一种集合了 变换 和 筛选 功能的 函数,通过这个函数把一个列表转换成另一个列表

注意:是另一个新列表,原列表保持不变

形式1:[表达式 for 变量 in 列表(或range)]

形式2:[表达式 for 变量 in 列表 if 条件]

格式 1:[expression for item in iterable]

lis = []
for i in range(100):lis.append(i)
print (lis)
# 使用列表推导式
lis = [i for i in range(100)]
print (lis)

格式 2[expression for item in iterable if 条件]

lis = []
for i in range(100):if i % 2 == 0:lis.append(i)
print (lis)
# 使用列表推导式
lis = [i for i in range(100) if i % 2 == 0]
print (lis)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x ** 3 for x in a if x % 2 == 0]
print ('a :',a)
print ('b :',b)

从结果上可以看出:如果有筛选条件是先筛选再变换,即先筛掉不满足条件的元素,再进行变换运算。

也可以同时加多个筛选条件,如对大于 5 的且是偶数的元素进行立方运算

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> b = [x ** 3 for x in a if x % 2 == 0 and  x > 5]
>>> print (b)
[216, 512, 1000]

如对大于 5 的或者是偶数的元素进行立方运算

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> b = [x ** 3 for x in a if (x % 2 == 0 or x > 5)]
>>> print (b)
[8, 64, 216, 343, 512, 729, 1000]

与 zip 结合

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个列表组,然后返回由这些列表组组成的列表

a,b 两个列表中相对应的值组合起来,形成一个新列表。例如包含x 坐标的列表与 y 坐标的列表形成相对应的点坐标 [x, y] 列表

>>> a = [1, 2, 3, 4, 5]
>>> b = [6, 7, 8, 9, 10]
>>> c = [[x, y] for x, y in zip(a, b)]
>>> print(c)
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

四、map() 函数(内置函数)

map(function, iterable,…)

参数function传的是一个函数名,可以是python内置的,也可以是自定义的

参数iterable传的是一个可以迭代的对象,如 列表,元组,字符串

map() 接收一个函数 function 和一个 iterable ,并通过把函数 f 依次作用在 iterable 的每个元素上,得到一个新的 iterable 并返回

给定一列数据,使该列数据中每个元素乘 2

lis = [16,15,13,11,18,17,12,14]
print (lis)
i = 0
for j in lis:lis[i] = j*2i = i + 1
print (lis)

用 map() 函数如何做呢?

def f(x):return x*2
lis = [16,15,13,11,18,17,12,14]
lis1 = map(f, lis)
print (lis1)

注意:map 函数返回时返回的是一个地址

如果要输出值,必须在外层加上list()

def f(x):return x*2
lis = [16,15,13,11,18,17,12,14]
lis1 = map(f, lis)
print (list(lis1))

获取两个列表对应位置上的最小值

>>> l1 = [1,3,7,10]
>>> l2 = [2,4,6,9]
>>> mins = map (min,l1,l2)
>>> print(list(mins))
[1, 3, 6, 9]

获取多输入整数或浮点数

m,n = map(int,input().split(','))
lis = [*map(int, input().split(','))]
lis = [*map(float,input().split(','))]

map用于数据清洗

什么是数据清洗?

​ 一般拿到初始数据后是不能直接用到模型的。比如字符串有些是大写,有些是小写,有些是首字母大写,现在需要处理成统一的格式(首字母大写),这个过程就是数据清洗

1. 数据清洗:字母大小写规范
'adam', 'LISA', 'barT', 'PYTHON'
>>> def format_name(s):
>>>     s=s[0].upper()+s[1:].lower()
>>>     return s
>>> s = ['adam', 'LISA', 'barT', 'PYTHON']
>>> s = map(format_name, s)
>>> print (list(s))
['Adam', 'Lisa', 'Bart', 'Python']
2. filter() 函数

filter() 函数是 Python 中常用的内置函数,它主要用来根据特定条件过滤迭代器中不符合条件的元素,需要用list函数进行转换,才能得到符合的条件元素组成的新列表

filter(function, iterable,…)

lis = [4,9,3,14,7,10,6,1]
def odd(x):if x % 2 == 1:return x 
newlis = list(filter(odd,lis))
print(newlis)

五、匿名函数 lambda

lambda 函数,或称为匿名函数,是一个没有函数名的简单函数。语法如下:

lambda arguments: expression

lambda 关键字可以用来创建一个 lambda 函数,紧跟其后的是参数列表用冒号分割开的单个表达式

参数(arguments) 和 表达式(expression)由用户自定义

5.1 lambda的参数(argument_list)和表达式

lambda arguments: expression

匿名函数的 arguments 和普通函数参数一样,可以有非常多的形式

  • expression中出现的参数需要在 argument 中有定义,并且表达式只能是单行的

lambda 函数输入是传入到 argument的值,输出是根据 expression 计算得到的值

例如,lambda x: 2 * x 是将任何输入的数乘 2,而 lambda x, y: x+y 是计算两个数字的和。语法十分直截了当

y = lambda x: 2 * x
print(y(6))
def f(x,y):return x+y
f (10,20)# lambda 表达式
f = lambda x,y: x+y
print (f(10,20))

简单说,lambda 函数用于定义简单的、能够在一行内表示的函数。特别提醒

  • 只能写一个表达式,表达式的结果就是返回值
  • 不用 return 语句

与其他的使用常规 def 关键字创建的函数不同,lambda 函数没有名字

5.2 lambda 函数与其它函数搭配使用

lambda 函数经常和高阶函数一起使用,比如 map 或 filter

l1 = [1,3,5,7,9]
l2 = [2,4,6,8,10]
result = map (lambda x,y: x * 2 + y, l1,l2)
print (list (result))
>>> m = lambda *args : sum(args)
>>> print (m(3,4,5,6))
18
>>> lis = [-10, 28, 9, -5, 30, 5]
>>> new_lis = list(filter(lambda x:x>0, lis))
>>> print(new_lis)
[28, 9, 30, 5]

5.3 匿名函数的优势

为什么经常把 for 循环和序列(可迭代)类型数据联合使用?

​ 因为数据在容器里存放,要处理数据就需要对容器里的数据进行遍历

​ 用 for 循环遍历十次百次千次,如果遍历百万千万次呢?for 循环效率低!能不用 for 循环就不用 。可以用匿名函数 lambda,简单的函数操作,返回值是 func 类型,在数据分析和清洗中结合 map() 大量会用到匿名函数。

​ 另外,有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可!

相关文章:

Python超能力:高级技巧让你的代码飞起来

文章一览 前言一、with1.1 基本用法1.2 示例自定义上下文管理器 二、条件表达式三、列表式推导式与 zip 结合 四、map() 函数(内置函数)map用于数据清洗1. 数据清洗:字母大小写规范2. filter() 函数 五、匿名函数 lambda5.1 lambda的参数&…...

熊军出席ACDU·中国行南京站,详解SQL管理之道

12月21日,2024 ACDU中国行在南京圆满收官,本次活动分为三个篇章——回顾历史、立足当下、展望未来,为线上线下与会观众呈现了一场跨越时空的技术盛宴,吸引了众多业内人士的关注。云和恩墨副总经理熊军出席此次活动并发表了主题演讲…...

FPGA实现MIPI转FPD-Link车载同轴视频传输方案,基于IMX327+FPD953架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、详细设计方案设计原理框图IMX327 及其配置FPD-Link视频串化-解串方案MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 5、…...

vue3动态绑定图片和使用阿里巴巴矢量图

矢量图 1。加购物车 2. 下载在本地 解压 (把以下文件放进项目文件夹里面) ├── font ├── iconfont.css ├── iconfont.json (font-class用法) ├── iconfont.js (symbol用法) ├─…...

‘vite‘ 不是内部或外部命令,也不是可运行的程序

报错:执行 npm run dev时,提示’vite’ 不是内部或外部命令,也不是可运行的程序 解决:执行 npm install -g vite 报错:导入vite后再次执行npm run dev,报错failed to load config from E:\eclipseWP\test1…...

2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码

引言 本期介绍了一种基于加权平均位置概念的元启发式优化算法,称为加权平均优化算法Weighted average algorithm,WAA。该成果于2024年12月最新发表在中JCR1区、 中科院1区 SCI期刊 Knowledge-Based Systems。 在WAA算法中,加权平均位置代表当…...

如何获取 ABAP 内表中的重复项

要识别 ABAP 内表中的重复项,可以结合使用排序和循环。下面的示例展示了如何查找内部表中的重复条目: DATA: BEGIN OF itab OCCURS 0,field1 TYPE i,field2 TYPE c LENGTH 10,END OF itab,wa LIKE LINE OF itab.* Add sample data to internal table it…...

编译笔记:vs 中 正在从以下位置***加载符号 C# 中捕获C/C++抛出的异常

加载符号 解决方法: 进入VS—工具—选项----调试----符号,看右边有个“Microsoft符号服务器”,将前面的勾去掉,(可能还有删除下面的那个缓存)。 参考 C# 中捕获C/C抛出的异常 在需要捕捉破坏性异常的函数…...

ChatGPT与Postman协作完成接口测试(二)

ChatGPT生成的Postman接口测试用例脚本如下所示。 ChatGPT生成的Postman接口测试用例脚本 以下是符合Collection v2.1格式要求的 Postman 测试用例脚本,覆盖了正常注册和密码不匹配两种情况的测试: { "info": { "_postman_id": &qu…...

flask-admin modelview 中重写get_query函数

背景: flask-admin框架中提供的模型视图默认是显示表实体中的所有列表数据,如果想通过某种条件限制初始列表数据,那么久需要重写一些方法才能实现。 材料: 略 制作: 视图源码: def get_query(self):re…...

【python 逆向分析某有道翻译】分析有道翻译公开的密文内容,webpack类型,全程扣代码,最后实现接口调用翻译,仅供学习参考

文章日期:2024.12.24 使用工具:Python,Node.js 逆向类型:webpack类型 本章知识:sign模拟生成,密文的解密(webpack),全程扣代码,仅供学习参考 文章难度:低等(没…...

tensorflow_probability与tensorflow版本依赖关系

参考:Tensorflow Probability 与 TensorFlow 的版本依赖关系_tensorflow与tensorflow-probability对应版本的网址-CSDN博客 tensorflow2.10对应tensorflow_probability0.18.0,安装命令:pip install tensorflow_probability0.18.0 版本对应关…...

构建安全的用户认证系统:PHP实现

构建安全的用户认证系统:PHP实现 用户认证是任何Web应用的重要组成部分,确保只有授权用户才能访问特定资源。构建一个安全的用户认证系统需要考虑多种因素,包括密码存储、会话管理和防止常见gongji。本文将介绍如何使用PHP实现一个安全的用户…...

VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比

VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比 目录 VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比; 2.单变量时间序列预测 就是先vmd把变…...

天融信网络架构安全实践

1、医院客户想通过等保2.0三级,推荐哪几款网络安全产品?(至少6个) TopSAg(运维安全审计系统) TopNAC(网络准入系统) TopEDR(终端威胁防御系统) TDSM-SBU(存储备份一体机…...

腾讯云云开发 Copilot具有以下优势

与其他代码生成工具相比,腾讯云云开发 Copilot具有以下优势: 功能特性方面 自然语言处理能力更强:许多代码生成工具仅能实现简单的代码补全或根据特定模板生成代码,而云开发 Copilot可直接通过自然语言生成完整的小程序/web全栈…...

electron-vite【实战系列教程】

创建项目 安装必要的插件 UI 库 element-plus npm install element-plus --save 安装 element-plus 图标 npm install element-plus/icons-vue 安装插件 – 自动注册组件 vs 自动导入框架方法 npm install -D unplugin-vue-components unplugin-auto-import electron.vite.conf…...

【微信小程序】微信小程序中的异步函数是如何实现同步功能的

在微信小程序中,虽然很多 API 都是异步的,但可以通过一些方法来实现类似同步的功能。以下是几种常见的方法: 1. 使用 async/await async/await 是 ES2017 引入的语法糖,它基于 Promise 来实现异步操作的同步化写法。 示例代码 …...

贪心算法(三)

目录 一、k次取反后最大化的数组和 二、优势洗牌 三、最长回文串 四、增减字符串匹配 一、k次取反后最大化的数组和 k次取反后最大化的数组和 贪心策略&#xff1a; 解题代码&#xff1a; class Solution { public:int largestSumAfterKNegations(vector<int>&am…...

uniApp打包H5发布到服务器(docker)

使用docker部署uniApp打包后的H5项目记录&#xff0c;好像和VUE项目打包没什么区别... 用HX打开项目&#xff0c;首先调整manifest.json文件 开始用HX打包 填服务器域名和端口号~ 打包完成后可以看到控制台信息 我们可以在web文件夹下拿到下面打包好的静态文件 用FinalShell或…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...