欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python之列表推導(dǎo)式最全匯總(下篇)

 更新時(shí)間:2023年01月12日 14:40:34   作者:Hann?Yang  
這篇文章主要介紹了Python之列表推導(dǎo)式最全匯總(下篇),本文章內(nèi)容詳細(xì),通過(guò)案例可以更好的理解列表推導(dǎo)式的相關(guān)知識(shí),本模塊分為了三部分,本次為下篇,需要的朋友可以參考下

前言 

網(wǎng)傳的七天學(xué)Python的路線(xiàn)如下,我覺(jué)得可以在學(xué)過(guò)此表中前幾天的內(nèi)容后,就可以回頭來(lái)學(xué)習(xí)一下

列表推導(dǎo)式:它綜合了列表、for循環(huán)和條件語(yǔ)句。

第一天:基本概念(4小時(shí)) : print,變量,輸入,條件語(yǔ)句。

第二天:基本概念(5小時(shí)) :列表,for循環(huán),while循環(huán),函數(shù),導(dǎo)入模塊。

第三天:簡(jiǎn)單編程問(wèn)題(5小時(shí)) :交換兩個(gè)變量值,將攝氏度轉(zhuǎn)換為華氏溫度,求數(shù)字中各位數(shù)之和, 判斷某數(shù)是否為素?cái)?shù), 生成隨機(jī)數(shù),刪除列表中的重復(fù)項(xiàng)等等。

第四天:中級(jí)編程問(wèn)題(6小時(shí)) :反轉(zhuǎn)-個(gè)字符串(回文檢測(cè)),計(jì)算最大公約數(shù),合并兩個(gè)有序數(shù)組,猜數(shù)字游戲,計(jì)算年齡等等。

第五天:數(shù)據(jù)結(jié)構(gòu)(6小時(shí)) :棧,隊(duì)列,字典,元組,樹(shù),鏈表。

第六天:面向?qū)ο缶幊?OOP) (6小時(shí)) :對(duì)象,類(lèi),方法和構(gòu)造函數(shù),面向?qū)ο缶幊讨^承。

第七天:算法(6小時(shí)) :搜索(線(xiàn)性和二分查找)、 排序(冒泡排序、 選擇排序)、遞歸函數(shù)(階乘、斐波那契數(shù)列)時(shí)間復(fù)雜度(線(xiàn)性、二次和常量)。

列表推導(dǎo)式

  • list comprehension或譯為列表解析式,是一種創(chuàng)建列表的簡(jiǎn)潔語(yǔ)法;
  • 也可認(rèn)為它是一個(gè)簡(jiǎn)版的for循環(huán),但執(zhí)行效率高于for循環(huán)。
  • python 2.7+ 開(kāi)始又引入了集合推導(dǎo)式、字典推導(dǎo)式,原理與列表推導(dǎo)式相近。

語(yǔ)法規(guī)范:

out_list = [out_express for out_express in input_list if out_express_condition]

其中,

  • if 條件可有可無(wú);
  • for 循環(huán)可以嵌套多層,內(nèi)外層循環(huán)的變量不可以同名;
  • 推導(dǎo)式中也可以嵌套推導(dǎo)式,內(nèi)外層推導(dǎo)式的變量互不影響,可以同名;
  • 推導(dǎo)表達(dá)式out_express盡可能用內(nèi)置函數(shù),省得import或def function()。

進(jìn)階實(shí)例

乘法口訣表

>>> lst=['%sx%s=%s'%(j,i,i*j) for i in range(1,10) for j in range(1,i+1)]
>>> lst
['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']

列印時(shí),要注意它的項(xiàng)數(shù)通項(xiàng)公式是: An=n(n+1)/2+1

>>> 
for i in range(9):
    for j in range(i+1):
	    print(lst[i*(i+1)//2+j],end='\t' if i!=j else '\n')
 
	    
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
>>> 

 或者用join()直接把 \t \n 插入列表拼接成字符串,然后輸出:

>>> print('\n'.join(['\t'.join([f'{j}x{i}={i*j}' for j in range(1,i+1)]) for i in range(1,10)]))
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
>>> 
>>> # f'{j}x{i}={i*j}'  等價(jià)于 '%sx%s=%s'%(j,i,i*j)

求100以?xún)?nèi)的質(zhì)數(shù)(或稱(chēng)素?cái)?shù))

