【Python实践】Python部分实际案例解答1
🌈據(jù)說(shuō),看我文章時(shí) 關(guān)注、點(diǎn)贊、收藏 的 帥哥美女們 心情都會(huì)不自覺(jué)的好起來(lái)。
前言:
🧡作者簡(jiǎn)介:大家好我是 user_from_future ,意思是 “ 來(lái)自未來(lái)的用戶 ” ,寓意著未來(lái)的自己一定很棒~(yú)
?個(gè)人主頁(yè):點(diǎn)我直達(dá),在這里肯定能找到你想要的~
👍專(zhuān)欄介紹:Python實(shí)踐 ,一個(gè)專(zhuān)注于分享實(shí)際案例的專(zhuān)欄~
專(zhuān)欄文章直鏈:
【Python實(shí)踐】關(guān)于python多任務(wù)設(shè)計(jì)基礎(chǔ)
【Python實(shí)踐】你可能沒(méi)有見(jiàn)過(guò)的碼代碼小技巧1
史上最最最沒(méi)用程序——自寫(xiě)平衡化學(xué)方程式
Python進(jìn)階——對(duì)Python“腳本”的理解與使用
十大排序算法整理(含JavaScript版本與Python版本源碼)
從常用實(shí)例學(xué)習(xí)正則2
從常用實(shí)例學(xué)習(xí)正則1
自制小功能——cmd中的規(guī)則加密輸入
文件目錄操作實(shí)例2
文件目錄操作實(shí)例1
Python部分實(shí)際案例解答1
- 不同進(jìn)制之間的轉(zhuǎn)換
- 其他進(jìn)制轉(zhuǎn)十進(jìn)制
- 十進(jìn)制轉(zhuǎn)其他進(jìn)制
- 獲取變量?jī)?nèi)存地址、獲取內(nèi)存地址所指向的變量
- 了解C語(yǔ)言指針
- python“使用”指針
- python垃圾回收
- 二維數(shù)組生成的區(qū)別
- 淺拷貝與深拷貝
- 從列表中分離奇數(shù)和偶數(shù)
- 從列表中提取公共信息轉(zhuǎn)換成字典
- 模擬有密碼輸入次數(shù)的登錄系統(tǒng)
- 計(jì)算1-100內(nèi)的奇數(shù)和、代碼執(zhí)行時(shí)間計(jì)時(shí)
- 二層列表轉(zhuǎn)單層列表、代碼執(zhí)行時(shí)間計(jì)時(shí)
- 發(fā)撲克小程序
不同進(jìn)制之間的轉(zhuǎn)換
首先,我們最長(zhǎng)看見(jiàn)的是十進(jìn)制數(shù),所以我們用此作為“橋梁”,連接其他進(jìn)制。
這里就分兩種情況,一個(gè)是其他進(jìn)制轉(zhuǎn)十進(jìn)制,一個(gè)是十進(jìn)制轉(zhuǎn)其他進(jìn)制,這樣其他進(jìn)制轉(zhuǎn)其他的其他進(jìn)制就可以通過(guò)十進(jìn)制中轉(zhuǎn)。
其他進(jìn)制轉(zhuǎn)十進(jìn)制
這個(gè)比較簡(jiǎn)單,python的內(nèi)置函數(shù) int 就能實(shí)現(xiàn):
int("1010011010", base=2) # 666 int("1232", base=8) # 666 int("666", base=10) # 666 int("29a", base=16) # 666對(duì)于“特殊”進(jìn)制,二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制,設(shè)置 base 為 0 就會(huì)自動(dòng)識(shí)別字符串中的進(jìn)制,默認(rèn)為 10:
int("0b1010011010", base=0) # 666 int("0o1232", base=0) # 666 int("666", base=0) # 666 int("666") # 666 int("0x29a", base=0) # 666就如這小栗子所示,0b 是二進(jìn)制的前綴, 0o 是八進(jìn)制的前綴,0x 是十六進(jìn)制的前綴,十進(jìn)制沒(méi)有前綴。
十進(jìn)制轉(zhuǎn)其他進(jìn)制
常用輾轉(zhuǎn)相除法來(lái)計(jì)算,取余的逆向數(shù)字為結(jié)果。輾轉(zhuǎn)相除法本來(lái)是為了優(yōu)化更相減損術(shù),用來(lái)計(jì)算最大公約數(shù)的,為什么能用輾轉(zhuǎn)相除法計(jì)算呢?慢慢來(lái)理解:
先來(lái)一段2的指數(shù)結(jié)果表
- 20 = 1
- 21 = 2
- 22 = 4
- 23 = 8
- 24 = 16
- 25 = 32
- 26 = 64
- 27 = 128
- 28 = 256
- 29 = 512
再來(lái)看看十進(jìn)制 666 是如何由 2 的指數(shù)加起來(lái)的:
666 = 1 * 29 + 0 * 28 + 1 * 27 + 0 * 26 + 0 * 25 + 1 * 24 +1 * 23 + 0 * 22 + 1 * 21 + 0 * 20
( == 29 + 27 + 24 + 23 + 21 )
最后看看輾轉(zhuǎn)相除法能得到什么:
666 = 2 * 333 + 0 = 29 + 27 + 24 + 23 + 21
333 = 2 * 166 + 1 = 28 + 26 + 23 + 22 + 20
166 = 2 * 83 + 0 ?= 27 + 25 + 22 + 21
83 ?= 2 * 41 + 1 ?= 26 + 24 + 21 + 20
41 ?= 2 * 20 + 1 ?= 25 + 23 + 20
20 ?= 2 * 10 + 0 ?= 24 + 22
10 ?= 2 * 5 + 0 ??= 23 + 21
5 ??= 2 * 2 + 1 ??= 22 + 20
2 ??= 2 * 1 + 0 ??= 21
1 ??= 2 * 0 + 1 ??= 20
對(duì)右邊豎線觀察,會(huì)發(fā)現(xiàn)經(jīng)過(guò)每次除以2,高位指數(shù)慢慢變成了低位,直到最高位指數(shù)變成0為止。
然后從最底下逆推上去的原因就是:
上一式子總是在下一式子的基礎(chǔ)上,乘以指數(shù),加上余數(shù)(也就是余數(shù) * 底數(shù)的** 0** 次方);
也就是不斷把整個(gè)下一式子最右邊的指數(shù)和代入上一式子中的 2 * ? 中的 ? 部分,從而一步一步的得到指數(shù)和的相加結(jié)果。
還有一種拼湊法的意思就是:
666 < 210
666 > 29
666 < 29 + 28
666 > 29 + 27
666 < 29 + 27 + 26
666 < 29 + 27 + 25
666 > 29 + 27 + 24
666 > 29 + 27 + 24 + 23
666 < 29 + 27 + 24 + 23 + 22
666 = 29 + 27 + 24 + 23 + 21
從最大位開(kāi)始湊;
湊到后面大了,就讓最后一個(gè)2的指數(shù)調(diào)小一級(jí);
湊到后面小了,就讓最后再增加一個(gè)更小2的指數(shù);
不斷反復(fù)直到相等。
先來(lái)一段8的指數(shù)結(jié)果表
- 80 = 1
- 81 = 8
- 82 = 64
- 83 = 512
再來(lái)看看十進(jìn)制 666 是如何由 8 的指數(shù)加起來(lái)的:
666 = 1 * 83 + 2 * 82 + 3 * 81 + 2 * 80
和二進(jìn)制一樣,看看輾轉(zhuǎn)相除法能得到什么:
666 = 8 * 83 + 2 = 1 * 83 + 2 * 82 + 3 * 81 + 2 * 80
83 ?= 8 * 10 + 3 = 1 * 82 + 2 * 81 + 3 * 80
10 ?= 8 * 1 + 2 ?= 1 * 81 + 2 * 80
1 ??= 8 * 0 + 1 ?= 1 * 80
代入后同樣能得到指數(shù)和的加法式子。
同樣拼湊法的意思就是:
666 < 2 * 83
666 > 1 * 83
666 < 1 * 83 + 3 * 82
666 > 1 * 83 + 2 * 82
666 < 1 * 83 + 2 * 82 + 4 * 81
666 > 1 * 83 + 2 * 82 + 3 * 81
666 = 1 * 83 + 2 * 82 + 3 * 81 + 2 * 81
原理理解了,就能上代碼了:
def dfs(x, d=2):if x:dfs(x // d, d)print({n: n for n in range(10)}.get(x % d, chr(x % d + 55 + 32)), end='')print('十進(jìn)制轉(zhuǎn)任意進(jìn)制小程序') jz = int(input('請(qǐng)輸入進(jìn)制:') or 2) assert 1 < jz < 37, '只能從十進(jìn)制轉(zhuǎn)換成二進(jìn)制到三十六進(jìn)制' num = input('請(qǐng)輸入十進(jìn)制數(shù):') dfs(int(num), d=jz)這可以用于十進(jìn)制轉(zhuǎn)任意進(jìn)制,dfs 函數(shù)中的三行分別代表的如下三個(gè)步驟:
也可以改寫(xiě)為設(shè)置固定進(jìn)制的,看著就很方便~
當(dāng)然特殊的二進(jìn)制、八進(jìn)制和十六進(jìn)制都有相應(yīng)的函數(shù),且會(huì)自帶字符前綴特征:
獲取變量?jī)?nèi)存地址、獲取內(nèi)存地址所指向的變量
了解C語(yǔ)言指針
學(xué)過(guò)C語(yǔ)言的都知道,有個(gè)叫做 指針 的讓人頭疼的玩意,老是學(xué)起來(lái)問(wèn)題,這邊先簡(jiǎn)單講解一下C語(yǔ)言的變量指針作為了解鋪墊:
指針的作用:用來(lái)保存內(nèi)存地址;
& 的作用:用來(lái)獲取內(nèi)存地址(可以在輸出中用 %u 打印成無(wú)符號(hào)整數(shù));
定義整型變量 int value = 0 ;
定義指針變量 int *address; address = &value 或 int *address = &value ;
這里可以看出,指針變量并不是 int 類(lèi)型,而是 int * 類(lèi)型,雖然他存的是一個(gè)地址整數(shù),并且這當(dāng)中加了一個(gè)空格,但其是一個(gè)整體,定義完了就可以丟一邊去了~
指針與變量的等價(jià)關(guān)系:*address = value 和 address = &value 。( address 是指針變量,是指針的地址;value 是變量值)
用一幅圖來(lái)明白:
sizeof() 用于獲取變量字節(jié)長(zhǎng)度,這里是4是因?yàn)樽址袀€(gè)終止字符**\0**,sizeof() 會(huì)將終止字符 \0 一并計(jì)算在內(nèi)。
好了,對(duì)C語(yǔ)言指針有個(gè)初始的印象了吧?接下來(lái)就來(lái)說(shuō)說(shuō),python中對(duì)指針的使用。
python“使用”指針
其實(shí)上面說(shuō)一堆,下面實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,幾行代碼,使用了萬(wàn)能的 ctypes 庫(kù)【C:我有指針你沒(méi)有! Python:拿來(lái)吧你!】:
import ctypes value = 666 value_id = id(value) print(value_id) value_get = ctypes.cast(value_id, ctypes.py_object).value print(value_get)輸出結(jié)果:
2022050320228 666第一行是獲取到的變量?jī)?nèi)存地址;
第二行是從該內(nèi)存地址讀取變量;
python和其他語(yǔ)言對(duì)變量和內(nèi)存地址的處理不同,先舉個(gè)小栗子:
你們覺(jué)得兩個(gè)id值輸出是不是一樣的?
我想大部分正常的人應(yīng)該和很久之前的我一樣,認(rèn)為他是不一樣的吧?
那就想錯(cuò)了,答案是它倆的 id 值是一樣的,不管 del 多少次,每次指向同一變量所在的內(nèi)存地址是相同的!
del 只會(huì)銷(xiāo)毀變量名所指向的內(nèi)存地址,但不會(huì)關(guān)閉該內(nèi)存地址,
簡(jiǎn)單來(lái)說(shuō),python中定義的變量實(shí)際上是一個(gè)指針地址,表面上在修改變量值,實(shí)際上是在新的內(nèi)存地址上創(chuàng)建了變量值,然后用變量名指向該內(nèi)存地址。
所以與其說(shuō)python中的 = 是賦值語(yǔ)句,倒不如說(shuō)這是引用語(yǔ)句,就換了個(gè)內(nèi)存地址的引用。
python垃圾回收
既然怎么 del ,內(nèi)存空間都沒(méi)有被釋放,那變量太多內(nèi)存滿了怎么辦?
這個(gè)不用擔(dān)心,雖然內(nèi)存空間沒(méi)有被釋放,但它是根據(jù)其他特征決定是否釋放內(nèi)存空間的,就是——引用計(jì)數(shù)器,它會(huì)動(dòng)態(tài)跟蹤你代碼中的引用次數(shù)并判斷是否可以回收內(nèi)存空間。
當(dāng)你有多個(gè)變量等于一個(gè)值的時(shí)候,引用計(jì)數(shù)器就會(huì)累加;
當(dāng)你其中一個(gè)變量重新賦值為其他值的時(shí)候,原來(lái)的值的引用計(jì)數(shù)器就會(huì)減一,同時(shí)新的值的引用計(jì)數(shù)器會(huì)加一。
當(dāng)你操作 del 解除變量的引用、或者刪除可變對(duì)象(列表、字典、集合等)中的變量時(shí),變量值的引用計(jì)數(shù)器也會(huì)相應(yīng)減一,當(dāng)你 del 等操作后下文沒(méi)有變量名引用這個(gè)變量值了,python就會(huì)自動(dòng)銷(xiāo)毀它以釋放內(nèi)存空間。
所以python的垃圾回收完全是自動(dòng)檢測(cè)的,不會(huì)受到人為 del 的干預(yù),完全是取決于你代碼下文是否用到這個(gè)變量。
二維數(shù)組生成的區(qū)別
我之前做過(guò)的跟棋盤(pán)有關(guān)的的游戲中需要生成一個(gè)12*12且全是0的二維數(shù)組,所以我很自然是使用了符合我氣質(zhì)的超短生產(chǎn)法:[[0] * 12] * 12 ,結(jié)果不出意外的時(shí)候,出了意外,有個(gè)bug怎么看代碼怎么正確,但bug依舊存在。這讓我很抓狂,后來(lái)費(fèi)勁千辛萬(wàn)苦,才找到了罪惡的源頭——?jiǎng)?chuàng)建二維數(shù)組創(chuàng)建方法用錯(cuò)了。
先來(lái)簡(jiǎn)單輸出對(duì)比一下,更改某一二維度值后列表的變化:
結(jié)果:
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] [[0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0]]可以發(fā)現(xiàn),l1 的改變是我們想要的結(jié)果,只更改了一個(gè)值;
但 l2 的結(jié)果令人意外,每個(gè)二維表的相同位置都變了…隨后我進(jìn)行了大膽的嘗試:打印列表中每個(gè)值的 id ,看看每個(gè) 0 的 id 地址是否一致:
結(jié)果是意外的:
2426444079752 2426451175624 2426451175560 2426451193160 2426451090760 2426448839880 2426448839240 2426451176008 2426451385736 2426451170824 2426451385800 2426451385864 ---------------- 2426451385992 2426451385992 2426451385992 2426451385992 2426451385992 2426451385992 2426451385992 2426451385992 2426451385992 2426451385992 2426451385992 2426451385992可以發(fā)現(xiàn)第一種生成的列表的每一項(xiàng),id值都不一樣,但第二種生成的列表的每一項(xiàng) id 值都一樣,代表只要改變其中一個(gè)第二維數(shù)組,所有第二維數(shù)組都會(huì)跟著一起變!想想就可怕,以后在這種不能偷懶的地方還是不偷懶了…
淺拷貝與深拷貝
上一個(gè)例子為什么會(huì)這樣,原因很簡(jiǎn)單,因?yàn)閜ython中有兩種拷貝方式:
淺拷貝(copy):拷貝父對(duì)象,不會(huì)拷貝對(duì)象的內(nèi)部的子對(duì)象。
深拷貝(deepcopy): copy 模塊的 deepcopy 方法,完全拷貝了父對(duì)象及其子對(duì)象。
然后上文又說(shuō)到直接賦值,就其實(shí)是對(duì)對(duì)象的引用(別名)。
了解了這個(gè),再來(lái)看上面例子的兩種二維表創(chuàng)建方式:
[0] * n 是淺拷貝,也就是把一個(gè)列表重復(fù)了n次,每一行的改變都會(huì)改變其他行;
[[0] * n] * m 這種方式是直接將[0] * n 復(fù)制了m遍;
[0 for _ in range(n)] 才是創(chuàng)建,是深拷貝。
所以其實(shí)上面還能這樣創(chuàng)建二維數(shù)組,這樣也能正確創(chuàng)建二維數(shù)組:
l = [[0] * 12 for _ in range(12)]因?yàn)閯?chuàng)建全0數(shù)組,所以最深元素0肯定是一個(gè) id ,要想多維數(shù)組正確創(chuàng)建,最多只能最里層數(shù)組是采用乘法復(fù)制的操作,來(lái)看個(gè)小栗子:
l1 = [[[0 for _ in range(6)] for _ in range(6)] for _ in range(6)] l2 = [[[0] * 6 for _ in range(6)] for _ in range(6)] l3 = [[[0] * 6] * 6 for _ in range(6)] l4 = [[[0] * 6] * 6] * 6 print(l1, l2, l3, l4, sep='\n') print('*******************************************') l1[1][2][3] = 4 l2[1][2][3] = 4 l3[1][2][3] = 4 l4[1][2][3] = 4 print(l1, l2, l3, l4, sep='\n')舉了四個(gè)小栗子,然后看看結(jié)果:
[[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]] [[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]] [[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]] [[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]] ******************************************* [[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]] [[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]] [[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]] [[[0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0]], [[0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0]], [[0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0]], [[0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0]], [[0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0]], [[0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0], [0, 0, 0, 4, 0, 0]]]看著可能有點(diǎn)密密麻麻,但可以 Ctrl + F 查找一下數(shù)字 4 ,會(huì)發(fā)現(xiàn)只有第一、第二種創(chuàng)建方式是我們想要的,其他都出現(xiàn)了問(wèn)題,所以偷懶最多偷一點(diǎn),偷懶多了就得不償失了~
從列表中分離奇數(shù)和偶數(shù)
首先,隨便整一堆數(shù)字:
numbers = [12, 23, 34, 45, 56, 67, 78, 89]一般人的做法:
jishu, oushu = [], [] for num in numbers:if num % 2:jishu.append(num)else:oushu.append(num) print(jishu) print(oushu)結(jié)果:
[23, 45, 67, 89] [12, 34, 56, 78]這是別人問(wèn)過(guò)的問(wèn)題,所以這里放上別人看的PPT上的解答:
奇數(shù)偶數(shù)都分離出來(lái)了不錯(cuò),但用了8行,這不是我想要的 (手動(dòng)滑稽) ~
我作為一個(gè)有知識(shí)的博主,肯定要挑戰(zhàn)一行代碼實(shí)現(xiàn)他!
上代碼:
別看他長(zhǎng),代碼是真的只有一行,奇數(shù)偶數(shù)的分類(lèi)以及輸出全都一行搞定,當(dāng)中lambda主體的兩個(gè)列表是假的,主要用來(lái)列表推導(dǎo)循環(huán)獲取一下(他執(zhí)行完后應(yīng)該會(huì)自動(dòng)當(dāng)垃圾清理掉的吧),然后靠 and 后輸出兩個(gè)列表,然后在 pint 中解包,并設(shè)置 sep 參數(shù)換行輸出,結(jié)果和上面一模一樣。
什么?你嫌棄這太長(zhǎng)了?沒(méi)關(guān)系!我還有一個(gè)簡(jiǎn)短版本的,使用了內(nèi)置函數(shù) filter ,非常好用!
print(list(filter(lambda _: _ % 2, [12, 23, 34, 45, 56, 67, 78, 89])), list(filter(lambda _: not _ % 2, [12, 23, 34, 45, 56, 67, 78, 89])), sep='\n')比上面的至少少了十幾個(gè)字符呢 (此處應(yīng)有掌聲!) ~
filter 這個(gè)函數(shù)可以理解為一個(gè)功能 “條件格式” ,用于過(guò)濾序列。當(dāng)滿足條件(第一個(gè)參數(shù)為 True )時(shí),他會(huì)返回遍歷到的元素,否則不返回。(關(guān)于高階函數(shù),以后有機(jī)會(huì)更新【比如下一篇?】)
因?yàn)檫@個(gè)遍歷返回的是可迭代對(duì)象,要強(qiáng)迫它立刻完成,那就用 list(filter()) ,讓它直接出結(jié)果。
從列表中提取公共信息轉(zhuǎn)換成字典
這仍然是解答別人問(wèn)題時(shí)候的一個(gè)小栗子:
var = [['王*龍', '北京市海淀區(qū)蘇州街大恒科技大廈南座4層'],['龐*飛', '北京市昌平區(qū)匯德商廈四樓403'],['顧*銳', '江蘇省揚(yáng)州市三垛鎮(zhèn)工業(yè)集中區(qū)揚(yáng)州市立華畜禽有限公司'],['王*飛', '上海市徐匯區(qū)上海市徐匯區(qū)H88越虹廣場(chǎng)B座5E'],['華*升', '北京市海淀區(qū)杰睿大廈'],['朱*鍇', '上海市浦東新區(qū)川沙新鎮(zhèn)華川家園33號(hào)樓503'],['陳*盼', '浙江省杭州市閑林街道,西溪華東園,十幢一單元401。'],['司*鵬', '河南省鶴壁市淇濱大道310號(hào) 鶴壁京立醫(yī)院'],['聶*睿', '河北省石家莊市中山路勒泰中心寫(xiě)字樓b座11層'],['張*', '遼寧省本溪市明興麗城九號(hào)樓四單元'],['冉*晗', '河北省石家莊市體育南大街385號(hào)'],['高*杰', '北京市朝陽(yáng)區(qū)廣渠路42號(hào)院3號(hào)樓,408'],['李*國(guó)', '安徽省合肥市新站區(qū)淮合花園'],['常*源', '江蘇省南京市白下路242號(hào),南京市紅十字醫(yī)院,放射科'],['張*玉', '河北省滄州市新居然家居廣場(chǎng)'],['王*川', '上海市奉賢區(qū)南橋鎮(zhèn) 貝港七區(qū)'],['冀*慶', '河北省保定市河北大學(xué)坤興園生活區(qū)'],['胡*晨', '浙江省寧波市浙江省寧波市江東區(qū)中山首府A座2004室'],['尹*婷', '湖北省武漢市武漢大學(xué)信息學(xué)部'],['李*東', '遼寧省大連市大關(guān)一街3號(hào)3-3-1'],['張*', '天津市河西區(qū)隆昌路94號(hào)(天津科技館)'],['劉*', '湖北省黃岡市城關(guān)鎮(zhèn)'],['阿*亞', '內(nèi)蒙古呼和浩特市包頭東接民望家園1區(qū)3號(hào)樓2單元1501'],['孫*云', '山東省濟(jì)南市山東省濟(jì)南市歷下區(qū)祥泰匯東國(guó)際,一號(hào)樓3005室'],['曹*亮', '黑龍江省大慶市服務(wù)外包產(chǎn)業(yè)園D1'],['侯*琦', '上海市長(zhǎng)寧區(qū)金鐘路凌空soho16號(hào)樓3樓'],['郭*峰', '河南省商丘市高新技術(shù)開(kāi)發(fā)區(qū)恒宇食品廠'],['趙*生', '河北省唐山市朝陽(yáng)道與學(xué)院路路口融通大廈2408室'],['張*', '陜西省咸陽(yáng)市文匯東路6號(hào)西藏民族大學(xué)'],['劉*民', '北京市大興區(qū)南海家園四里7號(hào)樓1單元902'],['郭*蘭', '湖北省武漢市湖北省'],['張*強(qiáng)', '河北省張家口市經(jīng)開(kāi)區(qū)鉆石南路11號(hào)'],['鞠*龍', '山東省濰坊市玉清街江山帝景B區(qū)12號(hào)樓一單元14樓'],['李*', '北京市海淀區(qū)西二旗智學(xué)苑5號(hào)樓超市'],['許*康', '北京市西城區(qū)西單北大街甲133號(hào)'],['葉*生', '江蘇省揚(yáng)州市揚(yáng)子江中路756號(hào)'],['趙*興', '北京市海淀區(qū)西二旗上地信息路1號(hào)金遠(yuǎn)見(jiàn)大樓華緯訊301'],['徐*革', '北京市海淀區(qū)閔莊路3號(hào)102棟二層206'],['徐*', '安徽省淮南市金荷小區(qū)(金格商場(chǎng)旁)'],['雷*', '北京市朝陽(yáng)區(qū)望京街道望京sohoT1C座1201'],['莊*', '浙江省杭州市恒生電子大廈'],['蔡*恩', '湖北省武漢市仁和路沙湖港灣B區(qū)1103'],['陳*', '江蘇省蘇州市巴城鎮(zhèn)湖濱北路193號(hào)牛吃蟹莊'],['黃*', '北京市朝陽(yáng)區(qū)霄云路26號(hào)鵬潤(rùn)大廈A座33層'],['魏*飛', '河北省石家莊市新石北路與紅旗大街交口開(kāi)元大廈502室'],['張*', '山東省濟(jì)南市興港路三慶城市主人'],['段*琪', '山西省臨汾市福利路堯鄉(xiāng)小區(qū)'],['劉*', '北京市昌平區(qū)龍禧三街驪龍園601'],['王*生', '上海市楊浦區(qū)邯鄲路復(fù)旦大學(xué)遺傳學(xué)樓319室'],['王*君', '江蘇省揚(yáng)州市葉挺路318號(hào)建行營(yíng)業(yè)部'],['王*義', '北京市東城區(qū)環(huán)球貿(mào)易中心D座'],['李*', '陜西省漢中市同溝寺鎮(zhèn)晨光村二組'],['裴*宇', '吉林省四平市嶺西新耀豪庭7棟'],['丁*', '山東省煙臺(tái)市大季家鎮(zhèn)蘆洋村'],['劉*鐸', '黑龍江省佳木斯市火電小區(qū)橋頭浴池附近惠惠干洗店'],['樊*', '浙江省寧波市文苑風(fēng)荷201-301'],['陳*瑞', '安徽省宣城市安徽省宣城市宣州區(qū)薰化路301合肥工業(yè)大學(xué)宣城校區(qū)'],['崔*峰', '浙江省臺(tái)州市福溪街道始豐西路43號(hào)501室'],['徐*', '湖北省武漢市三金雄楚天地1號(hào)樓1210'],['王*', '浙江省寧波市浙江工商職業(yè)技術(shù)學(xué)院信息中心'],['閆*', '上海市浦東新區(qū)藍(lán)天路368弄1號(hào)301室'],['于*泉', '吉林省四平市金星書(shū)苑小區(qū)8號(hào)樓5單元102室'],['劉*萌', '河北省秦皇島市撫寧鎮(zhèn)交通局家屬院3-2-201'],['石*', '安徽省宣城市薰化路301'],['王*雯', '甘肅省蘭州市天水南路222號(hào)蘭州大學(xué)'],['王*朝', '河南省鄭州市嵩山南路政通路升龍城六號(hào)院'],['金*晶', '吉林省延邊州延吉市新興街民安委11'],['蔣*彬', '遼寧省本溪市新城北岸,恒大綠洲'],['牛*鑫', '黑龍江省雞西市南山路康光二號(hào)樓中雅發(fā)廊'],['陳*宏', '山西省太原市太原理工大學(xué)'],['劉*', '山西省運(yùn)城市卿頭鎮(zhèn)'],['陳*杰', '浙江省寧波市高新區(qū)研發(fā)園A5幢7樓多維時(shí)空科技有限公司'],['郝**', '山東省德州市焦廟鎮(zhèn)'],['焦*', '山西省長(zhǎng)治市太行西街金威超市太西店金威快購(gòu)辦公室'],['李*旗', '北京市昌平區(qū)沙河鎮(zhèn)匯德商廈4樓403老男孩教育'],['通*大都', '北京市豐臺(tái)區(qū)萬(wàn)泉寺東路9號(hào)院1棟1單1704'],['孫*川', '浙江省金華市佛堂鎮(zhèn)雅西村雙溪口便民超市'],['宋*', '安徽省合肥市上派鎮(zhèn)濱河家園9棟2102'],['李*', '陜西省安康市漢濱區(qū)新城街道南環(huán)東路口桃園小區(qū)大門(mén)口'],['李*連', '北京市昌平區(qū)立湯路北七家威尼斯花園2區(qū)2-3'],['籍*旭', '北京市房山區(qū)良鄉(xiāng)鴻順園西區(qū)20號(hào)樓3單元601'],['韓*嵩', '北京市昌平區(qū)立湯路威尼斯花園2區(qū)2-3'],['曹*', '北京市朝陽(yáng)區(qū)東三環(huán)北路28號(hào)博瑞大廈B座'],['賀*', '上海市徐匯區(qū)古美路1515號(hào)19號(hào)樓1101室'],['關(guān)*軒', '山西省長(zhǎng)治市石哲鎮(zhèn)'],['羅*', '河北省廊坊市書(shū)香苑小區(qū)四號(hào)樓'],['段**', '北京市朝陽(yáng)區(qū)酒仙橋東路M5世紀(jì)互聯(lián)'],['杜*偉', '北京市昌平區(qū)匯德商廈老男孩教育'],['王*', '北京市昌平區(qū)匯德商廈四樓'],['趙*波', '上海市閔行區(qū)上海市閔行區(qū)莘莊鎮(zhèn)廟涇路水清三村52號(hào)32弄402室'],['許*', '北京市海淀區(qū)西北旺鎮(zhèn)中海楓漣山莊北門(mén)對(duì)面中心'],['李*成', '北京市昌平區(qū)沙河鎮(zhèn)于辛莊村天利合家園'],['劉*', '江蘇省南京市興智路6號(hào)興智科技園A棟7層'],['張*濤', '安徽省合肥市安徽省合肥市廬陽(yáng)區(qū)壽春路156號(hào)古井百花大廈大廈A座2603'],['高*', '上海市虹口區(qū)歐陽(yáng)路351弄10號(hào)樓104室'],['谷*成', '浙江省杭州市城廂街道 下湘湖路1號(hào)'],['王*玉', '上海市嘉定區(qū)南翔鎮(zhèn)'],['劉*海', '北京市海淀區(qū)玉淵潭南路3號(hào)水科院萬(wàn)方城科技樓'],['楊*娟', '安徽省合肥市清源路中鐵國(guó)際城和暢園'],['謝*橋', '北京市海淀區(qū)豐秀中路3號(hào)院9號(hào)樓北京數(shù)碼大方科技股份有限公司'],['張*', '陜西省咸陽(yáng)市北上召秦楚汽車(chē)城別克雪佛蘭4s店'],['邵*龍', '北京市海淀區(qū)西北旺鎮(zhèn)大牛坊社區(qū)四期4號(hào)樓1單元301'],['耿*濤', '北京市朝陽(yáng)區(qū)三間房東柳巷甲一號(hào)意菲克大廈A座'],['孫*周', '北京市東城區(qū)東花市街道便宜坊寫(xiě)字樓10層,恒信通大廈。就在崇文門(mén)地鐵站口旁邊'],['于*涵', '山東省濟(jì)南市舜耕路舜耕山莊宿舍'],['陳*', '上海市普陀區(qū)近鐵城市廣場(chǎng)北座15樓'],['馬*', '北京市昌平區(qū)沙河鎮(zhèn)松蘭堡村西口興業(yè)家園6號(hào)樓'],['齊*', '江蘇省南京市天元東路228號(hào)萊茵量子國(guó)際'],['高*', '山西省太原市經(jīng)濟(jì)技術(shù)開(kāi)發(fā)區(qū)龍盛街2號(hào)國(guó)藥控股'],['劉*', '北京市海淀區(qū)中關(guān)村丹棱街中國(guó)電子大廈B座1608'],['陳*山', '安徽省六安市南港鎮(zhèn)'],['趙*', '黑龍江省哈爾濱市錦山路5號(hào),黑龍江省地質(zhì)科學(xué)研究所'],['伍*', '安徽省蕪湖市泉塘鎮(zhèn)'],['白*潮', '上海市浦東新區(qū)康橋鎮(zhèn)環(huán)橋路2585弄文怡苑一期27號(hào)樓301'],['黃*曦', '北京市朝陽(yáng)區(qū)西壩河南路3號(hào)2層201室 同創(chuàng)雙子信息技術(shù)股份有限公司'],['牟*強(qiáng)', '山東省日照市山東東路619號(hào) 廣電網(wǎng)絡(luò)公司'],['李*運(yùn)', '上海市松江區(qū)滬亭南路208弄109號(hào)801室'],['楊*', '北京市朝陽(yáng)區(qū)安苑路20號(hào)世紀(jì)興源大廈304'],['宋*偉', '河北省石家莊市高頭鄉(xiāng)西高村'],['任*鵬', '陜西省西安市錦業(yè)一路29號(hào) 龍旗科技園 6層 西安和利時(shí)系統(tǒng)工程有限公司'],['孫*洲', '北京市東城區(qū)東花市街道便宜坊寫(xiě)字樓10層,恒信通公司。就在崇文門(mén)地鐵站旁邊'],['張*義', '上海市浦東新區(qū)三舒路181弄2號(hào)904'],['門(mén)*意', '黑龍江省哈爾濱市文昌街238號(hào)聯(lián)通系統(tǒng)集成有限公司'],['楊*康', '北京市豐臺(tái)區(qū)豐臺(tái)科技園漢威廣場(chǎng)12棟'] ]這么一大段數(shù)據(jù),最后要根據(jù)省份變成字典,如圖:
忽略掉對(duì)方是編程小白這個(gè)因素,這個(gè)是很簡(jiǎn)單的對(duì)吧🤣~
import jsonvar_dict = {} for v in var:var_dict[v[1][:3]] = var_dict.get(v[1][:3], [])var_dict[v[1][:3]].append(v) print(json.dumps({k: [str(i) for i in v] for k, v in var_dict.items()}, indent=4, ensure_ascii=False).replace('"[', '[').replace(']"', ']'))這里的 var_dict[v[1][:3]] = var_dict.get(v[1][:3], []) 我感覺(jué)用的很巧,如果鍵值不存在就自動(dòng)創(chuàng)建,存在就賦值為原來(lái)的值,省去了 if 的兩行(但好像犧牲了些許性能),然后下面就可以放心肯定是列表而不會(huì)是 None 了。
你看 print 那里好像有點(diǎn)長(zhǎng),其實(shí)就是在轉(zhuǎn)字符串,為什么要將列表轉(zhuǎn)成字符串呢?因?yàn)椴晦D(zhuǎn)換成字符串的話,列表元素會(huì)自動(dòng)換行,就像這樣:
為了貼合它給的示例,所以就要讓列表變成一個(gè)個(gè)的字符串,這樣就能在一行內(nèi)顯示了,最后記得把列表外面的引號(hào)去掉。
這叫什么,這就叫細(xì)節(jié)!
如果接下來(lái)不再使用這個(gè)字典,只是為了打印,那可以從上面入手轉(zhuǎn)換:
這就少了不少代碼了,完成!
模擬有密碼輸入次數(shù)的登錄系統(tǒng)
這還是別人請(qǐng)教我的一個(gè)問(wèn)題,讓我看看他的代碼有沒(méi)有問(wèn)題,我忘了他原來(lái)發(fā)的代碼是什么了,不過(guò)我記得他是 賬號(hào)或密碼為空 的時(shí)候仍然扣除次數(shù),這樣肯定是不對(duì), 于是我改后的代碼如下:
ctrl = 3 while 1 <= ctrl <= 3:x, y = input("請(qǐng)輸入賬號(hào):"), input("請(qǐng)輸入密碼:")if x == '' or x == ' ' or y == '' or y == ' ':print("警告,賬號(hào)或密碼不能為空")elif x != 'admin' or y != '123':ctrl -= 1print(f'輸入錯(cuò)誤請(qǐng)重新輸入,你還有{ctrl}次機(jī)會(huì)')else:print(x, '歡迎登錄')break僅在輸入不為空且賬號(hào)或密碼不對(duì)的時(shí)候次數(shù)減少,這樣的邏輯就是對(duì)的。
現(xiàn)在滿足他了,缺不滿足我了。為啥?這代碼這么長(zhǎng),11行的代碼!這看著太多了,對(duì)于縮減王的我來(lái)說(shuō),這要能壓縮到5行以內(nèi)才有挑戰(zhàn)性:
可惜了我最大只能縮減到5行,如果是python3.10以上的話,我還能憑借海象運(yùn)算符( := ,先賦值后判斷)又減少至少一行代碼~
計(jì)算1-100內(nèi)的奇數(shù)和、代碼執(zhí)行時(shí)間計(jì)時(shí)
這又又又是別人請(qǐng)教我的一個(gè)問(wèn)題,應(yīng)該已經(jīng)麻木了,不然我也不會(huì)想到要出此一期合集。
正常人寫(xiě)代碼:
像我一樣的非正常博主寫(xiě)代碼:
from functools import reduce print(sum([_ for _ in range(1, 100, 2)])) print(sum([_ for _ in range(1, 100) if _ % 2])) print(sum([_ * (_ % 2) for _ in range(1, 100)])) print(sum([_ if _ % 2 else 0 for _ in range(1, 100)])) print(reduce(lambda _, __: _ + __, [_ for _ in range(1, 100, 2)])) print(reduce(lambda _, __: _ + __, [_ for _ in range(1, 100) if _ % 2])) print(reduce(lambda _, __: _ + __ * (__ % 2), [_ for _ in range(1, 100)])) print(reduce(lambda _, __: _ + __, [_ if _ % 2 else 0 for _ in range(1, 100)]))分分鐘給他寫(xiě)一堆一行就能完成的不同方案的代碼(如果細(xì)小改變也能稱(chēng)之為新方法的話),一會(huì) sum ,一會(huì) range 里分奇偶,一會(huì)列表推導(dǎo)式分奇偶,一會(huì)遍歷元素處分奇偶,一會(huì) reduce 配合上面幾種分奇偶。(實(shí)際感覺(jué)也就四種小方法和兩種大方法混合使用,但我就覺(jué)得他們不一樣!)
但別人跟我說(shuō),你代碼短沒(méi)用,說(shuō)不定執(zhí)行速度沒(méi)我快,我心一沉,還真沒(méi)考慮,現(xiàn)在就來(lái)測(cè)一下他們的執(zhí)行速度:
import timeittests = """ sum([_ for _ in range(1, 100, 2)]) sum([_ for _ in range(1, 100) if _ % 2]) sum([_ * (_ % 2) for _ in range(1, 100)]) sum([_ if _ % 2 else 0 for _ in range(1, 100)]) __import__('functools').reduce(lambda _, __: _ + __, [_ for _ in range(1, 100, 2)]) __import__('functools').reduce(lambda _, __: _ + __, [_ for _ in range(1, 100) if _ % 2]) __import__('functools').reduce(lambda _, __: _ + __ * (__ % 2), [_ for _ in range(1, 100)]) __import__('functools').reduce(lambda _, __: _ + __, [_ if _ % 2 else 0 for _ in range(1, 100)]) """.strip('\n')for test in tests.split('\n'):print(timeit.timeit(stmt=test, number=100000))接下來(lái)運(yùn)行多次測(cè)試,結(jié)果如下:
這里就貼了隨機(jī)三次的測(cè)試,發(fā)現(xiàn)不僅代碼長(zhǎng)度越來(lái)越長(zhǎng)了,執(zhí)行速度還越來(lái)越慢了。
幾次測(cè)試下來(lái),第一種方法不僅穩(wěn),而且速度快,難怪能成為內(nèi)置函數(shù)。那么問(wèn)題來(lái)了,sum 函數(shù)和正常寫(xiě)多行代碼來(lái)比呢?
同樣取三次結(jié)果:
發(fā)現(xiàn)還是 sum 穩(wěn)如老狗,而且速度很快。
以后就不要說(shuō)代碼寫(xiě)一行速度會(huì)變慢了,內(nèi)置函數(shù)還是很好用的!
二層列表轉(zhuǎn)單層列表、代碼執(zhí)行時(shí)間計(jì)時(shí)
這實(shí)際上是我很久以前的需求了,我肯定會(huì)要求一行代碼實(shí)現(xiàn),不然就不會(huì)有這個(gè)話題了。
import timeitpoke = [[f'{_ + 1}_{__ + 1}' for __ in range(4)] if _ < 13 else [str(_ + 1)] for _ in range(15)] tests = f""" poke_list = [];list(map(poke_list.extend, {poke})) poke_list = sum({poke}, []) poke_list = __import__('functools').reduce(list.__add__, {poke}) poke_list = list(__import__('itertools').chain(*{poke})) poke_list = (lambda _, __ = eval("[]"): __.clear() or [[__.append(____) for ____ in ___ if ____] for ___ in _] and __)({poke}) """.strip('\n')for test in tests.split('\n'):print(timeit.timeit(stmt=test, number=100000))還是老樣子,測(cè)試三次數(shù)據(jù):
所有方法實(shí)際使用代碼如下:
poke = [[f'{_ + 1}_{__ + 1}' for __ in range(4)] if _ < 13 else [str(_ + 1)] for _ in range(15)] print(poke) poke_list = [];list(map(poke_list.extend, poke)) print(poke_list) poke_list = sum(poke, []) print(poke_list) poke_list = __import__('functools').reduce(list.__add__, poke) print(poke_list) poke_list = [_ for __ in poke for _ in __] print(poke_list) poke_list = list(__import__('itertools').chain(*poke)) print(poke_list) poke_list = (lambda _, __=eval("[]"): __.clear() or [[__.append(____) for ____ in ___ if ____] for ___ in _] and __)(poke) print(poke_list)發(fā)現(xiàn)第一種測(cè)試起來(lái)不僅穩(wěn),還比其他快一截,雖然他寫(xiě)的不優(yōu)雅…
然而最后的 lambda 函數(shù)是我之前用的,現(xiàn)在一看用時(shí)這么長(zhǎng)…果然長(zhǎng)的代碼可能用的時(shí)間長(zhǎng)…
我現(xiàn)在就感覺(jué)我的生命白白浪費(fèi)了那么多秒!
發(fā)撲克小程序
我看到代碼的下面,才發(fā)現(xiàn)原來(lái)上面都是鋪墊,下面這個(gè)功能才是正題,依然是別人問(wèn)我的,上面只是為了生成一副撲克牌而已…
不多說(shuō),上代碼,這里采用已經(jīng)轉(zhuǎn)換成一位數(shù)組的列表直接賦值:
這個(gè)程序呢,我就沒(méi)什么好解釋的了,這我感覺(jué)沒(méi)錯(cuò)的話,只是個(gè)半成品,要么就是我沒(méi)搞懂別人搞這程序想干啥,不過(guò)這都不重要
總結(jié)
以上是生活随笔為你收集整理的【Python实践】Python部分实际案例解答1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 利用Adams对单摆进行建模、仿真的动力
- 下一篇: JAVA Drp项目实战—— Unab