日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python小知识:推导式用法大全,Comprehension

發布時間:2024/3/13 python 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python小知识:推导式用法大全,Comprehension 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

推導式」的英文是「Comprehension」,是Python學習者引以為豪的一種寫法。它的主要好處是「寫起來簡潔」,不用for循環,非常的「Pythonic」。

它包括「列表推導式」,「字典推導式」,「集合推導式」,還有「生成器推導式」等。推導過程可以使用「條件推導」,或者在推導表達式中應用「分支語句」,非常靈活。

本文核心內容之前發過,這次作為Python終結者系列重發一次,也做了一些補充。

熟練使用本文中的樣例代碼,就基本全面掌握了推導式的知識。建議把文中代碼多練習幾次。

1 基本推導式

寫一段代碼生成1到100之間的數字的平方的列表,答案是:

14916...

如果你這樣寫,你就不Pythonic了:

nums = [] for i in range(1,101):nums.append(i*i) print(nums)

正確的寫法是使用Python的推導式:

nums = [i*i for i in range(1,101)]

上面的推導式有3個關鍵點:

  • for循環」,其中包含被循環的range對象和代表當前變量的i
  • i * i 是推導「表達式」,表示根據for循環中的i推導出i * i
  • 整個表達式用「方括號」表示推導的結果生成一個列表

2 帶條件的推導式

推導式也可以添加條件,這讓推導式的應用更加廣泛。

生成一個列表,包含1到100之間是3的倍數的數字的平方:

93681...

代碼:

nums = [i*i for i in range(1,101) if i%3==0]

這樣把推導式的3個要素變成了4個:

  • for循環
  • 表達式 i * i
  • 推導套件 if i % 3 == 0
  • 方括號

注意這些要素的順序不能變化

3 在推導表達式中應用分支語句

推導式不光可以用if,還可以用else。

生成一個列表,如果是3的倍數就用平方,否則就用是數字本身:

1294536...

代碼:

nums = [i*i if i%3==0 else i for i in range(1,101)]

注意帶分支的情況下,if…else寫在了for循環的左邊,它的實際過程是:

  • 對整個range進行推導
  • 在推導過程中用if…else決定輸入出什么

這和前面的if推導式是不同的

結合上面的3個例子,來看一下推導式總結:

1.推導式從一個可枚舉數據(列表,元組,集合,字典等)推導出一個列表。也可以推導出生成器,集合或字典。

2.推導式可以加推導條件,只對符合條件的元素推導

3.要推導出的元素使用表達式生成,可以用if else生成不同元素

[表達式 if 表達式條件 else 分支 for i in 序列 if 推導條件]

4 在推導式中使用函數

如果推導條件或者表達式特別復雜怎么辦?可以使用函數。

推導所有1-100之間的所有質數:2,3,5,7…

def is_prime(num):if num == 1:return False for i in range(2,num):if (num % i) == 0:return Falseelse:return Truep_nums = [i for i in range(1,100) if is_prime(i)] print(p_nums)

把推導的條件放在函數中,既可以應對復雜的條件,又可以利用推導式的簡潔寫法。

同理,如果生成推導結果的過程很復雜,也可以把邏輯放到函數中。

推導1900到2021年之間所有的年份,標記出閏年,生成結果:

1900, 1901, 1902, 1903, '閏1904'

代碼:

def is_run(year):if (year % 4) == 0:if (year % 100) == 0:if (year % 400) == 0:return True # 整百年能被400整除的是閏年else:return Falseelse:return True # 非整百年能被4整除的為閏年else:return False ryears = [f'閏{y}' if is_run(y) else y for y in range(1900, 2021)] print(ryears)

5 推導式中嵌套推導式

從2000年到2021年,生成每個月份:‘2000年:1月’, ‘2000年:2月’, ‘2020年:3月’, …, ‘2021年:12月’

monthes = [f'{y}年:{m}月' for y in range(2000, 2022) for m in range(1,13) ]

這里有兩個for循環,類似于:

monthes = [] for y in range(2000, 2022):for m in range(1,13):monthes.append(f'{y}年:{m}月')

是不是下面的特別容易懂?所以兩層的循環不推薦使用推導式,哈哈。

那我為什么還要講?你會碰到有人這么寫,知道它的存在還是有點必要的。

6 推導巨大的列表 - 不要這么干!

推導出1到100億之間的數字的平方,代碼如下:

nums = [i*i for i in range(1,10000000000)]

但是這段代碼很可能會卡死你的電腦,除非你的電腦是超級計算機。因為它要在內存中做100億次計算,然后保存這100億個數字。

正確的做法是使用生成器推導式。

7 生成器推導式

這種情況下,我們應該使用推導生成器,用法很簡單:

  • 把方括號改成圓括號就可以了
nums = (i*i for i in range(1,10000000000)) print(nums) print(next(nums)) print(next(nums)) print(next(nums))

打印出來是一個生成器:

<generator object <genexpr> at 0x7fa0b422feb0> 1 4 9

這是一個生成器,它不會一次性生成100億個數字,只有調用next()的時候,它才會生成一個新的,返回給你。也就是說,同一個時間,只保存一個數字。

生成器的內容請關注本公眾號,下一期的終結者系列:生成器。

8 字典推導式

除了推導列表,生成器,還可以推導字典。

推導字典的方式和推導列表很相似,只不過:

1.使用大括號

2.使用鍵值對

推導一個包含數字和數字平方組成的字典,結果是這樣的:

{1: 1, 2: 4, 3: 9, ..., 100: 10000}

代碼:

nums_dict = {n:n*n for n in range(1,101)} print(nums_dict)

反過來,平方在前面,數字在后面:

nums_dict = {n*n:n for n in range(1,101)} print(nums_dict)

給下面的字典按照分數排序:

{'叔':59, '張三':87, 'FGA':78, '石石':100, '莫名':90}

排序結果:

{'石石': 100, '莫名': 90, '張三': 87, 'FGA': 78, '叔': 59}

代碼:

scores = {'叔':59, '張三':87, 'FGA':78, '石石':100, '莫名':90} sored_scores = {item[0]:item[1] for item in sorted(scores.items(), key=lambda item:item[1], reverse=True)} print(sored_scores)

1.先把字典scores變成一個元組列表:「scores.items()」

2.用sorted函數給元組列表排序:「sorted(scores.items(), key=lambda item:item[1], reverse=True)

3.排序過程用lambda指定使用元組的第二列排序:「key=lambda item:item[1]」。默認是是第一列。

4.指定倒著排序,也就是分數高的在前面:reverse=True

5.使用推導式,把排好序的元組列表,生成一個新的排好序的字典:「{item[0]:item[1] for item in … }

9 集合推導式

推導集合的方式和列表是一樣的,區別在于:

1.使用大括號,類似于推導字典,但它是單個元素,而不是鍵值對。

2.集合會自動過濾掉重復的元素。

下面的名字列表,去掉前后空格后去掉重復的名字:

[ '叔', '張三', ' 麥叔 ', 'FGA ', '張小三', 'FGA', '石石',' 莫名','莫名' ]

推導結果:

{'石石', 'FGA', '張小三', '莫名', '張三', '叔'}

代碼:

names = [ '叔', '張三', ' 麥叔 ', 'FGA ', '張小三', 'FGA', '石石',' 莫名','莫名' ] new_names = {n.strip() for n in names} print(new_names)

推薦閱讀

睡在我上鋪的室友用python,一個月掙了我一學期的生活費

總結

以上是生活随笔為你收集整理的Python小知识:推导式用法大全,Comprehension的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。