>>> [k[0] for k in [(j,sum([j%i==0 for i in range(2,j)])) for j in range(2,100)] if k[1]==0]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>> 
>>> # 等價(jià)于:
>>> [k[0] for k in [(j,sum([0 if j%i else 1 for i in range(2,j)])) for j in range(2,100)] if k[1]==0]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>>

上面兩種方法都是累加sum布爾值bool的個(gè)數(shù)來(lái)計(jì)算的,可以用any() all()函數(shù)代替:

>>> [k[0] for k in [(j,[j%i==0 for i in range(2,j)]) for j in range(2,100)] if not any(k[1])]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>>
>>> # 等價(jià)于:
>>> [k[0] for k in [(j,[j%i!=0 for i in range(2,j)]) for j in range(2,100)] if all(k[1])]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>>

使用filter()和map()函數(shù): 

[i for i in filter(lambda x:all(map(lambda p:x%p,range(2,x))), range(2,100))]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>>

條件反過(guò)來(lái)就是100以?xún)?nèi)的合數(shù):

>>> [k[0] for k in [(j,[j%i==0 for i in range(2,j)]) for j in range(2,100)] if any(k[1])]
[4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35,
 36, 38, 39, 40, 42, 44, 45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 60, 62, 63, 64,
 65, 66, 68, 69, 70, 72, 74, 75, 76, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 90, 91, 92,
 93, 94, 95, 96, 98, 99]
>>> [k[0] for k in [(j,[j%i!=0 for i in range(2,j)]) for j in range(2,100)] if not all(k[1])]
[4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35,
 36, 38, 39, 40, 42, 44, 45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 60, 62, 63, 64,
 65, 66, 68, 69, 70, 72, 74, 75, 76, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 90, 91, 92,
 93, 94, 95, 96, 98, 99]
>>> [i for i in filter(lambda x:not all(map(lambda p:x%p,range(2,x))), range(2,100))]
[4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35,
 36, 38, 39, 40, 42, 44, 45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 60, 62, 63, 64,
 65, 66, 68, 69, 70, 72, 74, 75, 76, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 90, 91, 92,
 93, 94, 95, 96, 98, 99]
>>>

求1000以?xún)?nèi)的質(zhì)回文數(shù)(即是質(zhì)數(shù)又是回文數(shù))

>>> Pr=[str(k[0]) for k in [(j,[j%i!=0 for i in range(2,j)]) for j in range(2,1000)] if all(k[1])]
>>> [int(p) for p in Pr if p[::-1] in Pr]
[2, 3, 5, 7, 11, 101, 131, 151, 181, 191, 313, 353, 373, 383, 727, 757, 787, 797, 919, 929]

求1000以?xún)?nèi)的數(shù),滿(mǎn)足本身和它的回文數(shù)同是質(zhì)數(shù)

>>> pstr=[str(k[0]) for k in [(j,[j%i!=0 for i in range(2,j)]) for j in range(2,1000)] if all(k[1])]
>>> [int(p) for p in pstr if p[::-1] in pstr]
[2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97, 101, 107, 113, 131, 149, 151, 157, 167, 
179, 181, 191, 199, 311, 313, 337, 347, 353, 359, 373, 383, 389, 701, 709, 727, 733, 739, 
743, 751, 757, 761, 769, 787, 797, 907, 919, 929, 937, 941, 953, 967, 971, 983, 991]
>>>

分解質(zhì)因數(shù)(N<2022) 

>>> P = [k[0] for k in [(j,sum([j%i==0 for i in range(2,j)])) for j in range(2,2022)] if k[1]==0]
>>>
def func(n):
    res=[]
    t=P[::-1]
    m=t[-1]
    while n>=m:
        if n%m==0:
            n//=m
            res.append(m)
        else:
            t.pop()
            m=t[-1]
    return res
 
