写点什么

这 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:023080
用户头像

发布了 563 篇内容, 共 405.2 次阅读, 收获喜欢 727 次。

关注

评论

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

中国协同办公服务软件,你更看好哪一款?

易观分析

协同办公软件

诚邀参与 | OpenHarmony校园极客秀征文活动

OpenHarmony开发者

极客 OpenHarmony 征文活动

华为云携手甘肃省医疗保障局,以数字科技为智慧医疗注入新动能

华为云数据库小助手

华为云数据库 华为云DRS 智慧医疗

紧急扩散!HDFS3.X 系列的 EC 纠删码策略有个安全隐患 HDFS-16420,极端情况下会造成数据丢失!

明哥的IT随笔

hdfs

使用 Docker 一键启动环境安装 ModStart

ModStart开源

听见“SHE”说丨OpenHarmony Ladies不被定义的“AWESOME”

OpenHarmony开发者

OpenHarmony 热门活动 女性力量

【技术分享】猪八戒网DevOps之Java组件安全检测

八戒技术团队

Java DevOps 安全检测

Android技术分享| anyLive 开源项目

anyRTC开发者

android 音视频 开源项目 移动开发 视频直播

web前端培训:WEB 安全相关面试题分享

@零度

前端开发 WEB安全

华云数据加入龙蜥社区,推动开源产业快速有序成长

OpenAnolis小助手

云计算 Linux 开源 操作系统 国产

Apsara Stack 技术百科|云+应用一体化混合云全景智能化监控平台

科技互联网 企业数字化转型 混合云技术 混合云架构

15张图呈现数据库事务背后的并发原理

华为云开发者联盟

数据库 事务 并发 隔离

低代码实现探索(三十六)表达式组件—基础组件的组件

零道云-混合式低代码平台

一文看懂JVM运行时内存分布

黄林晴

JVM

面试突击29:说一下线程池7个参数的含义?

王磊

Java 面试 java面试

WhiteSource SAST:下一代应用程序安全

龙智—DevSecOps解决方案

静态应用安全测试 SAST

如何设置Perforce类型映射(P4类型映射)

龙智—DevSecOps解决方案

版本控制 游戏开发 二进制文件 游戏引擎 虚拟引擎

基于 Nebula Graph 构建图学习能力

NebulaGraph

数据库 开源 分布式图数据库 机器学习数据库

浅析人脸识别算法及其应用

得物技术

机器学习 算法 人脸识别 视觉 人脸

量子时代已来,与时代接轨,从这本书开始!

博文视点Broadview

搭建 Restful Web 服务

码界行者

REST API

【有奖体验】:2分钟自动化部署2048小游戏到ECS

阿里云云效

阿里云 云原生 CI/CD 自动化部署 ECS

阿里开源 支持10万亿模型的自研分布式训练框架EPL(Easy Parallel Library)

阿里云大数据AI技术

深度学习 开源 分布式 框架

iuap助力明日控股打造大宗贸易业财一体化中台

用友BIP

用友 用友iuap

大数据培训:偶然看到大数据面试题,拿出来分享

@零度

大数据 面试题

java培训:判断元素是不是在集合里的方法

@零度

JAVA开发

英特尔以多元化至强产品路线图 助推行业强势发展

科技新消息

春季招聘|Rust开发工程师们,欢迎加入!

非凸科技

使用AppleScript批量删除Mac中的信息

CRMEB

今天直播:datop——用在冷热内存识别和跨 numa 访存有多优秀?

OpenAnolis小助手

Linux 开源 技术直播

极光笔记 | 基于Robotframework框架进行服务端SDK的自动化(C++版本)

极光GPTBots-极光推送

c++

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