1. 程式人生 > 程式設計 >python列表推導式入門學習解析

python列表推導式入門學習解析

這篇文章主要介紹了python列表推導式入門學習解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

一.什麼是推導式

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

報錯

二.條件推導式

1.語法

'''
value1:如果條件表示式condition成立,返回value1 ; 如果條件表示式不成立,返回value2 ;
condition:條件表示式
Value2:如果條件表示式condition成立,返回value1 ; 如果條件表示式不成立,返回value2 ;
'''
value1 if condition else Value2

2.實戰練習

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

# !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是奇數")

輸出結果:

新手說:x是偶數

老司機說:x是奇數

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

三.列表推導式

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

1.語法

'''
語法一:
  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.因為是獲取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))

輸出結果:

[0,20,40,60,80,100,120,140,160,180,200]
<class 'list'>

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

'''
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))

輸出結果:

[0,300,500,700,900,1100,1300,1500,1700,1900,200]
<class 'list'>

3.效率對比

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

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

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

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))

輸出結果:

使用列表推導式耗時:0.5455152988433838秒

使用普通for迴圈耗時:1.2068836688995361秒

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

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

四.重點總結

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。