>>> i = 2021
>>> print(i,'=','x'.join([str(j) for j in func(i)]))
2021 = 43x47
>>> 
>>> func(2000)
[2, 2, 2, 2, 5, 5, 5]
>>> func(3999)
[3, 31, 43]
>>> 

 求出字符串的所有字串(可推廣到所有可切片數(shù)據(jù)類(lèi)型)

>>> L='abcd'
>>> [L[i:j] for i in range(len(L)) for j in range(i+1,len(L)+1)]
['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']
>>>

注:凡是可以用[i:j]來(lái)切片的“容器類(lèi)數(shù)據(jù)類(lèi)型都可用此推導(dǎo)式。

如:

>>> L=[1,2,3,4]
>>> [L[i:j] for i in range(len(L)) for j in range(i+1,len(L)+1)]
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
>>>

(1)找出字符串s='aaabcddcbddba'中最長(zhǎng)的回文字串

>>> s='aaabcddcbddba'
>>> {s[i:j] for i in range(len(s)) for j in range(i+1,len(s)+1)}
{'bcddcbdd', 'ddcbddb', 'abcddcbdd', 'aabcddc', 'aabcddcbdd', 'cbddba', 'aaa',
 'cddcbd', 'cbddb', 'a', 'cdd', 'bcdd', 'aabcddcbddba', 'aabcd', 'abcddcbddb',
 'aaabc', 'ab', 'cbdd', 'cddcbdd', 'aaabcddcb', 'aabcddcbd', 'aaabcdd', 'ba',
 'ddcbddba', 'dba', 'db', 'cddcbddba', 'cbd', 'aaabcddcbddb', 'aaabcd', 'ddb',
 'dcbdd', 'abcddc', 'abcd', 'abcdd', 'bcddcb', 'aaabcddcbdd', 'abcddcbddba',
 'aabc', 'bcddc', 'bdd', 'cb', 'bcddcbddba', 'c', 'dcbddb', 'ddba', 'dcbd',
 'b', 'aaab', 'dd', 'd', 'ddcbd', 'bcd', 'aa', 'abcddcbd', 'bcddcbddb',
 'aaabcddcbd', 'cddc', 'ddcb', 'dc', 'abc', 'bddb', 'ddc', 'bcddcbd', 'bc',
 'aabcdd', 'aab', 'aaabcddcbddba', 'cddcb', 'abcddcb', 'cd', 'bddba', 'aabcddcbddb',
 'bd', 'ddcbdd', 'aaabcddc', 'dcb', 'dcbddba', 'aabcddcb', 'cddcbddb'}
>>> # 使用字典推導(dǎo)式可去掉相同子串
>>>
>>> [i for i in {s[i:j] for i in range(len(s)) for j in range(i+1,len(s)+1)} if i==i[::-1]]
['aaa', 'a', 'bcddcb', 'c', 'b', 'dd', 'd', 'aa', 'cddc', 'bddb']
>>> 
>>> [(len(i),i) for i in {i for i in [s[i:j] for i in range(len(s)) for j in range(i+1,len(s)+1)} if i==i[::-1]]]
[(3, 'aaa'), (1, 'a'), (6, 'bcddcb'), (1, 'c'), (1, 'b'), (2, 'dd'), (1, 'd'),
 (2, 'aa'), (4, 'cddc'), (4, 'bddb')]
>>> 
>>> max([(len(i),i) for i in [i for i in {s[i:j] for i in range(len(s)) for j in range(i+1,len(s)+1)} if i==i[::-1]]])[1]
'bcddcb'
>>>

 (2)給定 L=[2, -3, 3, 50, 5, 0, -1],輸出其子序列中各元素合計(jì)數(shù)最大的子序列

