Python基礎知識(列表推導式、字典推導式與條件推導式)
阿新 • • 發佈:2021-08-07
一、列表推導式
1)建立一個列表推導式。
# 需求:給出一個列表,通過迴圈,向列表中新增1-10的整數。
# 通常情況下,我們是這樣操作的。 lst = [] for i in range(1,11): lst.append(i) print(lst) >>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 如果使用列表推導式,我們是這樣操作的。 lst = [ i for i in range(1,11)] print(lst) # 程式碼可寫很多! >>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2)列表推導式的兩種模式介紹
迴圈模式:[變數名(加工的變數) for 變數 in iterable] 篩選模式:[變數(加工變數) for 變數 in iterable if 條件]
# 迴圈模式: # 需求1:將10以內所有整數的平方寫入列表 lst = [i ** 2 for i in range(1,11)] print(lst) >>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 需求2:將10以內所有的偶數寫入列表 lst = [i for i in range(2,11,2)] print(lst) # >>[2, 4, 6, 8, 10]
# 需求3:從python1期到python5期寫入列表lst lst = ['python'+ str(i) for i in range(1,6)] print(lst) # >>['python1', 'python2', 'python3', 'python4', 'python5']
# 篩選模式: # 需求1:將大於3的元素留下來 lst = [i for i in range(1,11) if i > 3] print(lst) >>[4, 5, 6, 7, 8, 9, 10]
# 需求2:三十以內可以被三整除的數 lst = [i for i in range(1,31) if i % 3 is 0] #如果取模是0 print(lst) # >>[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
# 需求3:找到巢狀列表中名字含有兩個‘e’的所有名字 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] lst = [a.upper() for i in names for a in i if a.count('e') >= 2] print(lst) # >>['JEFFERSON', 'WESLEY', 'STEVEN', 'JENNIFER']
3)補充內容
#列表推導式:【迴圈變數名 for 迴圈變數名 in 可迭代物件 if 條件判斷】 #(第一種)通常情況: # a=[] # for i in range(10): # a.append(i) # print(a) # #(第二種)列表推導式: # # b=[i for i in range(10)] # b=[i for i in range(10) if i>5] #取出列表中大於5的值 # print(b) num_in=int(input("請輸入數字!")) def fib(num): if num<=0: raise Exception("數字應該大於0!") #非迴圈中的異常處理 if num==1 or num==2: return 1 else: return fib(num-1)+fib(num-2) # print(fib(num_in)) # fib_list=[fib(i) for i in range(1,num_in+1)] #fib(i)得到前N個數的值 fib_list=[fib(num_in) for i in range(1,num_in+1)] #fib(num_in)會得到最後N個N位置的值 print(fib_list)
二、字典推導式
1)字典推導式:是一個或多個迭代器快速簡潔的建立資料型別的一種方法。它將迴圈和條件判斷結合,從而避免語法冗長的程式碼,提高程式碼執行效率。類似於列表推導式,不同的是字典推導式返回的是一個字典,所以整個表示式需要寫在{}內部。
2)字典推導式的語法格式:
# 第一種語法格式: # key:字典中的key # value:字典中的value # dict.items():序列 # condition:條件表示式 # key_exp:for迴圈中,如果條件表示式conditionw為True,返回對應的key,value # value_exp:for迴圈中,如果條件表示式condition為True,返回對應的key,value # {表示式 for 迭代變數 in 可迭代物件 [if 條件表示式]} # 用[]括起來的部分,可省略。 # {key_exp:value_exp for key,value in dict.items() if condition} # 第二種語法格式: # key:字典中的key # value:字典中的value # dict.items():序列 # condition:條件表示式 # key_exp:在for迴圈中,如果條件表示式condition為True,返回對應的key, value並作key_exp, value_exp處理 # value_exp1:在for迴圈中,如果條件表示式condition為True,返回對應的key, value並作key_exp, value_exp1處理 # value_exp2:在for迴圈中,如果條件表示式condition為False,返回對應的key, value並作key_exp, value_exp2處理 # {[if else條件表示式] 表示式 for 迭代變數 in 可迭代物件} # {key_exp:value_exp1 if condition else value_exp2 for key,value in dict.items()}
3)字典推導式案例
dict1 = {"a": 10, "B": 20, "C": True, "D": "hello world", "e": "python教程"} # 需求1:獲取字典中key值是小寫字母的鍵值對 dict2 = {key: value for key, value in dict1.items() if key.islower()} # 需求2:將字典中的所有key設定為小寫 dict3 = {key.lower(): value for key, value in dict1.items()} # 需求3:將字典中所有key是小寫字母的value統一賦值為'error' dict4 = {key: value if key.isupper() else "error" for key, value in dict1.items()} print(dict2) print(dict3) print(dict4) >>{'a': 10, 'e': 'python教程'} >>{'a': 10, 'b': 20, 'c': True, 'd': 'hello world', 'e': 'python教程'} >>{'a': 'error', 'B': 20, 'C': True, 'D': 'hello world', 'e': 'error'}
# 需求4:我們需要將獲取到字串格式的 cookies 轉換為字典 dict 格式。 cookies = 'ln_hurl=http://www.baidu.com;id=969937120;ver=7.0;loginfrom=null;wp_fold=0' # 字典推導式 cookies = {cookie.split("=")[0]:cookie.split("=")[1] for cookie in cookies.split(";")} print(cookies) # >>{'ln_hurl': 'http://www.baidu.com', 'id': '969937120', 'ver': '7.0', 'loginfrom': 'null', 'wp_fold': '0'} # 分析:在字串cookies中 ‘=’ 前面是key ,’=’ 後面是value ,每一個 ‘;’ 構成一個鍵值對;多個鍵值對構成一個字典; # 1.根據 ‘;’ 將字串拆分為列表; # 2.根據第一步獲取的列表,遍歷時將每一個字串根據 ‘=’ 再次拆分; # 3.根據第二步拆分的結果,列表第一個元素作為key, 列表第二個元素作為value ;
# 字典推導式與列表推導式的區別: # 1.列表推導式返回列表,表示式在中括號[]中。 # 2.字典推導式返回字典,表示式在大括號{}中。
三、條件推導式
1)條件推導式:是從一個或者多個迭代器快速簡潔的建立資料型別的一種方法,它將迴圈和條件判斷結合,避免語法冗長的程式碼。
2)語法結構:
# value1:如果條件表示式condition成立,返回value1 ; 如果條件表示式不成立,返回value2 ; # condition:條件表示式 # Value2:如果條件表示式condition成立,返回value1 ; 如果條件表示式不成立,返回value2 ; value1 if condition else Value2
3)條件推導式案例:
# 條件語句 x = 10 if x % 2 == 0: print("佩琪說:x是偶數") else: print("佩琪說:x是奇數") # 條件表示式語句 x = 15 print("佩琪說:x是偶數") if x % 2 == 0 else print("佩琪說:x是偶數") >>佩琪說:x是偶數 >>佩琪說:x是偶數
四、列表推導式與生成器的區別
1)列表推導式比較耗記憶體,所有資料一次性載入到記憶體。而.生成器表示式遵循迭代器協議,逐個產生元素。
2)得到的值不一樣,列表推導式得到的是一個列表.生成器表示式獲取的是一個生成器。
3)列表推導式一目瞭然,生成器表示式只是一個記憶體地址。
4)無論是生成器表示式,還是列表推導式,他只是Python給你提供了一個相對簡單的構造方式,因為使用推導式非常簡單,所以大多數都會為之著迷,這個一定要深重,推導式只能構建相對複雜的並且有規律的物件,對於沒有什麼規律,而且巢狀層數比較多(for迴圈超過三層)這樣就不建議大家用推導式構建。
5)生成器的惰性機制: 生成器只有在訪問的時候才取值,說白了.你找他要才給你值.不找他要.他是不會執行的。