有如下例子程序
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的功能库很多,得最起码的掌握几个,因为很多需求功能都是需要第三方库的
还得继续学习