如何编写高效的Python代码
作为一个开始编程之旅的开发者,编写高效的代码可能不是你的直接目标,而是学习语言的基本语法和流程,以及如何像一个程序员一样思考。然而,当从一个新手变成一个中级的开发者时,事情就开始变得有趣了。
在你的编程旅程中,推进的方法之一是编写高效的代码。这里,高效的代码需要代码的可读性和以更快的方式编写代码。
本教程的重点是教你如何编写高效的Python代码。通过本教程的学习,你将掌握提高你作为Python开发者的工作效率所需的工具。
本教程涵盖的主题包括List理解、Lambda函数、Map、Filter和Reduce。
前提是
要跟上本教程,需要对Python编程语言有基本的了解。另外,请[下载]并安装最新版本的Python。
列表理解
Python中的列表理解使你能够用一行代码创建一个包含数据的列表。这种技术在各种编程语言中很常见。
让我们来看看语法。
result = [transform iteration filter]
result是要创建的列表的名称,transform是列表中每个数据的值;它随着迭代器的值变化而不断变化。迭代是一个循环,用指定数量的数据来填充列表。最后,过滤器是可选的;顾名思义,它是用来过滤掉不需要的数据。
下面是一个在不使用列表理解的情况下生成一个包含数据的列表的例子。
nums = []
for x in range(10):
nums.append(x)
print(nums)
输出。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
这花了大约3行代码。让我们用列表理解法创建同样的列表。
nums = [x for x in range(10)]
print(nums)
输出结果。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
这只花了一行代码就达到了前面的结果。因此,使用这种方法可以提高代码效率。
让我们看一下另一个例子。
nums = [x for x in range(20) if x % 2 != 0]
print(nums)
输出。
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
这里,你使用了过滤器,它检查并只将奇数添加到从0到20的列表中。
另一个例子。
nums = ['True' if x % 2 == 0 else 'False' for x in range(10)]
print (nums)
输出。
['True', 'False', 'True', 'False', 'True', 'False', 'True', 'False', 'True', 'False']
在这里,你添加了一个if/else 语句,为每个真或假的条件给出一个默认值。
📝注意:
elif语句不能在列表的理解中使用。
兰姆达函数
Lambda 函数是 Python 中的一种技术,可以用来创建单行函数。它通常被认为是一个匿名/无名函数。
📝注意:Lambda 函数不适合用于复杂的函数。另外,就像列表理解一样,它们可以使你的代码变得小而简洁。
让我们看一下语法。
lambda arguments: expression
左边的值被称为参数,而右边的值是表达式。让我们进一步分解这个语法。
lambda arguments: value_to_return if condition else value_to_return
下面是一个在Python中创建一个函数的例子,没有使用lambda 函数。
def even_or_odd(n):
if n % 2 == 0:
return "Even"
else:
return "Odd"
print(even_or_odd(10))
输出。
Even
这花了大约五行代码。现在让我们用一个lambda 函数来实现同样的结果。
print((lambda n: "Even" if n % 2 == 0 else "Odd")(10))
输出。
Even
只花了一行代码。
lambda函数定义可以被分配给一个变量,如下图所示。然后你可以用这个变量来调用这个函数。
even_or_odd = lambda n: "Even" if n % 2 == 0 else "Odd"
print(even_or_odd(10))
输出。
Even
通过将lambda 函数存储在一个变量内,你就不需要在它和参数之间包裹小括号了。
📝注意:该变量作为标识符来调用该函数。
Map, filter and Reduce
当处理一个包含数据的列表时,map,filter 和reduce 函数使你能够执行常见的列表操作任务。
映射
使用map 函数,你的列表可以以许多方式被修改。
比如说。
nums = [1, 2, 3, 4, 5]
squared_nums = list(map(lambda x: x * x, nums))
print(squared_nums)
输出。
[1, 4, 9, 16, 25]
map 函数需要两个参数。
- 将修改列表的函数
- 列表本身
这里x 代表列表中每个数据的值,我们要把这个值乘以自身。
📝注意:在这个例子中,你使用的是
lambda函数。但是,你也可以使用一个普通的函数,如下图所示。
nums = [1, 2, 3, 4, 5]
def square_num(n):
return n * n
squared_nums = list(map(square_num, nums))
print(squared_nums)
map 函数加上lambda 函数可以让你只用一行代码就可以修改你的列表。
💡信息:使用了一个
list函数,将map对象转换回列表。
过滤
filter 函数用于从列表中删除不需要的数据。
比如说
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_nums = list(filter(lambda x: True if x % 2 == 0 else False, nums))
print(even_nums)
输出。
[2, 4, 6, 8, 10]
这里,你要从初始列表中过滤掉奇数。
📝注意:返回
True的值会被插入到列表中。
减少
使用reduce 函数,可以将列表中的项目操作为一个单一的聚合值。
比如说
from functools import reduce
nums = [5, 6, 7, 8, 9, 10]
sum_of_nums = reduce(lambda a,b: a + b, nums)
print(sum_of_nums)
输出。
45
这里,你使用reduce 函数将列表中的所有数据相加。reduce 函数的参数是函数,它可以是一个普通的函数,也可以是一个 lambda 函数,以及可迭代对象,在这里是一个列表。
📝**注意:**在使用之前,你必须从
functools中导入reduce。
💡信息。
map,filter和reduce,可以节省你创建列表操作函数的时间。它们对许多常见的使用情况都很有用。
总结
本教程向你介绍了几个函数/技术,可以让你在更短的时间内写出简洁的代码以及更多的代码。在你的下一个Python项目中使用本教程介绍的概念,这将提高你作为一个Python开发者的效率。