天天看點

Python條件、循環和其他語句概述

1.序列解包

當函數或方法傳回元組(或其他序列或可疊代對象時),可使用該特性

#分别指派
x,y,z=1,2,3
x,y=[1,2]
x,y=(1,2)
x,y={'ti':2,'an':4}	#x:'ti'   y:'an',隻傳回鍵

#交換變量值
x,y=y,x
print(x,y,z)		#2 1 3

#定義字典并随機彈出鍵值對,序列解包給m,n
x=dict()
x[12]=['12',12,'12']
x['tt']='12'
x.popitem()	--傳回一個元組(鍵+鍵值)
m,n=x.popitem()

m,n,*q=[1,2,3,4]		#q為清單[3,4]
*q,m,n=[1,2,3,4]		#q為清單[1,2]
           

2.鍊式指派

x=y=2
#等價于
x=2
y=x
           

3.條件執行與if語句

x=int(input("enter number:"))
if x>12:
 print(1)
elif (x>5 and x<=8):
 print(12)
else:
 print(50)
           

4.語句中設定斷點

#確定程式中某個條件必須為真才能繼續運作
assert expression1 expression2		#檢查表達式expression1的正确性,True則繼續運作,False則傳回表達式expression2的值(expression2為字元串時則直接傳回,為表達式時傳回布爾值)

a=2
assert 10<a,"a must bigger than 10"
g=100

#斷點傳回True
a=2;b=1
assert a>5,b>0
c=23
           

5.循環中的else子句

from math import sqrt
else_print=False
for j in range(99,81,-1):
    if sqrt(j)==int(sqrt(j)):
        else_print=True
        print(j)
        break
if not else_print:
   print('not found')
#上面的條件判斷語句可修改為
#循環(while或for循環均可)中增加else子句,僅在沒有調用break語句時執行
from math import sqrt
for j in range(99,81,-1):
    if sqrt(j)==int(sqrt(j)):
        print(j)
        break
else:
   print('not found')
           

6.清單推導式

清單推導式是利用其它清單建立新的清單,工作方式類似于for循環

[x*x for x in range(10)]
#隻列印range(10)元素中平方能被3整除的數
[x*x for x in range(10) if (x**2 % 3==0)]

#增加更多的for語句
[(x,y) for x in range(2) for y in range(3)]
#輸出[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

[(x,y) for x in range(2) for y in range(3) if x==y]	#[(0, 0), (1, 1)]

#篩選girls清單和boys清單中首字母相同的集合
girls=['ab','ah','cd','gg']
boys=['ac','gd','yy']
lettersgirls={}
for girl in girls:
    lettersgirls.setdefault(girl[0],[]).append(girl)

print([b+'+'+lettersgirls[g][0] for b in boys for g in lettersgirls if b[0]==g])



girls=['ab','ah','cd','gg']
boys=['ac','gd','yy']
lettersgirls={}
for girl in girls:
    lettersgirls.setdefault(girl[0],[]).append(girl)

print([value for b in boys for (key,value) in lettersgirls.items() if b[0]==key])
#輸出[['ab', 'ah'], ['gg']]
           

7.pass語句

程式什麼事情都不用做,pass語句可在程式中起到占位符的作用(在Python中空代碼塊是非法的)

name='gg'
if name=='pp':
    print(name)
elif name=='ppp':
    pass
elif name=='gg':
    print('haha')
           

8.del語句剖析

tian={'gg':1,'pp':2}
tian_tem=tian
tian=[1,2,3]
del tian_tem['pp']
del tian[0]
print(tian_tem)
print(tian)
#tian與tian_tem被綁定到同一字典上,但将tian設定為新清單時,字典通過tian_tem仍然是可用的
#{'gg': 1, 'pp': 2}
           

但如果将tian_tem也設定為新對象,字典就飄在記憶體中(沒有與任何對象名字綁定),Python解釋器會直接删除該字典

del語句不僅會移除對象引用,也會移除對象名字本身

tian=tian_tem=[1,2]
tian[1]=3
del tian
print(tian_tem)
#[1,3]
           

9.exec+eval

9.1.exec

exec函數以執行Python程式相同的方式來執行字元串,即執行一系列Python語句但不傳回任何對象,因為其本身就是語句

為防止命名空間的互相幹擾,可增加一個字典起到命名空間的作用

from math import sqrt
sqrt(4)
scope={}
exec("scope['sqrt']=1")
print(scope)

#或可使用以下簡潔方式,scope是作用域
from math import sqrt
print(sqrt(4))
scope={}
exec("sqrt=1",scope)
print(scope['sqrt'])
           

9.2.eval

eval計算Python表達式并傳回結果值

#scope是作用域
scope={}
exec('x=2',scope)
print(eval('x*x',scope))