乍一看到列表推導式你可能會感到疑惑机断。它們是一種創(chuàng)建和使用列表的簡潔方式楷拳。理解列表推導式是有用的,因為你可能在其他人的代碼里看到列表推導式吏奸。下面來了解下列表推導式吧欢揖。
數(shù)字列表的推導式
回顧上節(jié)知識,我們可以創(chuàng)建一個包含前10個數(shù)字的列表苦丁,如下所示:
# Store the first ten square numbers in a list.
# Make an empty list that will hold our square numbers.
squares = []
# Go through the first ten numbers, square them, and add them to our list.
for number in range(1,11):
? ? new_square = number**2
? ? squares.append(new_square)
# Show that our list is correct.
for square in squares:
? ? print(square)
上述代碼中我們實現(xiàn)了創(chuàng)建包含10個數(shù)字的列表浸颓,對每個數(shù)字作平方操作并將它們存儲進新的數(shù)組的功能。代碼略顯冗長旺拉,我們可以省略for循環(huán)中的new_square參數(shù)产上,簡化代碼。使用列表推導式就可以進一步簡化代碼蛾狗,如下所示:
# Store the first ten square numbers in a list.
squares = [number**2 for number in range(1,11)]
# Show that our list is correct.
for square in squares:
? ? print(square)
平方操作和生成新列表的過程都濃縮進了一行代碼晋涣。你是不是已經(jīng)暈頭轉(zhuǎn)向了,讓我們來看看這行代碼發(fā)生了什么沉桌。
首先我們定義了一個列表谢鹊,名字為?squares?算吩。
接下來看看列表中括號中的代碼:
for number in range(1, 11)
它在1-10之間創(chuàng)建一個循環(huán),把每個數(shù)字存儲到變量?number?中佃扼。接下來我們看一看對每次循環(huán)中的?number?作了哪些操作偎巢。
number**2
每個?number?都作了平方操作,并將結(jié)果存儲在了定義好的隊列中兼耀。我們可以用如下語言來閱讀這行代碼:
squares = [raise?number?to the second power, for each?number?in the range 1-10]压昼、
其他例子
上個例子是對數(shù)字作平方操作,下列代碼是對數(shù)字作乘操作瘤运,仔細閱讀代碼窍霞,體會數(shù)字列表表達式的用法。
# Make an empty list that will hold the even numbers.
evens = []
# Loop through the numbers 1-10, double each one, and add it to our list.
for number in range(1,11):
? ? evens.append(number*2)
# Show that our list is correct:
for even in evens:
? ? print(even)
簡化后代碼如下所示:
# Make a list of the first ten even numbers.
evens = [number*2 for number in range(1,11)]
for even in evens:
? ? print(even)
非數(shù)字列表的推導式
我們也可以在非數(shù)字列表中運用推導式拯坟。在下面的例子中但金,我們會創(chuàng)建一個非數(shù)字列表,然后利用推導式生成一個新的列表郁季。不運用推導式的源代碼如下所示:
# Consider some students.
students = ['bernice', 'aaron', 'cody']
# Let's turn them into great students.
great_students = []
for student in students:
? ? great_students.append(student.title() + " the great!")
# Let's greet each great student.
for great_student in great_students:
? ? print("Hello, " + great_student)
我們想寫下如下所示的推導式:
great_students = [add 'the great' to each?student, for each?student?in the list of students]
代碼如下所示:
# Consider some students.
students = ['bernice', 'aaron', 'cody']
# Let's turn them into great students.
great_students = [student.title() + " the great!" for student in students]
# Let's greet each great student.
for great_student in great_students:
? ? print("Hello, " + great_student)
動手試一試
如果你已經(jīng)理解了列表推導式冷溃,就用推導式解決下列問題。如果沒有巩踏,就使用常規(guī)代碼來做秃诵,當你做的多了,就會對列表推導式有更深刻的理解塞琼。
Multiples of Ten
生成一個包含前10個數(shù)字的10倍大小的數(shù)字列表(10菠净,20,30彪杉,40毅往,50,60派近,70攀唯,80,90渴丸,100)侯嘀,嘗試使用列表推導式。
Cubes
我們已經(jīng)看到如何生成前10個數(shù)字的平方數(shù)列表谱轨。接下來生成它們的立方數(shù)列表吧戒幔!
Awesomeness
生成一個包含5個名字的列表,利用列表表達式生成一個新的列表土童,此列表為每個名字添加了一條 “is awesome” 語句诗茎。
Working Backwards
在不使用列表推導式的前提下,寫出下列偽代碼對應(yīng)的代碼献汗。?plus_thirteen = [number + 13 for number in range(1,11)]
# Ex : Multiples of Ten
# put your code here
# Ex : Cubes
# put your code here
# Ex : Awesomeness
# put your code here
# Ex : Working Backwards
# put your code here