前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >pythonic风格代码有什么好处?附12个代码实例

pythonic风格代码有什么好处?附12个代码实例

作者头像
派大星的数据屋
发布于 2022-04-03 05:20:38
发布于 2022-04-03 05:20:38
62700
代码可运行
举报
运行总次数:0
代码可运行

pythonic是开发者们在写python代码过程中总结的编程习惯,崇尚优雅、明确、简单。就好比中文笔画,有先后顺序,最符合文字书写的习惯。

因为是习惯,不是江湖规则,所以你大可不必遵守pythonic,但如果你想成为python高手,最好是养成这个习惯。

对比其他语言我们能直观看出pythonic风格的特点,比如写一个简单循环。

Java里这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for index in (index; index < items.length ; index++)
 {
  item = items[index];
 ... now do something
 }

尝试用python来写循环,则非常简洁易懂:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for item in items:
  item.perform_action()

想要更加pythonic,用生成器表达式来写循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(item.some_attribute for item in items)

这样的写法其实已经接近自然语言,一眼能看出代码意思。

如果你在Python IDE中输入import python,则会看到下面一首诗:

美胜于丑,简胜于繁,这就是Python哲学。

有一本书《effctive python》里面讲到蛮多pythonic的写法,下面列出一些常见的代码。

「1、用列表推导式来取代map、filter」

map、filter需要编写额外的lambda函数,用起来比较复杂,而且效率也不高。

列表推导式则非常简洁,通过循环创建列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 任务:找到列表中可以被2整除的数,并作二次方运算。

# 非pythonic方法
a = [1,2,3,4,5,6,7,8,9,10]
result = map(lambda x: x**2 ,filter(lambda x: x%2==0,a))

# pythonic方法
a = [1,2,3,4,5,6,7,8,9,10]
result = [x**2 for x in a if x%2==0]

「2、用生成器表达式来代替数据量较大的列表推导」

列表推导式虽然简洁,但是不适合大数据量的生成,因为可能会把内存占满。这时就要用到生成器表达式,它返回生成器,基本不占用内存。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 任务:对十亿条数据进行求平方根操作

# 非pythonic方法
a = [1,2,3,4,5,6,7,8,9,10] # 假装这里有十亿个数字
result = [x**0.5 for x in a]

# pythonic方法
a = [1,2,3,4,5,6,7,8,9,10]# 假装这里有十亿个数字
result = (x**0.5 for x in a)

「3、尽量使用enumerate」

enumerate可以把迭代器包装成生成器,每次遍历时,会同时列出数据和数据下标。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 任务:打印列表中每个元素的索引

# 非pythonic方法
a = ['apple','banana','orange']
for i in range(len(a)):
    print(a[i],':',i)

# pythonic方法
a = ['apple','banana','orange']
for i,j in enumerate(a):
    print(i,':',j)

「4、使用with方法处理文件」

with语句提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 任务:读取一个txt文件

# 非pythonic方法
f = open("some_file.txt")
try:
  data = f.read()
  # 其他文件操作..
finally:
  f.close()

# pythonic方法
with open("some_file.txt") as f:
  data = f.read()
  # 其他文件操作...

「5、使用map函数」

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 任务:对比两个列表相同索引位置元素的大小,输出较大值

# 非pythonic方法
a = [1,5,7]
b = [2,4,6]
for i in range(len(a)):
    if a[i] > b[i]:
        print(a[i])
    else:
        print(b[i])

# pythonic方法
a = [1,5,7]
b = [2,4,6]
for i,j in zip(a,b):
    if i > j:
        print(i)
    else:
        print(j)

「6、每行只写一段语句」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 非pythonic方法
print ('one'); print ('two')

if x == 1: print ('one')

# pythonic方法
print ('one');
print ('two')

if x == 1:
    print ('one')

「7、缩进」

续行应该与其包裹元素对齐,要么使用圆括号、方括号和花括号内的隐式行连接来垂直对齐,要么使用挂行缩进对齐3。

当使用挂行缩进时,应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 非pythonic方法
# 没有使用垂直对齐时,禁止把参数放在第一行
foo = long_function_name(var_one, var_two,
    var_three, var_four)

# 当缩进没有与其他行区分时,要增加缩进
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

# pythonic方法
# 与左括号对齐
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

# 用更多的缩进来与其他行区分
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

# 挂行缩进应该再换一行
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

「8、 import 导入要分行」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 非pythonic方法
import sys, os