>>> L = [2, -3, 3, 50, 5, 0, -1]
>>> [L[i:j] for i in range(len(L)) for j in range(i+1,len(L)+1)]
[[2], [2, -3], [2, -3, 3], [2, -3, 3, 50], [2, -3, 3, 50, 5], [2, -3, 3, 50, 5, 0],
 [2, -3, 3, 50, 5, 0, -1], [-3], [-3, 3], [-3, 3, 50], [-3, 3, 50, 5], [-3, 3, 50, 5, 0],
 [-3, 3, 50, 5, 0, -1], [3], [3, 50], [3, 50, 5], [3, 50, 5, 0], [3, 50, 5, 0, -1], [50],
 [50, 5], [50, 5, 0], [50, 5, 0, -1], [5], [5, 0], [5, 0, -1], [0], [0, -1], [-1]]
>>> [sum(j) for j in [L[j:i] for i in range(len(L),0,-1) for j in range(len(L))]]
[56, 54, 57, 54, 4, -1, -1, 57, 55, 58, 55, 5, 0, 0, 57, 55, 58, 55, 5, 0, 0, 52, 50, 53,
 50, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, -1, -3, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0]
>>> # 合并為一行代碼:
>>> max(sum(j) for j in [L[j:i] for i in range(len(L),0,-1) for j in range(len(L))])
58
>>> 
>>> # 和最大的子序列為:
>>> l = [L[i:j] for i in range(len(L)) for j in range(i+1,len(L)+1)]
>>> m = max(sum(j) for j in [L[j:i] for i in range(len(L),0,-1) for j in range(len(L))])
>>> [i for i in l if sum(i)==m]
[[3, 50, 5], [3, 50, 5, 0]]
>>>

根據(jù)方程式畫(huà)出字符圖

略:見(jiàn)相關(guān)文章《探究“一行代碼畫(huà)愛(ài)心”的秘密,去向心愛(ài)的人表白吧》

EXCEL表格列號(hào)字串轉(zhuǎn)整數(shù)

>>> ExcelCol2Int = lambda s:sum([(ord(n)-64)*26**i for i,n in enumerate(list(s)[::-1])])
>>> ExcelCol2Int('A')
1
>>> ExcelCol2Int('AA')
27
>>> ExcelCol2Int('AX')
50
>>> ExcelCol2Int('CV')
100
>>> ExcelCol2Int('AAA')
703
>>> ExcelCol2Int('XFD')
16384
>>>

 打印Gray格雷碼序列

什么是格雷碼,什么是卡諾圖?不懂的問(wèn)度娘吧

Gray = lambda n:[(i>>1)^i for i in range(2**n)]
GrayB = lambda n:[bin((i>>1)^i)[2:].rjust(n,'0') for i in range(2**n)]
 
'''
Gray(0)
[0]
Gray(1)
[0, 1]
Gray(2)
[0, 1, 3, 2]
Gray(3)
[0, 1, 3, 2, 6, 7, 5, 4]
Gray(4)
[0, 1, 3, 2, 6, 7, 5, 4, 12, 13, 15, 14, 10, 11, 9, 8]
>>> GrayB(3)    # 把輸出排成矩陣,即三變量卡諾圖
['000', '001', '011', '010',
 '110', '111', '101', '100']
>>> GrayB(4)    # 把輸出排成方陣,即四變量卡諾圖
['0000', '0001', '0011', '0010',
 '0110', '0111', '0101', '0100',
 '1100', '1101', '1111', '1110',
 '1010', '1011', '1001', '1000']
'''

注:上面代碼中的 (i>>1)^i 可以寫(xiě)成: i^i>>1 或 i^i//2,因?yàn)橛乙苹蛘倪\(yùn)算級(jí)別都比異或要高。驗(yàn)證代碼如下:

