python列表推導式(16)

截止到目前爲止,python基礎內容已經學習了50%左右,在學習編程過程中,我們不僅要學習python語法,同時也需要學習如何把自己代碼寫的更美觀,效率更高。

 

一.什麼是推導式

推導式是從一個或者多個迭代器快速簡潔地創建數據類型的一種方法,它將循環和條件判斷結合,從而避免語法冗長的代碼,提高代碼運行效率能熟練使用推導式也可以間接說明你已經超越了python初學者的水平。

報錯

 

二.條件推導式

1.語法


1

2

3

4

5

6

7

8

'''

value1:如果條件表達式condition成立,返回value1 ; 如果條件表達式不成立,返回value2 ;

condition:條件表達式

Value2:如果條件表達式condition成立,返回value1 ; 如果條件表達式不成立,返回value2 ;

 

'''

 

value1 if condition else Value2

 

2.實戰練習

假如有這樣一個需要:判斷一個數字是奇數還是偶數?

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

# !usr/bin/env python

# -*- coding:utf-8 _*-

"""

@Author:何以解憂

@Blog(個人博客地址): shuopython.com

@WeChat Official Account(微信公衆號):猿說python

@Github:www.github.com

 

@File:python_list.py

@Time:2019/9/30 20:45

 

@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!

"""

 

 

# 新手代碼

x = 10

if x%2 == 0:

    print("新手說:x是偶數")

else:

    print("新手說:x是奇數")

 

# 老司機

x = 15

print("老司機說:x是偶數") if x%2 == 0 else print("老司機說:x是奇數")

輸出結果:

1

2

新手說:x是偶數

老司機說:x是奇數

觀察上面代碼可以看出來,選手一(新手)一共佔用了5行代碼,而選手二(老司機)完成同樣一個功能僅僅只需要兩行,這就是性價比,往往這就是職場上鑑別工作能力/升職加薪的細節。

 

三.列表推導式

列表推導式是條件推導式和循環一起配合使用,並返回一個列表,並且整個表達式需要在[]內,因爲返回值也是列表。

1.語法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

'''

語法一:

    exp1:在for循環中,如果x的值滿足條件表達式condition(即條件表達式成立),返回exp1;條件表達式不成立則不返回

    x:for循環中變量

    data:一個序列(比如:列表/元組/字符串等)

    condition:條件表達式

'''

 

[exp1 for x in data if condition]

 

'''

語法二:

    exp1:在for循環中,如果x的值滿足條件表達式condition(即條件表達式成立),返回exp1;條件表達式不成立則返回exp2

    condition:條件表達式

    exp2:在for循環中,如果x的值滿足條件表達式condition(即條件表達式成立),返回exp1;條件表達式不成立則返回exp2

    x:for循環中變量

    data:個序列(比如:列表/元組/字符串等)

    

'''

 

[exp1 if condition else exp2 for x in data]

 

2.實戰練習

需求一:獲取0~20的所有偶數並且乘以10,並返回所有計算之後的結果。示例代碼如下:(使用列表推導式語法一實現)

1

2

3

4

5

6

7

8

9

10

'''

1.因爲是獲取0~20,包括20,所以使用range(0,21)

2.x*10 等價 語法一中的exp1

3.x%2 == 0 等價 語法一中的條件表達式condition

4.range(0,21) 等價 語法一中的data(序列)

'''

 

list1 = [x*10 for x in range(0,21) if x%2 == 0]

print(list1)

print(type(list1))

輸出結果:

1

2

[0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200]

<class 'list'>

 

需求二:將0~20的偶數乘以10,奇數乘以100,並返回所有計算之後的結果。示例代碼如下:(使用列表推導式語法二實現)

1

2

3

4

5

6

7

8

9

10

11

'''

1.因爲是獲取0~20,包括20,所以使用range(0,21)

2.x*10 等價 語法二中的exp1

3.x*100 等價 語法二中的exp2

4.x%2 == 0 等價 語法二中的條件表達式condition

5.range(0,21) 等價 語法一中的data(序列)

'''

 

list2 = [x*10 if x%2 == 0 else x*100 for x in range(0,21) ]

print(list2)

print(type(list2))

輸出結果:

1

2

[0, 100, 20, 300, 40, 500, 60, 700, 80, 900, 100, 1100, 120, 1300, 140, 1500, 160, 1700, 180, 1900, 200]

<class 'list'>

 

3.效率對比

可能有童鞋納悶,我明明for循環就能實現的功能,爲毛要用這鳥玩意推導式?

使用列表推導式的效率遠遠高於for循環,可能執行一句print(“helloworld”)對於cpu而已只需要0.0002秒,你可能感覺不到差距,如果需要輸出一億次helloworld呢?往往細節覺得成敗!

假如有一個需求:將0~10000000(一億)以內的所有整數存到列表中,對比一下列表推導式和for循環耗時情況:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import time # 添加time模塊,用於統計代碼運行時間

 

#一共添加10000000次數據到列表中

total_num = 10000000

 

#使用列表推導式

start_time = time.time()

list1 = [x for x in range(0,total_num)] # 列表推導式

end_time = time.time()

print("使用列表推導式耗時:{}秒".format(end_time-start_time))

 

#使用普通for循環

start_time = time.time()

list2 = list()

for x in range(0,total_num): # for循環

    list2.append(x)

end_time = time.time()

print("使用普通for循環耗時:{}秒".format(end_time-start_time))

輸出結果:

1

2

使用列表推導式耗時:0.5455152988433838

使用普通for循環耗時:1.2068836688995361

輸出結果很明顯,實現通用的功能,列表推導式的效率整整高出普通for循環一倍。

崩潰

 

最後溫馨提醒:測試請把循環次數改小一點,畢竟剛開始不小心多加了幾圈圈,電腦死機了!

 

四.重點總結

1.注意在列表推導式書寫的時候,所有表達式都必須在[]內部,因爲返回值是列表list

2.列表推導式是python開發學習的知識點,多多聯繫,熟能生巧.

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章