# pythonic方法
import os
import sys
from subprocess import Popen, PIPE

「9、交换两个变量的值」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 非pythonic方法
a = 'hello'
b = 'world'
temp = a
a = b
b = temp
print(a, b)


# pythonic方法
a = 'hello'
b = 'world'
a, b = b, a
print(a, b)

「10、使用join方法拼接字符串」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 非pythonic方法
a = ['w','o','r','l','d']
b = ''
for i in a:
    b+=i
print(b)


# pythonic方法
a = ['w','o','r','l','d']
b = ''.join(a)
print(b)

「11、判断一个值是否为True、空列表、None」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 非pythonic方法
if x == True:
    pass
if len(y) == 0:
    pass
if z == None:
    pass


# pythonic方法
if x:
    pass
if not y:
    pass
if z is None:
    pass

「12、pythonic风格函数」

  • 命名合理
  • 具有单一功能
  • 包含文档注释
  • 返回一个值
  • 函数和类应该用两个空行隔开
  • 尽量使用内置函数

「补充」

最后说下PEP8规范,PEP8是Python的编码规范,其目的在于提高代码的可读性。

写python代码时,在保证准确的前提下,要尽可能遵守PEP8。

PEP8含义:

常见规则:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
RAG (Retrieval-Augmented Generation) 教程
在自然语言处理(NLP)领域,生成式 AI(如 GPT-4)在文本生成方面表现优异,但其主要依赖于预训练的知识,无法动态获取最新信息。为了解决这一问题,RAG(检索增强生成,Retrieval-Augmented Generation)应运而生,它结合了信息检索(IR)与文本生成(NLG)技术,使得 AI 可以利用外部知识库,提高回答的准确性和可解释性。
IT蜗壳-Tango
2025/03/31
6550
【RAG入门必备技能】Faiss框架使用与FaissRetriever实现
faiss是一个Facebook AI团队开源的库,全称为Facebook AI Similarity Search,该开源库针对高维空间中的海量数据(稠密向量),提供了高效且可靠的相似性聚类和检索方法,可支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库
致Great
2024/06/06
2.9K0
【RAG入门必备技能】Faiss框架使用与FaissRetriever实现
DMQR-RAG: 基于多样化查询重写的检索增强生成
论文链接:https://openreview.net/pdf?id=lz936bYmb3
致Great
2024/11/23
2540
DMQR-RAG: 基于多样化查询重写的检索增强生成
👾打开 RAG 对接大模型的黑盒 —— 9 大隐藏问题
前一段时间,各个大模型在争斗:谁能携带更长、更大的上下文 Prompt,比如 Kimi 说 200 万字,阿里通义千问又说自己能达 1000 万字;大家都知道 Prompt 很重要,但是 RAG 和 长的上下文文本携带 是两个不同的技术方向。
掘金安东尼
2024/04/04
4510
👾打开 RAG 对接大模型的黑盒 —— 9  大隐藏问题
如何实现参加RAG比赛但进不了复赛的总结
好久没写文章了,断更了一个多月了,刚开始一段时间主要是上班精神内耗太严重没有精力去写文了,到六月初的时候,参加了一个RAG相关的比赛,初赛本周结束,作为菜鸟的我也是理所应当的没进复赛,跟第一名差了十分多,尝试了很多办法,但的确已经到个人能力的尽头了,决定就此放弃,这也是我第一次参加跟AI相关的比赛,而且还是自己单打独斗,也不能再强求更好了,总的来说,四个字:菜就多练🐶。
叶子的技术碎碎念
2025/04/08
580
如何实现参加RAG比赛但进不了复赛的总结
使用 Llama3 和 Ollama 改进了 RAG
在本文中,我们将创建一个高级 RAG,它将根据作为管道输入给出的研究论文来回答用户查询。用于构建该管道的技术堆栈如下。
IT大咖说
2024/04/24
1.2K0
使用 Llama3 和 Ollama 改进了 RAG
RAG流程优化(微调)的4个基本策略
在本文中,我们将介绍使用私有数据优化检索增强生成(RAG)的四种策略,可以提升生成任务的质量和准确性。通过使用一些优化策略,可以有效提升检索增强生成系统的性能和输出质量,使其在实际应用中能够更好地满足需求。
deephub
2024/07/01
1.2K0
RAG流程优化(微调)的4个基本策略
智谱免费GLM-4V-Flash助力多模态RAG实现
多模态检索增强生成(RAG)技术正快速发展,但部署成本较高。智谱科技开放的GLM-4V-Flash作为免费多模态大模型,具备图文理解、知识检索等能力,为构建RAG系统提供了经济实惠的选择。
致Great
2024/12/28
4970
智谱免费GLM-4V-Flash助力多模态RAG实现
【RAG提升技巧】查询改写HyDE
提高 RAG 推理能力的一个好方法是添加查询理解层 ——在实际查询向量存储之前添加查询转换。以下是四种不同的查询转换:
致Great
2024/06/07
5750
【RAG提升技巧】查询改写HyDE
探索检索增强生成(RAG)技术的无限可能:Vector+KG RAG、Self-RAG、多向量检索器多模态RAG集成
由于 RAG 的整体思路是首先将文本切分成不同的组块,然后存储到向量数据库中。在实际使用时,将计算用户的问题和文本块的相似度,并召回 top k 的组块,然后将 top k 的组块和问题拼接生成提示词输入到大模型中,最终得到回答。
汀丶人工智能
2024/01/10
3.8K0
探索检索增强生成(RAG)技术的无限可能:Vector+KG RAG、Self-RAG、多向量检索器多模态RAG集成
【GoMate框架案例】讯飞大模型RAG智能问答挑战赛top10 Baseline
RAG(检索增强生成)是一种结合了检索模型和生成模型的技术,它通过检索大量外部知识来辅助文本生成,从而提高大型语言模型(LLMs)的准确度和可靠性。
致Great
2024/11/23
1490
【GoMate框架案例】讯飞大模型RAG智能问答挑战赛top10 Baseline
LLM RAG系列
本文介绍了RAG以及RAG pipeline的整个流程,包括请求转换、路由和请求构造、索引和检索、生成和评估等,其中引用了大量有价值的论文。
charlieroro
2024/04/02
8200
LLM RAG系列
【RAG最新研究】优化RAG系统的最佳实践与深度解析
这篇论文主要关注的是检索增强型生成(RAG)系统中的一个核心问题:不同的组件和配置如何影响系统的性能。
致Great
2025/01/16
4610
【RAG最新研究】优化RAG系统的最佳实践与深度解析
大模型应用系列:从Ranking到Reranking
【引子】Ranking 和Reranking又是一个NLP 处理中的传统技术, 那么在大模型应用中又起到怎样的作用呢?
半吊子全栈工匠
2024/11/11
5370
大模型应用系列:从Ranking到Reranking
RAG+内容推荐,应该如何实践?
首先回顾一下 RAG 技术定义,它可以结合信息检索和生成模型的混合。简单来说,RAG = 预训练的语言模型 + 信息检索系统,使模型能够在生成自然语言时引入外部知识,从而提高生成内容的准确性和多样性。
掘金安东尼
2024/07/18
2130
RAG+内容推荐,应该如何实践?
增强RAG:选择最佳的嵌入和重排模型
在构建检索增强生成(RAG)管道时,关键组件之一是检索器。我们有多种嵌入模型可供选择,包括 OpenAI、CohereAI 和开源的sentence transformers。此外,还有来自 CohereAI 和sentence transformers的几种重排器可供选择。
数据STUDIO
2024/07/24
9590
增强RAG:选择最佳的嵌入和重排模型
使用Llama index构建多代理 RAG
检索增强生成(RAG)已成为增强大型语言模型(LLM)能力的一种强大技术。通过从知识来源中检索相关信息并将其纳入提示,RAG为LLM提供了有用的上下文,以产生基于事实的输出。
deephub
2023/10/31
1.2K0
使用Llama index构建多代理 RAG
RAG中的3个高级检索技巧
RAG系统检索的文档可能并不总是与用户的查询保持一致,这是一个常见的现象。当文档可能缺乏查询的完整答案或者包含冗余信息或包含不相关的细节,或者文档的顺序可能与用户的意图不一致时,就会经常出现这种情况。
deephub
2024/01/23
7830
RAG中的3个高级检索技巧
大模型应用系列:Query 变换的示例浅析
【引】NLP中的经典组件在大模型应用中还有效么?大模型对自然语言处理中的典型任务有什么影响么?
半吊子全栈工匠
2024/11/07
2360
大模型应用系列:Query 变换的示例浅析
tree2retriever:面向RAG场景的递归摘要树检索器实现
致Great
2024/05/31
1290
tree2retriever:面向RAG场景的递归摘要树检索器实现
推荐阅读
相关推荐
RAG (Retrieval-Augmented Generation) 教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档