开工福利|免费学 2200+ 精品线上课,企业成员人人可得! 了解详情
写点什么

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

发布了 329 篇内容, 共 228.1 次阅读, 收获喜欢 620 次。

关注

评论

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

ARTS打卡-06

Geek_yansheng25

Cache解决算法 Charles断点调试breakpoint John 易筋 ARTS 打卡 Week 08

John(易筋)

ARTS 打卡计划

智慧4S店解决方案发布,看英特尔如何引领汽车销售行业变革

最新动态

ARTS WEEK5

紫枫

ARTS 打卡计划

每周学习总结 - 架构师培训 6期

Damon

极客时间 - 架构师培训 - 6 期作业

Damon

Go:Stringer命令,通过代码生成提高效率

陈思敏捷

stringer Go 语言

简述CAP理论

lei Shi

手把手整合SSM框架

JavaPub

【计算机网络】为什么要三次握手四次挥手?

烫烫烫个喵啊

TCP 计算机网络

MySQL实战45讲总结

`

MySQL

每周学习总结 - 架构师培训 5 期

Damon

分布式系统设计理念这么难学?

架构师修行之路

架构 分布式

设计模式(1)—什么是设计模式?设计模式的六大原则是什么?

爱嘤嘤嘤斯坦

Java 程序员 编程语言 设计模式 23种设计模式

昆明市成立两大“高端”中心,区块链赋能生物医药和高原特色农业

CECBC

redis系列之——高可用(主从、哨兵、集群)

诸葛小猿

redis redis集群 redis哨兵 redis主从

程序的机器级表示-程序的编码

引花眠

计算机基础

ARTS打卡 第7周

引花眠

ARTS 打卡计划

SpringBoot 入门:03 - 统一请求返回

封不羁

Java spring springboot

数据驱动 vs 关键字驱动:对UI自动化测试框架搭建的探索

冯文辉

DevOps 敏捷 自动化测试

进程、线程基础知识全家桶,30 张图一套带走

小林coding

Linux 操作系统 计算机基础 进程 进程线程区别

Mysql插入百万条数据

Java小咖秀

MySQL 运维 数据

一致性hash算法及标准差验证

Damon

【计算机网络】如何实现可靠数据传输?

烫烫烫个喵啊

编程核心能力之抽象

顿晓

抽象 编程日课

低代码与无代码

lidaobing

低代码 无代码开发

抽象工厂模式

Leetao

Python 面试 设计模式

观智能化浪潮如何改变产业链创新

CECBC

ARTS打卡 - Week 07

teoking

负载均衡方式

羽球

负载均衡

ARTS-WEEK6

一周思进

ARTS 打卡计划

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