python 閱讀github上某項目所得總結

有如下例子程序

a = [1, 2, 3]
b = (1, 2, 3)

if isinstance(a, (list, tuple)):
	print('1.ok')
else:
	print('1.error')

if isinstance(b, (list, tuple)):
	print('2.ok')
else:
	print('2.error')

if isinstance(a, (tuple, dict)):
	print('3.ok')
else:
	print('3.error')

if isinstance(b, (list, dict)):
	print('4.ok')
else:
	print('4.error')

if isinstance(a, (list, )):
	print('5.ok')
else:
	print('5.error')

if isinstance(a, (list)):
	print('6.ok')
else:
	print('6.error')
輸出:

1.ok
2.ok
3.error
4.error
5.ok
6.ok
得出結論:isinstance的第二個參數可以是個元組,若第一個參數是這個元組中的任意值,則isinstance就返回真。最後的兩個例子說明了,這兩種寫法等同於直接就寫個'list'

再看下個例子

example = 'example'
result = example.split()

print(type(result))
輸出:

<type 'list'>
可以看出一個特性:字符串經過split後,結果變成了一個list,內容沒有刻意打印,其實是['example']

繼續下個例子程序:

class Test:
	def __init__(self):
		pass

	def function(self):
		print('function')

t = Test()
res = reduce(getattr, ['function'], t)
res()
這個程序利用了reduce函數的特性。

reduce內部會有一個迭代的過程,而迭代的次數由第二個參數決定,此處可以看出,第二個參數是隻有一個元素的list,所以可以肯定,reduce內部只迭代一次。而迭代的內容爲將t和第二個參數的元素(此處爲字符串‘function’)作爲第一個參數函數的參數。其實此處的getattr函數可以類比爲一個lambda d, x : d[x]。

reduce迭代一次後結束返回getattr的值,其實就是Test中於字符串'function'匹配的函數,最後一句當然是調用這個函數了

最後一個例子程序

from operator import attrgetter, itemgetter

ma_li = [{'a': 1, 'b': 1}, {'a': 2, 'b': 2}]
ma_li2 = [[1, 3, 3], [4, 2, 1], [3, 5, 4]]

print(sorted(ma_li, key=itemgetter('b'), reverse=False))
print(sorted(ma_li2, key=itemgetter(1), reverse=False))

class Taste:
	def __init__(self, a, b, c):
		self.a = a
		self.b = b
		self.c = c

	def __repr__(self):
		return '{} {} {}'.format(self.a, self.b, self. c)


ma_li3 = [Taste(1, 2, 3), Taste(1, 1, 2), Taste(3, 5, 5)]

print(sorted(ma_li3, key=attrgetter('b'), reverse=False))
這個例子是關於使用sorted函數對列表內容元素進行排序的時候,如何施以排序規則

輸出:

[{'a': 1, 'b': 1}, {'a': 2, 'b': 2}]
[[4, 2, 1], [1, 3, 3], [3, 5, 4]]
[1 1 2, 1 2 3, 3 5 5]
總結:

若想學通python,那麼必須理解python的屬性機制,最近看的很多github上面的開源程序,大多都是利用了屬性__dict__來完成了很多功能。其次python的功能庫很多,得最起碼的掌握幾個,因爲很多需求功能都是需要第三方庫的

還得繼續學習


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章