python基礎知識-8-三元和一行代碼(推導式)

 

python其餘知識目錄html

 

一、三元運算(三目運算)

三元運算符就是在賦值變量的時候,能夠直接加判斷,而後賦值
格式:[on_true] if [expression] else [on_false]
res = 值1 if 條件 else 值2python

其餘語言相似結構:
判段的條件?條件爲真時的結果:條件爲假時的結果shell

賦值一個變量,不知足某個條件就從新賦予另外一個值一行代替四行,簡化代碼express

a = 1
b = 2            #變量值是...,若是不知足那麼值是....。
h = ""
h = "變量1" if a>b else "變量2" #能夠設置默認設置真,不知足某個條件就等於假;能夠默認設置經過,不知足某個條件就不經過,$與shell的那個判斷類似,有時間增長一下
print(h)
------------結果:
變量2

a = 1 #判斷是否爲最大值
b = 2
c = 3
max = a if a>b and a>c else "a不是最大值"
print(max)
-----------結果:
a不是最大值

a = 1 #和上面的對比,也能夠不用變量來接收的打印
b = 2
c = 3
print( a if a>b and a>c else "a不是最大值")
-----------結果:
a不是最大值

a = 7 #求三個數最大值
b = 6
c = 5
print((a if (a > b) else b) if ((a if (a > b) else b) > c) else c)
-------------結果:
7

a = 7
b = 6
c = 5
#print((a if (a > b) else b) if ((a if (a > b) else b) > c) else c)
#      (a if (a > b) else b)     (a if (a > b) else b)
d   = (a if (a > b) else b)
print(d if (d>c) else c)
----------------結果:
7

mcw = [i for i in range(1,11) if i%2==0 ]  #三元運算和列表。將1-10之間的偶數追加到列表
print(mcw)
---------------結果:
[2, 4, 6, 8, 10]

#自我解析:某個事物有兩種變化的時候使用,不知足某個條件就是選第二種變化。舉例子好比:開關的開
和關;奇數是+號,偶數是-號求和;真和假的判斷;做爲一個旗幟等等。
#最終簡化:賦值一個變量,不知足某個條件就從新賦予另外一個值app

 二、實現一行打印代碼的原理(精簡代碼)

2.1基本原理:

li=["","","",""]
print([i for i in li])   
------------------結果:
['', '', '', '']

li=["小","馬","過","河"]
print([i+"*" for i in li]) #一行代碼實現列表循環。i是每一個元素,對i作操做那麼每一個列表元素都會作相同的操做。單行批量對列表元素進行操做。
-----------------------結果:
['小*', '馬*', '過*', '河*']

li=["小","馬","過","河"]
print([i+"*" for i in li if type(li)==list]) #添加條件判斷
---------------------結果:
['小*', '馬*', '過*', '河*']

使用場景:對列表元素批量操做,只須要實現對列表單個元素實現一行執行(上題自變量i就是表明單個自變量,只需考慮對它操做),就能夠實現單行代碼實現有循環的功能

 

2.2精簡案例:

請將ip=192.168.12.79中的四個十進制數轉換成二進制,將四個二進制數拼接成一個二進制數並轉換爲十進制。(注意:12轉換爲二進制位數不滿8位)函數

#精簡以前
ip="192.168.12.79" li=ip.split(".") li2=[] for i in li: m=str(bin(int(i))).lstrip("0b") m="0"*(8-len(m))+m li2.append(m) mcw="".join(li2) print(int(mcw,base=2))
-----------------------結果:
3232238671

#精簡以後
print(int("".join(["0"*(8-len(str(bin(int(i))).lstrip("0b")))+str(bin(int(i))).lstrip("0b") for i in ip.split(".")]),base=2))

 

 2.3單行實現列表元素的批量操做而且if判斷某個條件真假,真假各自返回不一樣結果(三木運算結合列表)

li=["","","",""]        
a=[i+"*" for i in li ]
b=[i+"_" for i in li ]
print(a if "" in li else b)
----------------結果:
['小*', '馬*', '過*', '河*']      #判斷爲真須要返回的結果a


