写点什么

这 5 个 Python 特性,后悔没早知道

  • 2020-01-09
  • 本文字数:2370 字

    阅读完需:约 8 分钟

这5个Python特性,后悔没早知道


作为近 10 年才崛起的编程语言,Python 已被证明是一种非常强大的语言。从交互式映射区块链,我用 Python 构建过很多应用程序。


对初学者而言,Python 中有很多特性很难一开始就掌握。


即使你是从其他语言转换过来的程序员,用 Python 进行更高级别的抽象编码绝对是另一种体验。有些 Python 特性,我希望自己能早点知道。本文将介绍其 5 个最重要的特性。

1.列表推导式:代码更紧凑

很多人认为,lambda、map filter 是初学者应该最先掌握的 Python“技巧”。虽然我也认为应关注这些功能,但由于它们缺乏灵活性。


实际上,它们在大多数情况下并不是非常有用!


Lambda是一种在 1 行中编写一个一次性使用的函数的方法。一旦函数被多次调用,性能将受到影响。


另一方面,map 可以将一个函数应用于列表中的所有元素,而 filter 能获取集合中满足用户自定义条件的元素子集。


add_func = lambda z: z ** 2is_odd = lambda z: z%2 == 1multiply = lambda x,y: x*y
aList = list(range(10))print(aList)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
复制代码


列表推导式是一个简洁而灵活的方法,它使用灵活的表达式和条件通过其他列表来创建新列表。


它用方括号来构造,带有一个表达式或函数,只有当列表中的元素满足某个条件时,该表达式或函数才作用于列表中的每个元素。


并且,它还能用嵌套来处理嵌套列表,并且这会比使用 map 和 filter 更灵活。


# Syntax of list comprehension[ expression(x) for x in aList if optional_condition(x) ]
复制代码


print(list(map(add_func, aList)))print([x ** 2 for x in aList])# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(list(filter(is_odd, aList)))print([x for x in aList if x%2 == 1])# [1, 3, 5, 7, 9]# [1, 3, 5, 7, 9]
复制代码


下载地址:python-list-comprehension.py

2、列表操作:实现列表的双向操作

Python 允许使用反向索引,其中aList[-1] == aList[len(aList)-1] 。所以,我们可以通过调用aList[-2] 来获取列表的倒数第二个元素。


我们还能使用 aList[start:end:step]语法来对列表进行切片,其中起始元素包含在内,终止元素不包含在内(即 [start,end) 步长为 step 的前闭后开区间)。


因此,调用 aList[2:5] 会得到 [2, 3, 4]。我们也能通过调用 aList[::-1] 来反转列表,这种技术非常优雅。


此外,也可以将列表拆分成单独的元素,或者使用星号将列表拆分成单个元素和子列表的混合形式。


a, b, c, d = aList[0:4]print(f'a = {a}, b = {b}, c = {c}, d = {d}')# a = 0, b = 1, c = 2, d = 3
a, *b, c, d = aListprint(f'a = {a}, b = {b}, c = {c}, d = {d}')# a = 0, b = [1, 2, 3, 4, 5, 6, 7], c = 8, d = 9
复制代码


下载地址:python-unpacking.py

3、 压缩和枚举:for 循环更方便

Zip 函数会创建一个迭代器,且该迭代器可以对来自多个列表的元素进行聚合。用它可以在 for 循环中对列表进行并行遍历和排序。


用星号对其进行解压。


numList = [0, 1, 2]engList = ['zero', 'one', 'two']espList = ['cero', 'uno', 'dos']print(list(zip(numList, engList, espList)))# [(0, 'zero', 'cero'), (1, 'one', 'uno'), (2, 'two', 'dos')]
for num, eng, esp in zip(numList, engList, espList): print(f'{num} is {eng} in English and {esp} in Spanish.')# 0 is zero in English and cero in Spanish.# 1 is one in English and uno in Spanish.# 2 is two in English and dos in Spanish.
复制代码


下载地址:python-zip-1.py


Eng = list(zip(engList, espList, numList))Eng.sort() # sort by engLista, b, c = zip(*Eng)
print(a)print(b)print(c)# ('one', 'two', 'zero')# ('uno', 'dos', 'cero')# (1, 2, 0)
复制代码


下载地址:python-zip-2.py


开始时, Enumerate 看起来有点吓人,但在很多情况下使用它确实能方便很多。


它是一个自动计数器,通常会在 for 循环中使用它,这样就不需要再用 counter = 0counter += 1 来创建和初始化计数器了。枚举和压缩是两个构造 for 循环的最强工具。


upperCase = ['A', 'B', 'C', 'D', 'E', 'F']lowerCase = ['a', 'b', 'c', 'd', 'e', 'f']for i, (upper, lower) in enumerate(zip(upperCase, lowerCase), 1):    print(f'{i}: {upper} and {lower}.')# 1: A and a.# 2: B and b.# 3: C and c.# 4: D and d.# 5: E and e.# 6: F and f.
复制代码


下载地址:python-enumerate.py

4、生成器:内存更高效

