優雅、清晰和務實是python的核心價值觀,如果想通過操作和處理乙個序列(或其他的可迭代物件)來建立乙個新
的列表時可以使用列表解析(list comprehensions)和生成表示式,通過這兩個操作,我們可以看到這三個觀點是如何
在python中和諧統一起來的。
#定義階段def my_max(x,y): #定義乙個比較兩個引數大小的函式
max = x if x > y else y #用三元表示式表示
print(max) #列印最大值
#呼叫階段
my_max(1,2) #按位置傳入引數x=1,y=2
----------以下是輸出結果-----------
2
在需要改變列表而不是需要新建某列表時,可以使用列表解析。列表解析表示式為:
[expr for iter_var in iterable][expr for iter_var in iterable if judging condition]
第一種語法:首先迭代iterable裡所有內容,每一次迭代,都把iterable裡相應內容放到iter_var中,再在表示式中應
用該iter_var的內容,最後用表示式的計算值生成乙個列表。
第二種語法:加入了判斷語句,只有滿足條件的內容才把iterable裡相應內容放到iter_var中,再在表示式中應用該
iter_var的內容,最後用表示式的計算值生成乙個列表。
例項如下:
l=['egg%s' %i for i in range(8)] #沒有判斷條件的形式print(l)
l1=['egg%s' %i for i in range(8) if i > 4] #有判斷條件的形式
print(l1)
----------以下是輸出的結果------------
['egg0', 'egg1', 'egg2', 'egg3', 'egg4', 'egg5', 'egg6', 'egg7'] #列表l的結果
['egg5', 'egg6', 'egg7'] #列表l1的結果
以上例子不用列表表示式的話,**如下:
l = #定義l為空列表for i in range(8):
print(l) #列印輸出
-----------------------------輸出結果------------------------------
['egg0', 'egg1', 'egg2', 'egg3', 'egg4', 'egg5', 'egg6', 'egg7']
----------------以下是有判斷條件的-----------------
l1 = #定義l為空列表
for i in range(8):
if i > 4 :
print(l1) #列印輸出
------------輸出結果------------
['egg5', 'egg6', 'egg7']
下面來一段相對複雜的**:
要求:將下面列表l和字串s裡的元素都一一搭配起來。
l = [1,2,3,4]s = "hello"
l1 =
-----------下面是沒有判斷條件的-----------
for i in l : #迴圈列表l
for j in s: #迴圈字串s
t = (i,j) #將得到的值賦值給t
print(l1) #列印輸出
--------------------------------輸出結果----------------------------------
[(1, 'h'), (1, 'e'), (1, 'l'), (1, 'l'), (1, 'o'), (2, 'h'), (2, 'e'),\
(2, 'l'), (2, 'l'), (2, 'o'), (3, 'h'), (3, 'e'), (3, 'l'), (3, 'l'), \
(3, 'o'), (4, 'h'), (4, 'e'), (4, 'l'), (4, 'l'), (4, 'o')]
---------------------------下面是有判斷條件的------------------------------
for i in l : #迴圈列表l
if i > 2 : #加上判斷條件
for j in s: #迴圈字串s
t = (i,j) 將得到的值賦值給t
print(l1) #列印輸出
-------------------輸出結果-------------------
[(3, 'h'), (3, 'e'), (3, 'l'), (3, 'l'), (3, 'o'),\
(4, 'h'), (4, 'e'), (4, 'l'), (4, 'l'), (4, 'o')]
下面用列表表示式來執行:
l = [1,2,3,4]s = "hello"
l1 = [(i,j) for i in l for j in s]
print(l1)
--------------------------------輸出結果--------------------------------
[(1, 'h'), (1, 'e'), (1, 'l'), (1, 'l'), (1, 'o'), (2, 'h'), (2, 'e'),\
(2, 'l'), (2, 'l'), (2, 'o'), (3, 'h'), (3, 'e'), (3, 'l'), (3, 'l'), \
(3, 'o'), (4, 'h'), (4, 'e'), (4, 'l'), (4, 'l'), (4, 'o')]
-------------------------下面是有判斷條件的-------------------------------
l1 = [(i,j) for i in l if i > 2 for j in s]
print(l1)
---------------------輸出結果------------------------
[(3, 'h'), (3, 'e'), (3, 'l'), (3, 'l'), (3, 'o'),\
(4, 'h'), (4, 'e'), (4, 'l'), (4, 'l'), (4, 'o')]
在應用場景中當序列過長, 而每次只需要獲取乙個元素時,應當考慮使用生成器表示式而不是列表解析。生
成器表示式的語法和列表解析一樣,只不過生成器表示式是被()括起來的,而不是,如下:
[expr for iter_var in iterable][expr for iter_var in iterable if judging condition]
語法同上面列表解析,此處略。
例項如下:
g = ("egg%s"%i for i in range(8) if i > 3) #有判斷條件的生成器表示式print(g)
print(next(g)) #手動next1
print(next(g)) #手動next2
for i in g: #自動在g裡使用next方法
print(i) #列印結果
--------------------------以下輸出結果------------------------------
at 0x0000000002532d58> #生成器g的記憶體位址
egg4 #手動next1結果
egg5 #手動next1結果
egg6 #使用for迴圈的結果,因為迭代器是一次性的,so,會接著上面列印
egg7 #使用for迴圈的結果
說明:1、當需要只是執行乙個迴圈的時候盡量使用迴圈而不是列表解析,這樣更符合python提倡的直觀性。
2、當有內建的操作或者型別能夠以更直接的方式實現的,不要使用列表解析。
3、當序列過長, 而每次只需要獲取乙個元素時,使用生成器表示式。
4、列表解析的效能相比要比map要好,實現相同功能的for迴圈效率最差(和列表解析相比差兩倍)。
5、列表解析可以轉換為 for迴圈或者使用map(其中可能會用到filter、lambda函式)表示式,但是列表解析更
為簡單明瞭,後者會帶來更複雜和深層的巢狀。
Python基礎之Lambda表示式
lambda表示式常常用來宣告匿名函式。lambda表示式只可包含乙個表示式,但在表示式中可以呼叫其他函式,該表示式的計算結果相當於函式的返回值。下面 演示lambda表示式的應用。f lambda x,y,z x y z print f 1,2,3 6g lambda x,y 2,z 3 x y ...
python基礎之條件表示式
分支語句 score 98if score 90 print 優秀 elif score 80 print 不錯 elif score 60 print 及格 else print 不及格 a input 請輸入乙個數字 input 函式,從鍵盤讀取使用者的輸入,a是返回值,是字串型別 ifnot ...
Python基礎之正規表示式
1.正則模組匯入 python中內建正規表示式模組,使用正規表示式時應提前匯入該模組 import re 2.正則命令 匹配任意字元 n除外 匹配字串的起始部分 匹配字串的結束部分 連續匹配0次或多次 連續匹配1次或多次 連續匹配0次或1次 或。匹配 左右表示式任意乙個,從左到右匹配,如果 沒有包括...