li=["","","",""]      
a=[i+"*" for i in li ]
b=[i+"_" for i in li ]
print(a if "" in li else b)
-------------------結果:
['小_', '馬_', '過_', '河_']      #判斷爲假須要返回的結果b

li=["","","",""]
print([i+"*" for i in li ] if "" in li else [i+"_" for i in li ])    #將a,b變量的值直接替換a,b變量的位置,單行實現功能 -------------結果:
['小*', '馬*', '過*', '河*']

 2.四、單行實現給每一個列表元素加*並加一個序列,使得列表元素對應有序。(兩個不一樣的for循環)

li=["","","",""]
a=[i+"*" for i in li ]
b=[str(j)+" "+a[j] for j in range(0,len(a))]
print(b)
----------------------結果:
['0 小*', '1 馬*', '2 過*', '3 河*']

變量代入代碼後:
li=["","","",""]
print([str(j)+" "+[i+"*" for i in li ][j] for j in range(0,len([i+"*" for i in li ]))])

2.五、if判斷,指定哪一個列表元素作或者不作批量操做

li=["","","",""]
a=[i for i in li if i!=""]
print(a)
-----------------------結果:
['', '', '']

 2.六、列表中能夠用多個for循環,這次演示兩個for循環

a=[str(i)+j  for i in range(1,5) for j in ["","","",""]]
print(a)
--------------------------結果:
['1小', '1馬', '1過', '1河', '2小', '2馬', '2過', '2河', '3小', '3馬', '3過', '3河', '4小', '4馬', '4過', '4河']

 2.七、集合和字典也能夠這樣支持這些操做

a={i for i in range(0,5)}
print(a,type(a))
--------------------------結果:
{0, 1, 2, 3, 4} <class 'set'>
m={i:j for i in range(1,4) for j in range(1,4)}
print(m,type(m))
-----------結果:
{1: 3, 2: 3, 3: 3} <class 'dict'>

2.八、一行代碼實現九九乘法表。讓變量成爲 [for 循環]

a="\n".join(["  ".join(["%s*%s"%(i,j) for j in range(1,i+1)]) for i in range(1,10)])
print(a)
------------------------結果:
1*1
2*1  2*2
3*1  3*2  3*3
4*1  4*2  4*3  4*4
5*1  5*2  5*3  5*4  5*5
6*1  6*2  6*3  6*4  6*5  6*6
7*1  7*2  7*3  7*4  7*5  7*6  7*7
8*1  8*2  8*3  8*4  8*5  8*6  8*7  8*8
9*1  9*2  9*3  9*4  9*5  9*6  9*7  9*8  9*9

 2.10九九乘法表一行實現過程分解

a=[i for i in range(1,5)]
print(a)
b=[["%s*%s"%(i,j) for j in range(1,i+1)] for i in range(1,5)]
print(b)
c=[" ".join(["%s*%s"%(i,j) for j in range(1,i+1)]) for i in range(1,5)]
print(c)
d="\n".join([" ".join(["%s*%s"%(i,j) for j in range(1,i+1)]) for i in range(1,5)])
print(d)
------------------------結果:
[1, 2, 3, 4]
[['1*1'], ['2*1', '2*2'], ['3*1', '3*2', '3*3'], ['4*1', '4*2', '4*3', '4*4']]  #生成嵌套列表
['1*1', '2*1 2*2', '3*1 3*2 3*3', '4*1 4*2 4*3 4*4']#用jion方法將每一個子列表的元素分解成指定分隔符的字符串,造成每行要顯示的內容。已經將每行的內容變成列表元素了 1*1            #每一個列表元素都是一行的內容,用jion方法將每一個元素用換行符拼接起來,實現換行
2*1 2*2
3*1 3*2 3*3
4*1 4*2 4*3 4*4