>>> any([(i>>1)^i == i^i>>1 == i^i//2 for i in range(323)])
True
>>>

 另外,觀察到Gray()輸出的整數(shù)序列的規(guī)律,就想到用迭代法也能實(shí)現(xiàn),并且只要2行代碼:

# 用迭代法實(shí)現(xiàn):
def iGray(n):
	if n==0: return [0]
	return iGray(n-1)+[i+2**(n-1) for i in iGray(n-1)[::-1]]

高階實(shí)例

楊輝三角形

方法一:公式遞推

>>> def func(i):
	t=L=[1]
	while(i>1):
		i-=1
		t=L+[t[n]+t[n+1] for n in range(len(t)-1)]+L
	return t
 
>>> func(1)
[1]
>>> func(3)
[1, 2, 1]
>>> func(8)
[1, 7, 21, 35, 35, 21, 7, 1]
>>>
>>> for i in range(1,10):print(func(i))
 
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
>>>

方法二:組合公式的自定義函數(shù)

>>> def Combin(n,i):
    m,t=min(i,n-i),1
    for j in range(0,m):
        t*=(n-j)/(m-j)
    return t
 
>>> [Combin(8,i) for i in range(9)]
[1, 8.0, 28.0, 55.99999999999999, 70.0, 55.99999999999999, 28.0, 8.0, 1]
>>> [round(Combin(8,i)) for i in range(9)]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
>>> [[round(Combin(j,i)) for i in range(j+1)] for j in range(10)]
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1],
 [1, 6, 15, 20, 15, 6, 1], [1, 7, 21, 35, 35, 21, 7, 1], [1, 8, 28, 56, 70, 56,
 28, 8, 1], [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]]
>>>

根據(jù)組合公式用階乘來(lái)計(jì)算:
C(m,n)=math.factorial(n)//(math.factorial(m)*math.factorial(n-m))  

遞歸法,雖然沒(méi)有小數(shù)精度的問(wèn)題,但也有遞歸次數(shù)不能太大即n值有限制的缺點(diǎn): 

>>> def Comb(n,i):
    if i in [0,n]:
        return 1
    elif i==1:
        return n
    else:
        return Comb(n-1,i-1)+Comb(n-1,i)
 
>>> [Comb(8,i) for i in range(9)]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
>>> print('\n'.join(['\t'.join([str(Comb(j,i)) for i in range(j+1)]) for j in range(10)]))
1
1	1
1	2	1
1	3	3	1
1	4	6	4	1
1	5	10	10	5	1
1	6	15	20	15	6	1
1	7	21	35	35	21	7	1
1	8	28	56	70	56	28	8	1
1	9	36	84	126	126	84	36	9	1
>>>

方法三:使用現(xiàn)成的庫(kù)函數(shù)

(1). itertools庫(kù)combinations函數(shù)

>>> from itertools import combinations as comb
>>> [[len(list(comb(range(j),i))) for i in range(j+1)] for j in range(10)]
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1],
 [1, 6, 15, 20, 15, 6, 1], [1, 7, 21, 35, 35, 21, 7, 1], [1, 8, 28, 56, 70, 56,
 28, 8, 1], [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]]
>>> print('\n'.join(['\t'.join([str(len(list(comb(range(j),i)))) for i in range(j+1)]) for j in range(10)]))
1
1	1
1	2	1
1	3	3	1
1	4	6	4	1
1	5	10	10	5	1
1	6	15	20	15	6	1
1	7	21	35	35	21	7	1
1	8	28	56	70	56	28	8	1
1	9	36	84	126	126	84	36	9	1
>>>

(2). scipy庫(kù)comb函數(shù)

>>> from scipy.special import comb
>>> [[round(comb(j,i)) for i in range(j+1)] for j in range(10)]
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1],
 [1, 6, 15, 20, 15, 6, 1], [1, 7, 21, 35, 35, 21, 7, 1], [1, 8, 28, 56, 70, 56,
 28, 8, 1], [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]]
>>> print('\n'.join(['\t'.join([str(round(comb(j,i))) for i in range(j+1)]) for j in range(10)]))
1
1	1
1	2	1
1	3	3	1
1	4	6	4	1
1	5	10	10	5	1
1	6	15	20	15	6	1
1	7	21	35	35	21	7	1
1	8	28	56	70	56	28	8	1
1	9	36	84	126	126	84	36	9	1
>>>

 斐波那契數(shù)列

(1). 引入自定義函數(shù)或lambda表達(dá)式:

>>> f=lambda n:n<3 and 1 or f(n-1)+f(n-2)
>>> [f(i) for i in range(1,30)]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181,
 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229]
>>>

注:這個(gè)lambda函數(shù)用了遞歸法,在項(xiàng)數(shù)大于40后速度超慢。

