Python中的對(duì)象都會(huì)關(guān)聯(lián)一個(gè)真值,所以在if表達(dá)式中判斷是否為False或者是否為空的時(shí)候,是無(wú)需寫(xiě)出明確的表達(dá)式的:
a = True
if a: # 判斷是否為真,相較于 a is True
print('a is True')
if 'sky': # 判斷是否空字符串,相較于 len('sky') > 0
print('birds')
if '': # 判斷是否空字符串,同上
print('Nothing!')
if {}: # 判斷是否空的容器(字典),相較于len({}) > 0
print('Nothing!')
隱式表達(dá)式為False的是如下?tīng)顩r:
– None
– False
– 數(shù)值0
– 空的容器或序列(字符串也是一種序列)
– 用戶自定義類中,如果定義了__len__()或者_(dá)_nonzero__(),并且被調(diào)用后返回0或者False
while循環(huán)
while的就是循環(huán)和if的綜合體,是一種單純的基于條件的循環(huán),本身沒(méi)有遍歷的意思,這是和for_each的本質(zhì)差別,這種區(qū)別比起C/C++中要明確得多,用法如下:
i = 0
while i < 100: # 笑100遍
print("ha")
while True: # 一直笑
print("ha")
函數(shù)、生成器和類
還是從幾個(gè)例子看起:
def say_hello():
print('Hello!')
def greetings(x='Good morning!'):
print(x)
say_hello() # Hello!
greetings() # Good morning!
greetings("What's up!") # What's up!
a = greetings() # 返回值是None
def create_a_list(x, y=2, z=3): # 默認(rèn)參數(shù)項(xiàng)必須放后面
return [x, y, z]
b = create_a_list(1) # [1, 2, 3]
c = create_a_list(3, 3) # [3, 3, 3]
d = create_a_list(6, 7, 8) # [6, 7, 8]
def traverse_args(*args):
for arg in args:
print(arg)
traverse_args(1, 2, 3) # 依次打印1, 2, 3
traverse_args('A', 'B', 'C', 'D') # 依次打印A, B, C, D
def traverse_kargs(**kwargs):
for k, v in kwargs.items():
print(k, v)
traverse_kargs(x=3, y=4, z=5) # 依次打印('x', 3), ('y', 4), ('z', 5)
traverse_kargs(fighter1='Fedor', fighter2='Randleman')
def foo(x, y, *args, **kwargs):
print(x, y)
print(args)
print(kwargs)
# 第一個(gè)pring輸出(1, 2)
# 第二個(gè)print輸出(3, 4, 5)
# 第三個(gè)print輸出{'a': 3, 'b': 'bar'}
foo(1, 2, 3, 4, 5, a=6, b='bar')
其實(shí)和很多語(yǔ)言差不多,括號(hào)里面定義參數(shù),參數(shù)可以有默認(rèn)值,且默認(rèn)值不能在無(wú)默認(rèn)值參數(shù)之前。Python中的返回值用return定義,如果沒(méi)有定義返回值,默認(rèn)返回值是None。參數(shù)的定義可以非常靈活,可以有定義好的固定參數(shù),也可以有可變長(zhǎng)的參數(shù)(args: arguments)和關(guān)鍵字參數(shù)(kargs: keyword arguments)。如果要把這些參數(shù)都混用,則固定參數(shù)在最前,關(guān)鍵字參數(shù)在最后。
Python中萬(wàn)物皆對(duì)象,所以一些情況下函數(shù)也可以當(dāng)成一個(gè)變量似的使用。比如前面小節(jié)中提到的用字典代替switch-case的用法,有的時(shí)候我們要執(zhí)行的不是通過(guò)條件判斷得到對(duì)應(yīng)的變量,而是執(zhí)行某個(gè)動(dòng)作,比如有個(gè)小機(jī)器人在坐標(biāo)(0, 0)處,我們用不同的動(dòng)作控制小機(jī)器人移動(dòng):
moves = ['up', 'left', 'down', 'right']
coord = [0, 0]
for move in moves:
if move == 'up': # 向上,縱坐標(biāo)+1
coord[1] += 1
elif move == 'down': # 向下,縱坐標(biāo)-1
coord[1] -= 1
elif move == 'left': # 向左,橫坐標(biāo)-1
coord[0] -= 1
elif move == 'right': # 向右,橫坐標(biāo)+1
coord[0] += 1
else:
pass
print(coord)
不同條件下對(duì)應(yīng)的是對(duì)坐標(biāo)這個(gè)列表中的值的操作,單純的從字典取值就辦不到了,所以就把函數(shù)作為字典的值,然后用這個(gè)得到的值執(zhí)行相應(yīng)動(dòng)作:
moves = ['up', 'left', 'down', 'right']
def move_up(x): # 定義向上的操作
x[1] += 1
def move_down(x): # 定義向下的操作
x[1] -= 1
def move_left(x): # 定義向左的操作
x[0] -= 1
def move_right(x): # 定義向右的操作
x[0] += 1
# 動(dòng)作和執(zhí)行的函數(shù)關(guān)聯(lián)起來(lái),函數(shù)作為鍵對(duì)應(yīng)的值
actions = {
'up': move_up,
'down': move_down,
'left': move_left,
'right': move_right
}
coord = [0, 0]
for move in moves:
actions[move](coord)
print(coord)
把函數(shù)作為值取到后,直接加一括號(hào)就能使了,這樣做之后起碼在循環(huán)部分看上去很簡(jiǎn)潔。有點(diǎn)C里邊函數(shù)指針的意思,只不過(guò)更簡(jiǎn)單。其實(shí)這種用法在之前講排序的時(shí)候我們已經(jīng)見(jiàn)過(guò)了,就是operator中的itemgetter。itemgetter(1)得到的是一個(gè)可調(diào)用對(duì)象(callable object),和返回下標(biāo)為1的元素的函數(shù)用起來(lái)是一樣的:
def get_val_at_pos_1(x):
return x[1]
heros = [
('Superman', 99),
('Batman', 100),
('Joker', 85)
]
sorted_pairs0 = sorted(heros, key=get_val_at_pos_1)
sorted_pairs1 = sorted(heros, key=lambda x: x[1])
print(sorted_pairs0)
print(sorted_pairs1)
評(píng)論
查看更多