当前位置: 首页 > 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或…...

【AI落地应用实战】篡改检测技术前沿探索——从基于检测分割到大模型

在数字化洪流席卷全球的当下&#xff0c;视觉内容已成为信息交流与传播的核心媒介&#xff0c;然而&#xff0c;随着PS技术和AIGC技术的飞速发展&#xff0c;图像篡改给视觉内容安全带来了前所未有的挑战。 本文将探讨篡改检测技术的现实挑战&#xff0c;分享篡改检测技术前沿…...

使用 VSCode 学习与实践 LaTeX:从插件安装到排版技巧

文章目录 背景介绍编辑器编译文件指定输出文件夹 usepackagelatex 语法列表插入图片添加参考文献 背景介绍 最近在写文章&#xff0c;更喜欢latex的论文引用。然后开始学习 latex。 编辑器 本文选择vscode作为编辑器&#xff0c;当然大家也可以尝试overleaf。 overleaf 有网…...

使用scrapy框架爬取微博热搜榜

注&#xff1a;在使用爬虫抓取网站数据之前&#xff0c;非常重要的一点是确保遵守相关的法律、法规以及目标网站的使用条款。 &#xff08;最底下附下载链接&#xff09; 准备工作&#xff1a; 安装依赖&#xff1a; 确保已经安装了Python环境。 使用pip安装scrapy&#xff…...

瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…...

es快速扫描

介绍 Elasticsearch简称es&#xff0c;一款开源的分布式全文检索引擎 可组建一套上百台的服务器集群&#xff0c;处理PB级别数据 可满足近实时的存储和检索 倒排索引 跟正排索引相对&#xff0c;正排索引是根据id进行索引&#xff0c;所以查询效率非常高&#xff0c;但是模糊…...

前端对页面数据进行缓存

页面录入信息&#xff0c;退出且未提交状态下&#xff0c;前端对页面数据进行存储 前端做缓存&#xff0c;一般放在local、session和cookies里面&#xff0c;但是都有大小限制&#xff0c;如果页面东西多&#xff0c;比如有上传的图片、视频&#xff0c;浏览器会抛出一个Quota…...

leetCode322.零钱兑换

题目&#xff1a; 给你一个整数数组coins,表示不同面额的硬币&#xff1b;以及一个整数amount,表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回-1。 你可以认为每种硬币的数量是无限的。 示例1&#xff1…...

jsp-servlet开发

STS中开发步骤 建普通jsp项目过程 1.建项目&#xff08;非Maven项目&#xff09; new----project----other----Web----Dynamic Web Project 2.下载包放到LIB目录中,如果是Maven项目可以自动导包&#xff08;pom.xml中设置好&#xff09; 3.设置工作空间&#xff0c;网页…...

从零玩转CanMV-K230(7)-I2C例程

文章目录 前言一、IIC API二、示例总结 前言 K230内部包含5个I2C硬件模块&#xff0c;支持标准100kb/s&#xff0c;快速400kb/s模式&#xff0c;高速模式3.4Mb/s。 通道输出IO配置参考IOMUX模块。 一、IIC API I2C类位于machine模块下。 i2c I2C(id, freq100000) 【参数】…...

n阶Legendre多项式正交性的证明

前言 在《n次Legendre(勒让德)多项式在区间(-1, 1)上根的分布及证明》这篇文章中&#xff0c;我们阐述了Legendre多项式在 [ − 1 , 1 ] [-1,1] [−1,1]上的根分布情况并给出了证明。本文将证明Legendre多项式在 [ − 1 , 1 ] [-1,1] [−1,1]上的正交性质。 正交多项式的定义…...