盡量用enumerate取代range
#當(dāng)需要循環(huán)的是數(shù)值時可以使用range()
for x in range(10):
pass
#或者獲取列表元素時可直接迭代
food = ['apple','egg','rice']
for x in food:
pass
#而當(dāng)需要元素所在索引時,一般我們用
for x in range(len(food)):
pass
#這樣很生硬
'''
Python內(nèi)置函數(shù)enumerate()可把各種迭代器(包括各種序列及各種支持迭代的對象)包裝為生成器
每次產(chǎn)生一對輸出值,前者表示循環(huán)下標(biāo),后者表示從迭代器中獲取到的下一個序列元素
同時可以有第二個參數(shù),指明開始計數(shù)的索引值,默認(rèn)為0
'''
for i,food in enumerate(food):
print i,food
#輸出
#0 apple
#1 egg
#2 rice
for i,food in enumerate(food,2):
print i,food
#輸出
#2 apple
#3 egg
#4 rice
用zip()同時遍歷兩個迭代器
names = ['tom','jack','jy']
letters = [len(n) for n in names] #注意這里列表推導(dǎo)用法
#要獲取最長的名字及其長度多少
longest_name = None
max_letter = 0
#常規(guī)做法 、看上去比較混亂 不易閱讀
for i in range(len(names)):
count = letters[i]
if count > max_letter:
longest_name = names[i]
max_letter = count
#使用zip
for name,count in zip(names,letters):
if count > max_letter:
longest_name =name
max_letter = count
'''
當(dāng)遍歷的兩個迭代器長度不同時,會在最短的那里停止
python3中zip相當(dāng)于生成器,會在遍歷時逐次產(chǎn)生元組
'''
合理使用try-except-else-finally
如果既要異常向上傳播,又要在異常發(fā)生時執(zhí)行清理工作,可使用try/finally結(jié)構(gòu)
try/except/else結(jié)構(gòu)可以清晰描述哪些異常由自己的代碼處理,哪些傳播到上一級
無論try塊是否異常,都可用try/finally復(fù)合語句的finall塊執(zhí)行清理工作
else塊可縮減try中代碼量,并把沒有異常時要執(zhí)行的語句與try/except隔離開
順利運行try后,若想使某些操作能在finally塊的清理代碼之前執(zhí)行,則可將這些操作寫到else塊中文章來源:http://www.zghlxwxcb.cn/news/detail-424840.html
使用異常表示特殊情況而不要返回None
用None作返回值來表示特殊意義的函數(shù),很容易使調(diào)用者犯錯,因為None和0及空字符串之類的值,在條件表達(dá)式中都會被評估為False。
函數(shù)在遇到特殊情況時,應(yīng)該拋出異常,而不要返回None.調(diào)用者在看到該函數(shù)的文檔中所描述的異常后,應(yīng)該就會編寫相應(yīng)的代碼來處理了。文章來源地址http://www.zghlxwxcb.cn/news/detail-424840.html
閉包里使用外圍作用域中的變量
#對list排序,但是要把出現(xiàn)在某個列表中的數(shù)字排在其他數(shù)字之前
def sort_priority(values,group):
def helper(x):
if x in group:
return (0,x)
return (1,x)
values.sort(key=helper)
numbers = [8,3,1,2,5]
group = {2,3,5}
sort_priority(numbers,group)
print(numbers)
#>>[2, 3, 5, 1, 8]
'''
python支持閉包(closure):閉包是一種定義在某個作用域中的函數(shù),它引用了那個作用域里的變量。
helper之所以能訪問sort_priority的group參數(shù),原因在于它是閉包
python函數(shù)是一級對象,即可直接引用函數(shù)、把函數(shù)賦給變量、把函數(shù)當(dāng)成參數(shù)傳給其他參數(shù),并通過表達(dá)式及if語句對其進(jìn)行比較和判斷。
所以這里可以把helper這個閉包函數(shù)傳給sort的key參數(shù)
python使用特殊的規(guī)則比較兩個元組。首先比較各元組中下標(biāo)為0的對應(yīng)元素,如果相等,再比較下標(biāo)為1 的對應(yīng)元素...以此類推
'''
##########獲取閉包內(nèi)的數(shù)據(jù)
###【python3】###
#nonlocal語句的意思是在給相關(guān)變量賦值時應(yīng)在上層作用域中查找該變量 / 唯一限制在于不能延伸到模塊級別,防止污染全局作用域
#與global相對
def sort_priority3(numbers,group):
found = False
def helper(x):
nonlocal found
if x in group:
found = True #表示是否出現(xiàn)了優(yōu)先級更高的元素。使函數(shù)調(diào)用者能夠做出相應(yīng)處理
return (0,x)
return (1,x)
numbers.sort(key=helper)
return found
#為了防止濫用,只推薦在很簡單的函數(shù)里使用nonlocal
#新浪面試題
li = [lambda :x for x in range(10)]
print(type(li))
print(type(li[0]))
# <class 'list'>
# <class 'function'>
res = li[0]()
print(res)
#輸出:9
#函數(shù)在沒有執(zhí)行前,內(nèi)部代碼不執(zhí)行
#因為x最后循環(huán)成了9,所以每一個return x出來的值都是9
'''
Python中是沒有塊級作用域的,代碼塊里的變量,外部可以調(diào)用;
即使執(zhí)行了一下函數(shù),name的作用域也只是在函數(shù)內(nèi)部,外部依然無法進(jìn)行調(diào)用
'''
##【關(guān)于函數(shù)名】##
'''
假如定義了函數(shù)f1()
那么訪問f1(),就會得到f1()中的返回值
訪問f1,就會得到f1函數(shù)的內(nèi)存地址
'''
到了這里,關(guān)于《Effective Python 編寫高質(zhì)量Python代碼的59個有效方法》學(xué)習(xí)筆記2的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!