这个 Python 教程将重点介绍理解力和如何使用它们。在 Python 中,理解力的概念是:它是[创建一个列表]或其它序列的一种更简单、更易读的方式。创建一个列表是理解力最常见的应用,但它也可以用于字典、元组、集合,甚至是字符串。也可以用if语句或if else语句给理解力添加逻辑。我们将检查常见的[python for 循环]结构,以及如何使用 Python 中的理解力重写它们。
简单的列表式理解
学习 Python 中的理解力的一个好方法是看到使用 for 循环的代码和使用理解力的代码来获得所需的结果。我们可以从列表理解开始,并使用 for 循环的代码片段来开始。
for 循环
这里我们有一个简单的[python数字]列表,存储在 **numbers**变量中。然后我们使用for循环来循环每个项目,并在每次迭代时将其添加到 **my_list[]**变量中。这段代码读起来就像,我想为'numbers'中的每一项添加一个'数字'。
numbers = [1, 2, 3, 4, 5, 6, 7]
my_list = []
for number in numbers:
my_list.append(number)
print(my_list)
[1, 2, 3, 4, 5, 6, 7]
列表理解
列表理解版本取消了for循环,而仅仅使用*[number for number in numbers]语法来实现同样的结果。它的读法是:我想为numbers中的每一个数字提供一个数字。打印出 **my_list**变量,表明我们已经成功地将每个项目从***numbers到my_list**使用Python中的理解力。很好!
numbers = [1, 2, 3, 4, 5, 6, 7]
my_list = [number for number in numbers]
print(my_list)
[1, 2, 3, 4, 5, 6, 7]
对每个项目进行操作
当使用for循环时,通常会在每次迭代中对每个项目进行某种类型的操作。在这个例子中,我们要计算列表中每个数字的平方。你可以这样理解,*我想对'numbers'中的每个'number'进行'number * number'。*让我们看看这在for循环中是什么样子的。
for 循环
为了在for循环中做到这一点,我们创建一个空列表,然后循环浏览其中包含的所有数字。在每个循环中,我们添加数字的平方。当 for 循环停止运行时,我们简单地打印出列表以查看结果。
numbers = [1, 2, 3, 4, 5, 6, 7]
my_list = []
for number in numbers:
my_list.append(number * number)
print(my_list)
[1, 4, 9, 16, 25, 36, 49]
列表理解
这个循环的列表理解版本与我们看的第一个例子非常相似。这次唯一不同的是,我们说我们要的是每个项目的平方。因此,这个例子的意思是:我想要'number * number',用于'numbers'中的每一个'number',你可以看到它是如何转化为*[number * number for number in numbers]* 的理解的。打印出结果列表,我们就可以得到我们想要的东西。
numbers = [1, 2, 3, 4, 5, 6, 7]
my_list = [number * number for number in numbers]
print(my_list)
[1, 4, 9, 16, 25, 36, 49]
lambda版本
这也可以用lambda函数来完成,但它没有那么容易阅读和理解。我想你会同意的。
numbers = [1, 2, 3, 4, 5, 6, 7]
my_list = map(lambda number: number * number, numbers)
print(list(my_list))
[1, 4, 9, 16, 25, 36, 49]
理解If
在使用for循环时,我们可以在循环中使用一个if条件来确定我们是否要采取某种行动。
for 循环
在这个例子中,我们现在要在每次迭代中*只在数字是偶数的情况下对数字进行平方。我们可以通过使用模运算符来检查一个数字是否为偶数,其语法为if number % 2 == 0。
numbers = [1, 2, 3, 4, 5, 6, 7]
my_list = []
for number in numbers:
if number % 2 == 0:
my_list.append(number * number)
print(my_list)
[4, 16, 36]
列表理解
同样的结果也可以在列表理解版本中实现。我们可以在理解中使用if语句,只有在满足条件的情况下才采取动作。
numbers = [1, 2, 3, 4, 5, 6, 7]
my_list = [number * number for number in numbers if number % 2 == 0]
print(my_list)
[4, 16, 36]
理解性的If Else
在循环过程中,使用if/else结构也很常见,在一个条件下做一个动作,在不同条件下做不同的动作。
for 循环
在这个for循环中,如果数字是偶数,我们将使用if/else来追加这个数字,如果是奇数,则追加这个数字的平方。
numbers = [1, 2, 3, 4, 5, 6, 7]
my_list = []
for number in numbers:
if number % 2 == 0:
my_list.append(number)
else:
my_list.append(number * number)
print(my_list)
[1, 2, 9, 4, 25, 6, 49]
列表理解
在列表理解中,if/else也可以作为一个单行代码使用。
numbers = [1, 2, 3, 4, 5, 6, 7]
my_list = [number if number % 2 == 0 else number * number for number in numbers]
print(my_list)
[1, 2, 9, 4, 25, 6, 49]
所以我们开始看到我们是如何通过简单地使用理解力的语法来有效地利用 Python 中的迭代的。
嵌套的理解力
嵌套for循环在Python中被用来解决各种问题。你也可以使用理解式进行嵌套。
for 循环
首先,我们看一下创建字母和数字对。例如,我们想要像 a1, a2, a3, b1, b2, b3 等这样的东西......用 for 循环来做,看起来像这样。
my_list = []
for letter in 'abc':
for number in range(1, 4):
my_list.append((letter, number))
print(my_list)
[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]
元组理解
现在我们把嵌套for翻译成一行的理解式,结果是一样的。
my_list = [(letter, number) for letter in 'abc' for number in range(1, 4)]
print(my_list)
[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]
理解力词典
除了创建列表之外,我们还可以使用理解式语法创建 Python 字典。
for 循环
我们在Python 提示和技巧教程中了解了 zip() 函数。在这个 for 循环中,我们将使用zip() 函数将一个列表中的值与另一个列表联系起来。这将产生一个使用每个列表的索引值填充的键/值对的字典。
colors = ['Red', 'Green', 'Orange']
veggies = ['Pepper', 'Onion', 'Squash']
my_dict = {}
for color, veggie in zip(colors, veggies):
my_dict[color] = veggie
print(my_dict)
{'Red': 'Pepper', 'Green': 'Onion', 'Orange': 'Squash'}
dict 理解
同样的效果可以用 Python 中的 dictionary comprehension 来创建。
colors = ['Red', 'Green', 'Orange']
veggies = ['Pepper', 'Onion', 'Squash']
my_dict = {color: veggie for color, veggie in zip(colors, veggies)}
print(my_dict)
{'Red': 'Pepper', 'Green': 'Onion', 'Orange': 'Squash'}
带有 If 的 dict 理解
使用条件语句在 dictionary comprehension 中也是可行的。
for 循环
colors = ['Red', 'Green', 'Orange']
veggies = ['Pepper', 'Onion', 'Squash']
my_dict = {}
for color, veggie in zip(colors, veggies):
if color != 'Orange':
my_dict[color] = veggie
print(my_dict)
{'Red': 'Pepper', 'Green': 'Onion'}
带if的字典理解
这里是使用 if 语句的字典理解版本。
colors = ['Red', 'Green', 'Orange']
veggies = ['Pepper', 'Onion', 'Squash']
my_dict = {color: veggie for color, veggie in zip(colors, veggies) if color != 'Orange'}
print(my_dict)
{'Red': 'Pepper', 'Green': 'Onion'}
理解集
Python 中的集合是一个没有重复值的序列。在这里,我们将采用一个有几个重复值的数字列表,并使用 for 循环和集合理解来创建一个集合。
for 循环
numbers = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
my_set = set()
for number in numbers:
my_set.add(number)
print(my_set)
{1, 2, 3, 4, 5}
集合理解
numbers = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
my_set = {number for number in numbers}
print(my_set)
{1, 2, 3, 4, 5}
Python Comprehension 教程总结
理解式是另一个优雅语法的例子,你可以用它来创建有效的Python代码。通过使用理解式,很多时候你可以把以前需要两行、三行、四行或更多的for循环和嵌套for循环的代码减少到一句话。一旦你习惯了它们的语法,理解力也是非常可读的,通常比使用.map()和.filter()函数更好。