Python基礎之關於表示式

2022-05-04 06:51:11 字數 4200 閱讀 3281

優雅、清晰和務實是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次 或。匹配 左右表示式任意乙個,從左到右匹配,如果 沒有包括...