5 个越早知道越好的 Python 特性

新闻 后端
Python 是近十年来兴起的编程语言,并且被证明是一种非常强大的语言。我用 Python 构建了很多应用程序,从交互式地图到区块链。

 [[287174]]

Kirill Sharkovski 发布在 Unsplash 杂志上的照片

本文转自雷锋网,如需转载请至雷锋网官网申请授权。

Python 是近十年来兴起的编程语言,并且被证明是一种非常强大的语言。我用 Python 构建了很多应用程序,从交互式地图到区块链。Python 有很多特性,初学者很难一开始就掌握所有的特性。

即使你是一个从其他语言(如 C 或 MATLAB)转换过来的程序员,用更高抽象级别的 Python 编写代码绝对是另一种体验。回顾起来,有很多 Python 特性如果我能早点知道,肯定能少走不少弯路。现在我想要重点介绍其中五个最重要的特性。

1.理解 List——压缩代码

很多人会将 lambda、map 和 filter 作为 Python 的「技巧」,每个初学者都应该学习这些技巧。虽然我相信它们是我们应该掌握的特性,但我发现由于缺乏灵活性,它们在大多数时候并不特别有用。

Lambda 是一种在一行中组合函数以供一次性使用的方法。如果函数被多次调用,性能将受到影响。另一方面,map 将函数应用于列表中的所有元素,而 filter 将获取满足用户定义条件的集合中元素的子集。

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

 Anastase Maragos 发表在 Unsplash 杂志上的照片

列表理解是一种简洁而灵活的方法,可以使用灵活的表达式和条件从其他列表创建列表。它是由方括号构造的,它有一个表达式或一个函数,只有当元素满足某个条件时,该表达式或函数才应用于列表中的每个元素。它还可以嵌套来处理嵌套列表,并且比使用 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]     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

2.列表循环

Python 允许使用负索引,其中 Altruts [-1]== Altrue[LeN(Listor)-1 ]。因此,我们可以通过调用 a list[-2] 等获得列表中的倒数第二个元素。

我们还可以使用语法 aList[start:end:step] 对列表进行切片,其中包含起始元素,但不包含结束元素。因此,aList[2:5] 的结果是 [2,3,4]。我们也可以通过调用 a list[::-1] 来反转列表,我发现这种技术非常优雅。

[[287175]]

Martin Shreder 发表在 Unsplash 杂志上的照片

列表也可以分解成单独的元素,或者使用星号将元素和子列表混合。

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 = aList     
 
print(f'a = {a}, b = {b}, c = {c}, d = {d}')     
 
# a = 0, b = [1234567], c = 8, d = 9     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

3.压缩和枚举:for 循环

Zip 函数创建一个迭代器,该迭代器聚合来自多个列表的元素。它允许在 for 循环中并行遍历列表并并行排序。它可以用星号来解压缩。

numList = [012]     
 
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.     
 
Eng = list(zip(engList, espList, numList))     
 
Eng.sort() # sort by engList     
 
a, b, c = zip(*Eng)     
 
print(a)     
 
print(b)     
 
print(c)     
 
# ('one''two''zero')     
 
# ('uno''dos''cero')     
 
# (120)     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.

[[287176]]

Erol Ahmed 发表在 Unsplash 杂志上的照片

枚举一开始可能看起来有点吓人,但在许多情况下它是非常方便的。它是一个经常在 for 循环中使用的自动计数器,不需要在 for 循环中创建和初始化计数器变量 by counter=0 和 counter+=1。枚举和 zip 是构造 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.  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

   

4.生成器:内存效率

当我们打算对大量数据进行计算,但希望避免同时分配所有结果所需的内存时,会使用生成器。换句话说,它们会动态生成值,而不会将以前的值存储在内存中,因此我们只能对它们进行一次迭代。

它们通常用于读取大文件或使用关键字 yield 生成无限序列。我经常发现它在我的大多数数据科学项目中很有用。

def gen(n):    # an infinite sequence generator that generates integers >= n     
 
        while True:     
 
              yield n     
 
              n += 1     
 
G = gen(3)     # starts at 3     
 
print(next(G)) # 3     
 
print(next(G)) # 4     
 
print(next(G)) # 5     
 
print(next(G)) # 6     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

5.虚拟环境:isolation

如果你读完本文中只记得其中一条,那么应该是虚拟环境的使用。

[[287177]]

Matthew Kwong 发布在 Unsplash 上的照片

Python 应用程序通常使用很多不同的包,这些包来不同的开发人员,具有复杂的依赖关系。不同的应用程序是使用特定的库设置开发的,其中的结果不能使用其他库版本复制。不存在一次安装就满足所有应用要求的情况。

conda create -n venv pip python=3.7  # select python version 
source activate venv 
... 
source deactivate 
  • 1.
  • 2.
  • 3.
  • 4.

因此,为每个应用程序创建独立的独立虚拟环境 venv 是非常重要的,这可以使用 pip 或 conda 来完成。

责任编辑:张燕妮 来源: 雷锋网
相关推荐

2020-07-16 08:46:50

Python 开发编程语言

2020-01-09 12:11:02

Python 开发编程语言

2018-06-19 11:00:27

服务器性能数据

2020-04-27 09:21:25

Android谷歌功能

2016-01-15 09:46:16

开源DJMixxx 2.0

2025-01-26 09:28:09

2015-06-04 17:35:45

融合媒体云华为

2015-11-09 12:54:55

Build 10586手机版Windows 10

2020-12-09 09:02:12

CSS 伪元素代码

2015-08-07 12:33:12

Java新特性编程

2024-01-05 17:16:03

2015-08-28 10:31:20

Windows 10预览版更新

2015-08-10 09:53:10

Windows 10隐私

2015-03-23 10:20:04

程序员精英程序员程序员忠告

2017-09-29 10:33:53

互联网

2024-05-15 07:11:23

2021-07-27 12:45:07

NaaS网络网络即服务

2018-03-22 19:03:34

2013-02-26 09:42:14

奥斯卡小金人微软
点赞
收藏

51CTO技术栈公众号