另:類(lèi)似【n<3 and 1 or 2】這種表達(dá)式中,邏輯與、或有這樣的特性:
  and 兩邊都對(duì)取后面一個(gè)表達(dá)式, or 兩邊都對(duì)取前面一個(gè)表達(dá)式。

>>> n=5
>>> 1 and n
5
>>> n and 1
1
>>> 0 and n
0
>>> n and 0
0
>>> 1 or n
1
>>> n or 1
5
>>> 0 or n
5
>>> n or 0
5
>>>

(2). 引入臨時(shí)推導(dǎo)表達(dá)式:

>>> N=50 # 項(xiàng)數(shù)=50
>>> f=[1,1]
>>> [f.append(f[n-2]+f[n-1]) for n in range(2,N)]
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 
None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 
None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 
None, None, None]
>>> f
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 
10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 
2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 
165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 
7778742049, 12586269025]
>>> ###合成一行,臨時(shí)變量接收[None]*n列表###
>>> f=[1,1];t=[f.append(f[n-2]+f[n-1]) for n in range(2,N)]
>>> f
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 
10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 
2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 
165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 
7778742049, 12586269025]
>>>

真的一行代碼:

>>> N=50 # 項(xiàng)數(shù)=50
>>> t=[(f[n][0], f.append((f[n][1],f[n][0]+f[n][1]))) for f in ([[1,1]],) for n in range(N)]
>>> t
[(1, None), (1, None), (2, None), (3, None), (5, None), (8, None), (13, None), (21, None), 
(34, None), (55, None), (89, None), (144, None), (233, None), (377, None), (610, None), 
(987, None), (1597, None), (2584, None), (4181, None), (6765, None), (10946, None), (17711, 
None), (28657, None), (46368, None), (75025, None), (121393, None), (196418, None), 
(317811, None), (514229, None), (832040, None), (1346269, None), (2178309, None), (3524578, 
None), (5702887, None), (9227465, None), (14930352, None), (24157817, None), (39088169, 
None), (63245986, None), (102334155, None), (165580141, None), (267914296, None), 
(433494437, None), (701408733, None), (1134903170, None), (1836311903, None), (2971215073, 
None), (4807526976, None), (7778742049, None), (12586269025, None)]
>>> [f[0] for f in t]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 
10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 
2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 
165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 
7778742049, 12586269025]
>>> ###合并成一行###
>>> [f[0] for f in [(f[n][0], f.append((f[n][1],f[n][0]+f[n][1]))) for f in ([[1,1]],) for n in range(N)]]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 
10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 
2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 
165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 
7778742049, 12586269025]
>>>

 曼德勃羅集(Mandelbrot Set)分形

>>> print('\n'.join([''.join(['*'if abs((lambda a:lambda z,c,n:a(a,z,c,n))(lambda s,z,c,n:s(s,z*z+c,c,n-1) if n else z)(0,0.02*x+0.05j*y,40))<2 else ' ' for x in range(-78,20)]) for y in range(-20,21)]))
                                                                              *                   
                                                                                                  
                                                                                                  
                                                                        **                        
                                                                   ***********                    
                                                                  ************                    
                                                                    *********                     
                                                          *    * ************  * *                
                                                  ****** * *************************** *          
                                                  *************************************** *****   
                                                   *******************************************    
                                             *** ******************************************** *   
                                              **************************************************  
                                           *******************************************************
                    *        *              ***************************************************** 
                   **** ******* *          *******************************************************
                    *****************     ******************************************************* 
                 *********************** *********************************************************
                 *********************** ******************************************************** 
           **** ********************************************************************************  
*******************************************************************************************       
           **** ********************************************************************************  
                 *********************** ******************************************************** 
                 *********************** *********************************************************
                    *****************     ******************************************************* 
                   **** ******* *          *******************************************************
                    *        *              ***************************************************** 
                                           *******************************************************
                                              **************************************************  
                                             *** ******************************************** *   
                                                   *******************************************    
                                                  *************************************** *****   
                                                  ****** * *************************** *          
                                                          *    * ************  * *                
                                                                    *********                     
                                                                  ************                    
                                                                   ***********                    
                                                                        **                        
                                                                                                  
                                                                                                  
                                                                              *                   
