python最佳实践指南试题_Python最佳实践指南 阅读笔记
創建將0到19連接起來的字符串1
2
3
4
5
6
7
8nums = []
for n in range(20):
nums.append(str(n))
print "".join(nums)
# 更好的寫法
nums = [str(n) for n in range(20)]
print "".join(nums)
拼接多個已有的字符串1
2
3
4
5
6
7foo = 'foo'
bar = 'bar'
foobar = foo + bar # 好的做法
foo += 'ooo' # 不好的做法, 應該這么做:
foo = ''.join([foo, 'ooo'])
也可以使用 % 格式運算符來連接確定數量的字符串,但 PEP 3101 建議使用 str.format() 替代 % 操作符。1
2
3
4
5
6foo = 'foo'
bar = 'bar'
foobar = '%s%s' % (foo, bar) # 可行
foobar = '{0}{1}'.format(foo, bar) # 更好
foobar = '{foo}{bar}'.format(foo=foo, bar=bar) # 最好
不要重復使用命名1
2
3items = 'a b c d' # 首先指向字符串...
items = items.split(' ') # ...變為列表
items = set(items) # ...再變為集合
重復使用命名對效率并沒有提升:賦值時無論如何都要創建新的對象。然而隨著復雜度的 提升,賦值語句被其他代碼包括 ‘if’ 分支和循環分開,使得更難查明指定變量的類型。 在某些代碼的做法中,例如函數編程,推薦的是從不重復對同一個變量命名賦值。Java 內的實現方式是使用 ‘final’ 關鍵字。Python并沒有 ‘final’ 關鍵字而且這與它的哲學 相悖。盡管如此,避免給同一個變量命名重復賦值仍是是個好的做法,并且有助于掌握 可變與不可變類型的概念。
考慮該不該用任意參數列表(*args)如果一個函數接受的參數列表具有 相同的性質,通常把它定義成一個參數,這個參數是一個列表或者其他任何序列會更清晰。
函數單個出口可能更好當一個函數在其正常過程中有多個主要出口點時,它會變得難以調試和返回其 結果,所以保持單個出口點可能會更好。這也將有助于提取某些代碼路徑,而且多個出口點 很有可能意味著這里需要重構。
1
2
3
4
5
6
7
8
9
10
11def complex_function(a, b, c):
if not a:
return None # 拋出一個異常可能會更好
if not b:
return None # 拋出一個異常可能會更好
# 一些復雜的代碼試著用a,b,c來計算x
# 如果成功了,抵制住返回x的誘惑
if not x:
# 一些關于x的計算的Plan-B
return x
常見Python習語解包
1
2
3
4
5
6for index, item in enumerate(some_list):
# 使用index和item做一些工作
a, b = b, a
a, (b, c) = 1, (2, 3)
創建一個被忽略的變量
1
2filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')
創建一個含N個對象的列表
1four_nones = [None] * 4
創建一個含N個列表的列表
1four_lists = [[] for __ in xrange(4)]
根據列表來創建字符串
1
2letters = ['s', 'p', 'a', 'm']
word = ''.join(letters)
在集合體(collection)中查找一個項
1
2
3
4
5
6
7
8s = set(['s', 'p', 'a', 'm'])
l = ['s', 'p', 'a', 'm']
def lookup_set(s):
return 's' in s
def lookup_list(l):
return 's' in l
在下列場合在使用集合或者字典而不是列表,通常會是個好主意:
集合體中包含大量的項
你將在集合體中重復地查找項
你沒有重復的項
你不需要明確地比較一個值是True,或者None,或者0
糟糕1
2
3
4
5if attr == True:
print 'True!'
if attr == None:
print 'attr is None!'
優雅1
2
3
4
5
6
7
8
9
10
11# 檢查值
if attr:
print 'attr is truthy!'
# 或者做相反的檢查
if not attr:
print 'attr is falsey!'
# or, since None is considered false, explicitly check for it
if attr is None:
print 'attr is None!'
訪問字典元素
糟糕1
2
3
4
5d = {'hello': 'world'}
if d.has_key('hello'):
print d['hello'] # 打印 'world'
else:
print 'default_value'
優雅1
2
3
4
5
6
7
8d = {'hello': 'world'}
print d.get('hello', 'default_value') # 打印 'world'
print d.get('thingy', 'default_value') # 打印 'default_value'
# Or:
if 'hello' in d:
print d['hello']
在每次函數調用中,通過使用指示沒有提供參數的默認參數 None 通常是 個好選擇),來創建一個新的對象。
舉例:1
2
3def append_to(element, to=[]):
to.append(element)
return to
你可能認為
1
2
3
4
5my_list = append_to(12)
print my_list # [12]
my_other_list = append_to(42)
print my_other_list # [42]
實際結果為
1
2
3# [12]
# [12, 42]
當函數被定義時,一個新的列表就被創建一次 ,而且同一個列表在每次成功的調用中都被使用。
當函數被定義時,Python的默認參數就被創建 一次,而不是每次調用函數的時候創建。 這意味著,如果你使用一個可變默認參數并改變了它,你 將會 在未來所有對此函數的 調用中改變這個對象。
遲綁定閉包
舉例1
2
3
4
5def create_multipliers():
return [lambda x : i * x for i in range(5)]
for multiplier in create_multipliers():
print multiplier(2)
你期望的結果
1
2
3
4
50
2
4
6
8
實際結果
1
2
3
4
58
8
8
8
8
五個函數被創建了,它們全都用4乘以 x 。
Python的閉包是 遲綁定 。 這意味著閉包中用到的變量的值,是在內部函數被調用時查詢得到的。
這里,不論 任何 返回的函數是如何被調用的, i 的值是調用時在周圍作用域中查詢到的。 接著,循環完成, i 的值最終變成了4。
這個陷阱并不和 lambda 有關,不通定義也會這樣1
2
3
4
5
6
7
8
9def create_multipliers():
multipliers = []
for i in range(5):
def multiplier(x):
return i * x
multipliers.append(multiplier)
return multipliers
解決方案
最一般的解決方案可以說是有點取巧(hack)。由于 Python 擁有為函數默認參數 賦值的行為,你可以創建一個立即綁定參數的閉包,像下面這樣:
1
2def create_multipliers():
return [lambda x, i=i : i * x for i in range(5)]
或者,可以使用 function.partial 函數
1
2
3
4
5from functools import partial
from operator import mul
def create_multipliers():
return [partial(mul, i) for i in range(5)]
標簽:指南,None,return,attr,Python,筆記,print,bar,foo
來源: https://www.cnblogs.com/wangziqiang123/p/11618234.html
總結
以上是生活随笔為你收集整理的python最佳实践指南试题_Python最佳实践指南 阅读笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: activity 变成后台进程后被杀死_
- 下一篇: keil3如何放大字体_keil3如何设