循環(huán)技巧
當(dāng)遍歷字典的時(shí)候驱还,可以同時(shí)使用items()
方法檢索
>>> knights = {"galahad":"the pure","robinhood":"the brave","guan yu":"loyal"}
>>> for k,v in knights.items():
print(k,v)
galahad the pure
robinhood the brave
guan yu loyal
當(dāng)遍歷序列的時(shí)候,index索引和相關(guān)值可以用enumerate()
函數(shù)
>>> for i ,v in enumerate(list(zip(knights))):
print(i,v)
0 ('galahad',)
1 ('robinhood',)
2 ('guan yu',)
# 普通列表
>>> for i,v in enumerate(["one","two","three"]):
print(i,v)
0 one
1 two
2 three
同時(shí)遍歷多個(gè)以上的序列時(shí),可以用zip()
函數(shù)配對
>>> list1 = ["zhangsan","lisi","wangwu"]
>>> list2 = ["yes","no","fuck,I am zhangsan"]
>>> for question,answer in zip(list1,list2):
print("Are you {0}? {1}".format(question,answer))
Are you zhangsan? yes
Are you lisi? no
Are you wangwu? fuck,I am zhangsan
要對序列進(jìn)行反向循環(huán)胀莹,首先指定正向序列,然后調(diào)用reversed
函數(shù)婚温。
>>> for num in reversed(range(0,30,6)):
print(num)
24
18
12
6
0
# 普通list反轉(zhuǎn)
>>> nums = [1,2,3,4,5,6,7]
>>> for num in reversed(nums):
print(num)
7
6
5
4
3
2
1
遍歷一個(gè)序列排序的順序描焰,用sorted()
函數(shù),保持原列表的同時(shí)栅螟,還會返回一個(gè)新的排序列表荆秦。
# 先打亂nums list
>>> from random import shuffle
>>> shuffle(nums)
>>> nums
[2, 7, 3, 6, 1, 4, 5]
# 然后對其進(jìn)行排序循環(huán)
# 這里的排序僅對本次循環(huán)有效
>>> for num in sorted(nums):
print(num)
1
2
3
4
5
6
7
# 原list不變
>>> nums
[2, 7, 3, 6, 1, 4, 5]
有時(shí)對列表進(jìn)行循環(huán)時(shí),改變列表很容易力图,但是創(chuàng)建一個(gè)新的列表通常也會更容易步绸,更安全。
>>> nums = nums + [2,8,2,0,11]
>>> nums
[2, 7, 3, 6, 1, 4, 5, 2, 8, 2, 0, 11]
>>> newnums = []
>>> for i in nums:
if i != 2 and i in range(0,10):
newnums.append(i)
>>> newnums
[7, 3, 6, 1, 4, 5, 8, 0]
深入條件控制
在Python中吃媒,與C不同瓤介,賦值不能發(fā)生在表達(dá)式中.
條件語句
在while
和if
語句中,可以包含任何運(yùn)算符赘那,而不只是比較運(yùn)算符刑桑。
比較運(yùn)算符
in
和not in
檢查一個(gè)值是否在序列中出現(xiàn)is
和is not
比較兩個(gè)對象是否完全相同的對象,這只在list之類的可變對象中生效。所有的比較運(yùn)算符都具有相同的優(yōu)先級募舟,比所有數(shù)字運(yùn)算符都要低祠斧。
連續(xù)比較:
a < b == c
,檢驗(yàn)a
是否小于b
拱礁,且b = c
Boolean運(yùn)算符
比較的時(shí)候也可以用Boolean運(yùn)算符
and
或者or
琢锋,并且比較結(jié)果可以用not
否定,他們的優(yōu)先級比比較運(yùn)算符低not是最高優(yōu)先級呢灶,or是最低的吩蔑,所以
A and not B or C
相當(dāng)于(A and (not B)) or C
,當(dāng)然填抬,也可以直接用圓括號表達(dá)烛芬,為了提高可讀性,個(gè)人建議還是用圓括號吧and
和or
也可以稱為斷路運(yùn)算符,相當(dāng)于java中的&&
和||
赘娄。這些參數(shù)是從左到右進(jìn)行評估的
可以將比較或其他布爾表達(dá)式的結(jié)果分配給變量仆潮。
# string1 是空字符串,所以string2賦值給test
>>> string1,string2,string3 = "","one","two"
>>> test = string1 or string2 or string3
>>> test
'one'
比較序列和其它類型
序列對象可以與具有相同序列類型的其他對象進(jìn)行比較遣臼。
比較使用字典順序排序:
首先比較前兩項(xiàng)性置,如果它們不同,就決定了比較的結(jié)果; 如果它們相等揍堰,則繼續(xù)比較鹏浅,直到兩個(gè)序列都耗盡為止。
如果要比較的兩個(gè)項(xiàng)目本身是同一類型的序列屏歹,則遞歸比較隐砸,如果兩個(gè)序列的所有項(xiàng)都比較相等,那么序列就被認(rèn)為是相等的蝙眶。
如果一個(gè)序列是另一個(gè)的初始子序列季希,那么較短的序列就是較小的序列。
將不同類型的對象與<
或>
進(jìn)行比較是合法的幽纷,前提是對象具有適當(dāng)?shù)谋容^方法式塌。例如,混合數(shù)值類型是根據(jù)它們的數(shù)字值進(jìn)行比較的友浸,因此0 = 0.0
峰尝,等等。否則收恢,解釋器將會拋出一個(gè)類型錯(cuò)誤異常TypeError
境析,而不是提供任意的排序。