>>>

附錄

到此這篇關(guān)于Python之列表推導(dǎo)式最全匯總(下篇)的文章就介紹到這了,關(guān)于Python之列表推導(dǎo)式最全匯總的所有內(nèi)容也全部結(jié)束了,其他兩個(gè)部分的內(nèi)容(上、中篇)請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 導(dǎo)入數(shù)據(jù)及作圖的實(shí)現(xiàn)

    python 導(dǎo)入數(shù)據(jù)及作圖的實(shí)現(xiàn)

    今天小編就為大家分享一篇python 導(dǎo)入數(shù)據(jù)及作圖的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python+Turtle實(shí)現(xiàn)繪制可愛(ài)的小倉(cāng)鼠

    Python+Turtle實(shí)現(xiàn)繪制可愛(ài)的小倉(cāng)鼠

    肉嘟嘟的小動(dòng)物很是可愛(ài),這篇文章主要為大家介紹一下如何運(yùn)用Python中的turtle庫(kù)控制函數(shù)繪制小倉(cāng)鼠,文中的實(shí)現(xiàn)方法講解詳細(xì),感興趣的可以嘗試一下
    2022-10-10
  • Python入門(mén)教程(三十四)Python的文件處理

    Python入門(mén)教程(三十四)Python的文件處理

    這篇文章主要介紹了Python入門(mén)教程(三十四)Python的文件處理,在Python中處理文件的主要是open()函數(shù),接下來(lái)我們就來(lái)一起看看open()函數(shù)的用法吧,需要的朋友可以參考下
    2023-05-05
  • Python unittest單元測(cè)試openpyxl實(shí)現(xiàn)過(guò)程解析

    Python unittest單元測(cè)試openpyxl實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Python unittest單元測(cè)試openpyxl實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python利用3D引擎制作一個(gè)3D迷宮游戲

    Python利用3D引擎制作一個(gè)3D迷宮游戲

    Python有一個(gè)不錯(cuò)的3D引擎——Ursina。本文就來(lái)利用Ursina這一引擎制作一個(gè)簡(jiǎn)單的3D迷宮游戲,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-01-01
  • python實(shí)現(xiàn)逆序輸出一個(gè)數(shù)字的示例講解

    python實(shí)現(xiàn)逆序輸出一個(gè)數(shù)字的示例講解

    今天小編就為大家分享一篇python實(shí)現(xiàn)逆序輸出一個(gè)數(shù)字的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 一文實(shí)現(xiàn)刪除numpy數(shù)組中的指定索引元素

    一文實(shí)現(xiàn)刪除numpy數(shù)組中的指定索引元素

    在Python中,Numpy是一個(gè)強(qiáng)大的數(shù)學(xué)庫(kù),用于處理大型多維數(shù)組和矩陣的數(shù)學(xué)運(yùn)算,數(shù)組是由相同類(lèi)型的數(shù)據(jù)元素組成的集合,并且每個(gè)元素都可以通過(guò)索引進(jìn)行訪(fǎng)問(wèn),本文將給大家介紹如何刪除numpy數(shù)組中的指定索引元素,需要的朋友可以參考下
    2024-05-05
  • python3中替換python2中cmp函數(shù)的實(shí)現(xiàn)

    python3中替換python2中cmp函數(shù)的實(shí)現(xiàn)

    這篇文章主要介紹了python3替換python2中cmp函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 分享一個(gè)pycharm專(zhuān)業(yè)版安裝的永久使用方法

    分享一個(gè)pycharm專(zhuān)業(yè)版安裝的永久使用方法

    這篇文章主要介紹了分享一個(gè)pycharm專(zhuān)業(yè)版安裝的永久使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • keras獲得某一層或者某層權(quán)重的輸出實(shí)例

    keras獲得某一層或者某層權(quán)重的輸出實(shí)例

    今天小編就為大家分享一篇keras獲得某一層或者某層權(quán)重的輸出實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01

最新評(píng)論