当我们想要对一个大的结果集进行计算,但又不想为所有结果数据同时分配内存时,我们就可以使用生成器(Generator)了。


换句话说,它会动态地生成值,并且不会将先前的值存储在内存中,因此我们只能对它们进行一次迭代操作。


当读取大文件或使用关键字 yield 生成无穷数列时,通常会用它。我发现在我的大多数数据科学项目中,它都能发挥很大作用。


def gen(n):    # an infinite sequence generator that generates integers >= n    while True:        yield n        n += 1        G = gen(3)     # starts at 3print(next(G)) # 3print(next(G)) # 4print(next(G)) # 5print(next(G)) # 6
复制代码


下载地址:python-generator.py

5、虚拟环境:实现隔离

如果在本文介绍的 5 个特性中只选一个,那么就是虚拟环境的使用。


Python 应用程序通常会用各种不同的包,这些包可能是由具有复杂依赖关系的不同开发人员开发的。每个应用程序都会用特定的库设置,使用其他库的版本无法实现对某个应用程序安装包的复制。


所以,不存在满足所有应用要求的单个安装包。


conda create -n venv pip python=3.7  # select python versionsource activate venv...source deactivate
复制代码


为每个应用程序创建独立的、自洽的虚拟环境 venv 非常重要,这可以通过使用 pipconda来实现。


原文链接:


https://towardsdatascience.com/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4


2020-01-09 12:022787
用户头像

发布了 342 篇内容, 共 244.8 次阅读, 收获喜欢 630 次。

关注

评论

发布
暂无评论
发现更多内容

Jenkins与不同阶段测试的完美结合

测试人

软件测试

深度解析1688 API对电商的影响与实战应用

科普小能手

数据挖掘 电商 1688 运营干货 API 接口

软件项目建设方案模板参考,项目建设文档

金陵老街

“企业级敏捷教练课程” 2月15-16日 · CSP-SM认证周末班

ShineScrum

Scrum 敏捷 认证 Scrum Master

Alibaba Cloud Linux V3 新版发布,以安全为基石,为阿里云ECS九代实例注入 AI 新动力

OpenAnolis小助手

国产操作系统 Alibaba Cloud Linux

想要冲击腾讯的朋友不要错过

王中阳Go

腾讯 面经

社交软件红包技术解密(四):微信红包系统是如何应对高并发的

JackJiang

网络编程 即时通讯 IM

英伟达首席工程师Corey: HNSW+CPU过时了!GPU+RAPIDS cuVS才是向量检索最优解

Zilliz

gpu cpu 英伟达 向量检索 Milvus

EasyExcel碰到问题记录

京东科技开发者

具身智能加快产业重构,九牧引领行业从“单品”到“生态”

Alter

Milvus入门小册

Quincy

Milvus 入门版

Spring缓存注解浅析及实践

京东科技开发者

淘宝商品数据抓取与关键词搜索API应用:深度解析与专业指南

代码忍者

淘宝API接口

京东app商品详情API接口系列(京东API)

tbapi

京东API接口 京东app详情接口

“数据中心场景鲲鹏BoostKit大数据使能解决方案”入选“2024 ICT产业高质量发展推荐”

极客天地

巧用CAD多行文字与文字样式功能,提高绘图效率!

在路上

cad cad看图 CAD看图软件 CAD看图王

从网络到支撑系统,GenAI将给运营商带来哪些变化?

鲸品堂

通信运营商 GenAI 企业号 2025年1月PK榜

马斯克、黄仁勋共同“打响”2025年全球人形机器人商业化第一

机器人头条

英伟达 科技 特斯拉 人形机器人 具身智能

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS HPE (慧与) 定制版

sysin

esxi hpe

深度揭秘:JenkinsFile与Pipeline的完美结合

测试人

软件测试

万字长文:京东保险供应链的前世今生

京东科技开发者

去哪儿国际酒店AI生成视频实践

Qunar技术沙龙

人工智能 AI视频

如何快速批量导出CAD测量结果?

在路上

cad cad看图 CAD看图王

AI正在如何重塑未来职业发展路径?

天津汇柏科技有限公司

AI 人工智能

持续交付的利器:Blue Ocean与Pipeline

测试人

软件测试

【翻译】不止Cursor,2024年AI代码工具终极指南,AI辅助编程工具聚会了——慢慢学AI143

AI决策者洞察

#人工智能 Prompt

深度解读英伟达最新世界基础模型Cosmos:用AI数据训练AI算法,彻底闭环了?

Zilliz

AI 英伟达 Cosmos 合成数据 世界基础模型

“考公”有捷径?Milvus助力粉笔教育构建个性化考公RAG

Zilliz

Milvus rag 粉笔教育 图搜召回

ClkLog埋点分析系统常见问题-指标定义与统计逻辑Sec.1

ClkLog

开源 数据分析 埋点 sdk 用户画像

方法引用与lambda底层原理&Java方法引用、lambda能被序列化么?

不在线第一只蜗牛

Java

这5个Python特性,后悔没早知道_文化 & 方法_Eden Au_InfoQ精选文章