【Python基礎復習】那些容易踩坑的詭異操作

學習自華為云學院白澤老師《Python入門篇》課程

生成器

(i for i in range(10))
<generator object <genexpr> at 0x000001F6CB7E1AC0>

相互引用產生死循環

a = [1,2,3]
b = [3,4,5]

a.append(b)
b.append(a)
print(a)
print(b)
[1, 2, 3, [3, 4, 5, [...]]]
[3, 4, 5, [1, 2, 3, [...]]]
a = [""]*3
b = [a]*3
b[1][1] = 0
print(a)
print(b)
['', 0, '']
[['', 0, ''], ['', 0, ''], ['', 0, '']]
a, b = {}, 5
a[b] = a, b
print(a)
{5: ({...}, 5)}

lambda表達式&排序

# 排序
l = [(1, 2), (2, 4), (2, 3), (3, 2)]
l.sort(key=lambda x:(x[0],x[1]))
l
[(1, 2), (2, 3), (2, 4), (3, 2)]
# 列表刪除元素
s = [99,100,46,44,68,50,59,50,59,66,89,54]
for i in s:
    if i < 60:
        s.remove(i)
        
s #有問題 [99, 100, 44, 68, 59, 59, 66, 89]
[99, 100, 44, 68, 59, 59, 66, 89]
# 列表刪除元素
s = [99,100,46,44,68,50,59,50,59,66,89,54]
for i in s:
    if i < 60:
        s.pop(i)
s #IndexError: pop index out of range
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-13-6bbb6dc14b89> in <module>
      3 for i in s:
      4     if i < 60:
----> 5         s.pop(i)
      6 s


IndexError: pop index out of range

列表在每一次循環當中都會動態變化,當元素被刪,循環的列表索引下標發生改變,會直接影響循環過程

解決方法1:創建一份淺拷貝

import copy
s = [99,100,68,59,50,59,66,89,54]
s1 = copy.copy(s)
for i in s:
    if i < 60:
        s1.remove(i)
        
s1
[99, 100, 68, 66, 89]

解決方法2:列表推導式


import copy
s = [99,100,46,44,68,50,59,50,59,66,89,54]
[ i for i in s if i>=60 ]
[99, 100, 68, 66, 89]

解決方法3:倒著刪,刪除后避免元素遷移導致索引變化


s = [99,100,46,44,68,50,59,50,59,66,89,54]
for i in range(len(s)-1, -1, -1):
    print(i,":", s[i])
    if s[i] < 60:
        print('removing...')
        s.pop(i)
s
11 : 54
removing...
10 : 89
9 : 66
8 : 59
removing...
7 : 50
removing...
6 : 59
removing...
5 : 50
removing...
4 : 68
3 : 44
removing...
2 : 46
removing...
1 : 100
0 : 99





[99, 100, 68, 66, 89]

解決方法4:filter函數 + lambda表達式

s = [99,100,46,44,68,50,59,50,59,66,89,54]
list(filter(lambda x:x>=60, s))
[99, 100, 68, 66, 89]

淺拷貝和深拷貝

l = [1,2,3,[5,4]]
l1 = l.copy() #copy方法實現淺拷貝
import copy
l2 = copy.deepcopy(l)
l == l1 == l2
True
l1 is l
False
l2 is l
False
l1[3][1]=6
l
[1, 2, 3, [5, 6]]
l1
[1, 2, 3, [5, 6]]
l2
[1, 2, 3, [5, 4]]

詭異的運算符使用方法

不推薦,僅了解

(False == False) in [False]
False
False == (False in [False])
False
False == False in [False]
True
True is False == False
False
False is False is False
True
1 > 0 < 1  #等價于 1>0 and 0<1
True
(1 > 0 ) < 1
False
1 > (0 < 1)
False

操作符優先級:**最高, and or not最小

指定i不能打斷循環

循環產生迭代器,循環只不過遍歷已經生成完數值

# 循環產生迭代器,循環只不過遍歷已經生成完數值
for i in range(4):
    print(i)
    i = 10
0
1
2
3

代碼效率問題

# 判斷是否感染新冠
COVID = 1  
if COVID:#避免沒有必要的計算執行
    print("請隔離治療")
else:
    print("通過")
請隔離治療
# 排序
import random
l = [i for i in range(10)]
random.shuffle(l)
l
[7, 1, 8, 4, 5, 6, 9, 0, 2, 3]
temp = []

n = len(l)
for i in range(n):
    s = l[0]
    for i in range(len(l)):
        if l[i] < s:
            s = l[i]
            
    print(l)
    l.remove(s)
    temp.append(s)
    
    
temp
[7, 1, 8, 4, 5, 6, 9, 0, 2, 3]
[7, 1, 8, 4, 5, 6, 9, 2, 3]
[7, 8, 4, 5, 6, 9, 2, 3]
[7, 8, 4, 5, 6, 9, 3]
[7, 8, 4, 5, 6, 9]
[7, 8, 5, 6, 9]
[7, 8, 6, 9]
[7, 8, 9]
[8, 9]
[9]





[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

空間復雜度換時間復雜度

def quick_sort(arr):
    if len(arr) < 2:
        return arr
    # 選取基準,隨便選哪個都可以,選中間的便于理解
    mid = arr[len(arr) // 2]
    # 定義基準值的左右兩個數列
    left, right = [], []
    # 從原始數組中移除基準值
    arr.remove(mid)
    for item in arr:
        #大于基準值放右邊
        if item >= mid:
            right.append(item)
        else:
            left.append(item)
    #使用遞歸迭代進行比較
    return quick_sort(left) + [mid] + quick_sort(right)

quick_sort([1, 10, 9, 5, 8, 0])
[0, 1, 5, 8, 9, 10]

裝飾器

import time
def func(f):
    def inner(*args, **kwargs):
        start_time = time.time()
        f(*args, **kwargs)
        end_time = time.time()
        print('耗時:%s秒' % (end_time - start_time))
    return inner
# 裝飾器就是在不改變原本代碼情況下加入新的功能
@func
def test():
    time.sleep(1)

#相當于    
#func(test())
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容