思路:每行輸出用生成的嵌套子列表,每列輸出用列?????
join能夠實現列表每一個元素換行輸出(換行符做爲分隔符),
join能夠實現每一個列表元素指定分隔符(包括空格符)拼接
jion能夠實現將嵌套子列表生成字符串拼接
列表內循環([i for i in ... ])能夠生成嵌套列表,jion能夠分解列表成字符串。
jion加列表內循環能夠用一行代碼實現有規律的多行打印
jion加列表內循環能夠用一行代碼實現99乘法表等多行的結構

 2.十一、[若是不能返回多個變量,那麼將多個變量放到一個數據類型返回]

題目:(a+b+c=1000,a^2+b^2=c^2,a,b,c屬於整數,求a,b,c的組合。)執行有點慢,1000^3次循環呢post

print([ [a,b,c] for a in range(0,1001) for b in range(0,1001) for c in range(0,1001) if a+b+c==1000 and a**2+b**2==c**2])
---------結果:
[[0, 500, 500], [200, 375, 425], [375, 200, 425], [500, 0, 500]]

 2.十二、列表推導式和字典推導式結合,由此得出將兩個列表元素一個當鍵一個當值作成字典

print([[ i for i in range(3)] for i in range(3)])
print([{"k"+str(i):"v"+str(j) for j in range(3)} for i in range(3)])
print([["k"+str(i)+":"+"v"+str(j) for j in range(3)] for i in range(3)])
print([[{"k"+str(i):"v"+str(j)} for j in range(3)] for i in range(3)])
-------------結果:
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
[{'k0': 'v2'}, {'k1': 'v2'}, {'k2': 'v2'}]
[['k0:v0', 'k0:v1', 'k0:v2'], ['k1:v0', 'k1:v1', 'k1:v2'], ['k2:v0', 'k2:v1', 'k2:v2']]
[[{'k0': 'v0'}, {'k0': 'v1'}, {'k0': 'v2'}], [{'k1': 'v0'}, {'k1': 'v1'}, {'k1': 'v2'}], [{'k2': 'v0'}, {'k2': 'v1'}, {'k2': 'v2'}]]

兩個列表元素一個當鍵一個當值作成字典
li1=["name","age","hobby"]
li2=["mcw,18,study","xiaoma,19,music","yh,10,eat"]
print([[li1[j]+":"+li2[i].split(",")[j] for j in range(0,len(li1))] for i in range(0,len(li2))])
mcw=[{li1[j]:li2[i].split(",")[j] for j in range(0,len(li1))} for i in range(0,len(li2))]
print(mcw)
print(type(mcw[0]))
-------------結果:

[['name:mcw', 'age:18', 'hobby:study'], ['name:xiaoma', 'age:19', 'hobby:music'], ['name:yh', 'age:10', 'hobby:eat']]
[{'name': 'mcw', 'age': '18', 'hobby': 'study'}, {'name': 'xiaoma', 'age': '19', 'hobby': 'music'}, {'name': 'yh', 'age': '10', 'hobby': 'eat'}]
<class 'dict'>url

 2.十二、列表 推導式實現多個條件判斷

若是a=1,輸出m,若是a=2,輸出c,若是不然輸出mspa

原操做:code

a=3
if a==1:
    print("m")
elif a==2:
    print("c")
else:
    print("w")
----------------結果:
w

推導式實現步驟:

a=3
print(["m" if a==1 else ["c" if a==2 else "w"]])
---------------結果:
[['w']]

a=3
print(["m" if a==1 else "".join(["c" if a==2 else "w"])])
--------------結果:
['w']


a=3
print("".join(["m" if a==1 else "".join(["c" if a==2 else "w"])]))
-----------結果:
w

a=2
print("".join(["m" if a==1 else "".join(["c" if a==2 else "w"])]))
----------結果:
c

a=1
print("".join(["m" if a==1 else "".join(["c" if a==2 else "w"])]))
-----------------結果:
m

 2.13生成器推導式:

 

 三、一行定義簡單函數:lambda函數

四、map函數使用

 

進制參考連接:https://www.cnblogs.com/ds-3579/p/5246142.html

相關文章
相關標籤/搜索