我不知道的5种Python功能-但徒劳无功

毫无疑问,Python被称为在过去十年中经历了飞速发展的一种语言,它被证明是功能强大的语言。 我创建了许多Python应用程序,从交互式地图区块链 。 Python具有大量功能。 对于初学者来说,很难一次掌握所有这些。



即使您是从另一种语言(例如C)切换到Python的程序员,还是曾经使用过MATLAB的科学家,使用高级抽象进行Python编程绝对是一种非常特殊的体验。 在我看来,我想谈谈五个非常重要的功能,不幸的是,我以前不了解这些功能。

1.清单包含-编写紧凑的代码


许多人将这样的Python机制称为lambdamapfilter ,这是每个新手程序员都应该学习的秘密。 尽管我确信所有这些都是值得知道的,但是在可以应用这些工具的大多数情况下,这些工具的灵活性不足。 结果,它们远没有看起来有用。

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] 

列表包含(列表理解)是一种紧凑且方便的设计,用于使用灵活的表达式和条件从其他列表创建列表。 使用方括号描述了此构造。 它们包括仅当列表的每个元素满足特定条件时才适用于该列表的每个元素的表达式或函数。 列表包含可以是包含嵌套块的多级结构。 这使您可以处理嵌套列表,与使用mapfilter相比,具有更大的灵活性。

这是列表包含的语法:

 [ 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] 

2.使用列表-循环列表


Python允许您在使用列表时使用负索引。 以下比较是正确的:

 aList[-1] == aList[len(aList)-1] 

例如,这使得使用aList[-2]构造从列表的末尾获得第二个元素成为可能。 其他类似的设计也是可能的。

此外,您可以从列表中分得一杯::

 aList[start:end:step] 

在此,列表的初始元素包含在结果切片中,而最终元素不包含在结果切片中。 假设列表如下所示:

 aList = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

aList[2:5]切片将看起来像[2, 3, 4] 。 另外,您可以使用aList[::-1]命令“翻转”列表。 在我们的情况下,这将得到[9, 8, 7, 6, 5, 4, 3, 2, 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 = aList print(f'a = {a}, b = {b}, c = {c}, d = {d}') # a = 0, b = [1, 2, 3, 4, 5, 6, 7], c = 8, d = 9 

3. zip和枚举函数-创建功能强大的for循环


zip函数创建一个迭代器,该迭代器结合了多个列表的元素。 这允许在for循环和并行排序中对列表进行并行爬网。 您可以使用*运算符将合并后的元素恢复为正常状态。

这是使用zip函数的示例:

 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. 

但是,这是将列表恢复为正常状态的方法:

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

乍一看, enumerate函数可能看起来很复杂,但是如果您处理它,事实证明它在许多情况下都非常有用。 这是一个自动计数器,通常在for循环中使用。 此外,在这样的循环中,不必使用诸如counter = 0counter += 1类的结构来创建和递增计数器变量。

zipenumerate函数是用于构造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. 

4.生成器-高效使用内存


在需要执行某些导致大量结果出现的计算的情况下使用生成器,但同时必须避免同时分配用于存储所有此类结果的内存。 换句话说,生成器给出了某些值,就像他们所说的那样。 但是,它们不会将先前找到的值存储在内存中。 结果,节省了内存。

生成器通常用于读取大文件或使用yield关键字创建无限序列。 我经常发现在我的研究项目中使用它们是合适的。

 def gen(n):  #     ,   >= n    while True:        yield n        n += 1       G = gen(3)   #   3 print(next(G)) # 3 print(next(G)) # 4 print(next(G)) # 5 print(next(G)) # 6 

5.虚拟环境-代码隔离


如果您只能从本文中选择一个您能记住的想法,那么我建议您在本节中讨论的一个想法。 我们正在谈论虚拟环境(virtual environment)。

Python应用程序通常使用许多不同的软件包。 它们是由不同的开发人员创建的,它们在复杂的依赖项集方面有所不同。 在某个应用程序中,可以使用某个库的特定版本。 但是,此类应用程序的另一个版本将不起作用。 但是,如果多个应用程序使用同一库的不同版本怎么办? 这是一个困难的问题,导致我们想到没有通用环境,安装的软件包绝对适合所有应用程序。 这个问题的答案可以称为使用虚拟环境。

要创建彼此隔离的虚拟环境,可以执行以下操作:

 conda create -n venv pip python=3.7 #   python source activate venv ... source deactivate 

总结


在本文中,我们介绍了5个有用的Python功能。 即,它涉及列表包含,循环列表, zipenumerate函数,生成器和虚拟环境。 我们希望这些功能派上用场。

亲爱的读者们! 如果您只可以告诉一个新手程序员一个Python功能,您会选择什么?

Source: https://habr.com/ru/post/zh-CN482458/


All Articles