Python 炫技操作:推導(dǎo)式的五種寫法
點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,
設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨
作者:寫代碼的明哥
來源:Python編程時(shí)光
推導(dǎo)式(英文名:comprehensions),也叫解析式,是Python的一種獨(dú)有特性。
推導(dǎo)式是可以從一個(gè)數(shù)據(jù)序列構(gòu)建另一個(gè)新的數(shù)據(jù)序列的結(jié)構(gòu)體。
總共有四種推導(dǎo)式:
列表(list)推導(dǎo)式
字典(dict)推導(dǎo)式
集合(set)推導(dǎo)式
生成器推導(dǎo)式
1. 列表推導(dǎo)式
列表推導(dǎo)式的基本格式
new_list?=?[expression?for_loop_expression?if?condition]
舉個(gè)例子。
我想找出一個(gè)數(shù)值列表中為偶數(shù)的元素,并組成新列表,通常不用列表推導(dǎo)式,可以這么寫
old_list?=?[0,1,2,3,4,5]
new_list?=?[]
for?item?in?old_list:
????if?item?%?2?==?0:
????????new_list.append(item)
print(new_list)?#?output:?[0,?2,?4]
一個(gè)簡單的功能,寫的代碼倒是不少。
如果使用了列表推導(dǎo)式,那就簡潔多了,而且代碼還變得更加易讀了。
>>>?old_list?=?[0,1,2,3,4,5]
>>>
>>>?new_list?=?[item?for?item?in?old_list?if?item?%?2?==?0]
>>>?print(new_list)?#?output:?[0,?2,?4]
[0,?2,?4]
2. 字典推導(dǎo)式
字典推導(dǎo)式的基本格式,和 列表推導(dǎo)式相似,只是把 [] 改成了 {},并且組成元素有兩個(gè):key 和 value,要用 key_expr: value_expr 表示。
new_dict?={?key_expr:?value_expr?for_loop_expression?if?condition?}
舉個(gè)例子。
我想從一個(gè)包含所有學(xué)生成績信息的字典中,找出數(shù)學(xué)考滿分的同學(xué)。
old_student_score_info?=?{
????"Jack":?{
????????"chinese":?87,
????????"math":?92,
????????"english":?78
????},
????"Tom":?{
????????"chinese":?92,
????????"math":?100,
????????"english":?89
????}
}
new_student_score_info?=?{name:?scores?for?name,?scores?in?old_student_score_info.items()?if?scores["math"]?==?100}
print(new_student_score_info)
#?output:?{'Tom':?{'chinese':?92,?'math':?100,?'english':?89}}
3. 集合推導(dǎo)式
集合推導(dǎo)式跟列表推導(dǎo)式也是類似的。唯一的區(qū)別在于它使用大括號(hào){},組成元素也只要一個(gè)。
基本格式
new_set?=?{?expr?for_loop_expression?if?condition?}
舉個(gè)例子
我想把一個(gè)數(shù)值列表里的數(shù)進(jìn)行去重處理
>>>?old_list?=?[0,0,0,1,2,3]
>>>
>>>?new_set?=?{item?for?item?in?old_list}
>>>?print(new_set)
{0,?1,?2,?3}
4. 生成器推導(dǎo)式
生成器推導(dǎo)式跟列表推導(dǎo)式,非常的像,只是把 [] 換成了 ()
列表推導(dǎo)式:生成的是新的列表
生成器推導(dǎo)式:生成的是一個(gè)生成器
直接上案例了,找出一個(gè)數(shù)值列表中所有的偶數(shù)
>>>?old_list?=?[0,1,2,3,4,5]
>>>?new_list?=?(item?for?item?in?old_list?if?item?%?2?==?0)
>>>?new_list
?at?0x10292df10>
>>>?next(new_list)
0
>>>?next(new_list)
2
5. 嵌套推導(dǎo)式
for 循環(huán)可以有兩層,甚至更多層,同樣的,上面所有的推導(dǎo)式,其實(shí)都可以寫成嵌套的多層推導(dǎo)式。
但建議最多嵌套兩層,最多的話,代碼就會(huì)變得非常難以理解。
舉個(gè)例子。
我想打印一個(gè)乘法表,使用兩個(gè)for可以這樣寫
for?i?in?range(1,?10):
????for?j?in?range(1,?i+1):
????????print('{}x{}={}\t'.format(j,?i,?i*j),?end='')
????print("")
輸出如下
1x1=1????
1x2=2????2x2=4???
1x3=3????2x3=6???3x3=9???
1x4=4????2x4=8???3x4=12??4x4=16??
1x5=5????2x5=10??3x5=15??4x5=20??5x5=25??
1x6=6????2x6=12??3x6=18??4x6=24??5x6=30??6x6=36??
1x7=7????2x7=14??3x7=21??4x7=28??5x7=35??6x7=42??7x7=49??
1x8=8????2x8=16??3x8=24??4x8=32??5x8=40??6x8=48??7x8=56??8x8=64??
1x9=9????2x9=18??3x9=27??4x9=36??5x9=45??6x9=54??7x9=63??8x9=72??9x9=81
如果使用嵌套的列表推導(dǎo)式,可以這么寫
>>>?print('\n'.join(['?'.join(['%2d?*%2d?=?%2d'?%?(col,?row,?col?*?row)?for?col?in?range(1,?row?+?1)])?for?row?in?range(1,?10)]))
?1?*?1?=??1
?1?*?2?=??2??2?*?2?=??4
?1?*?3?=??3??2?*?3?=??6??3?*?3?=??9
?1?*?4?=??4??2?*?4?=??8??3?*?4?=?12??4?*?4?=?16
?1?*?5?=??5??2?*?5?=?10??3?*?5?=?15??4?*?5?=?20??5?*?5?=?25
?1?*?6?=??6??2?*?6?=?12??3?*?6?=?18??4?*?6?=?24??5?*?6?=?30??6?*?6?=?36
?1?*?7?=??7??2?*?7?=?14??3?*?7?=?21??4?*?7?=?28??5?*?7?=?35??6?*?7?=?42??7?*?7?=?49
?1?*?8?=??8??2?*?8?=?16??3?*?8?=?24??4?*?8?=?32??5?*?8?=?40??6?*?8?=?48??7?*?8?=?56??8?*?8?=?64
?1?*?9?=??9??2?*?9?=?18??3?*?9?=?27??4?*?9?=?36??5?*?9?=?45??6?*?9?=?54??7?*?9?=?63??8?*?9?=?72??9?*?9?=?81
我是岳哥,最后給大家分享我寫的SQL兩件套:《SQL基礎(chǔ)知識(shí)第二版》和《SQL高級(jí)知識(shí)第二版》的PDF電子版。里面有各個(gè)語法的解釋、大量的實(shí)例講解和批注等等,非常通俗易懂,方便大家跟著一起來實(shí)操。
有需要的讀者可以下載學(xué)習(xí),在下面的公眾號(hào)「數(shù)據(jù)前線」(非本號(hào))后臺(tái)回復(fù)關(guān)鍵字:SQL,就行
數(shù)據(jù)前線 ——End——
后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。
推薦閱讀

