内置函数

enumerate

enumerate(list[,start=0]):遍历list,并索引

my_list = ['apple', 'banana', 'grapes', 'pear']
for i, value in enumerate(my_list, 1):
    print(i, value)

输出:

(1, 'apple')
(2, 'banana')
(3, 'grapes')
(4, 'pear')

divmod(x,y)

如果 xint,返回x÷y的商和余数组成的元组,(x//y, x%y)
如果 xfloat,则返回 (math.floor(x / y), x%y)

可以以此很方便的形成二维数组:

>>>[divmod(i, 3) for i in range(9)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

短路求值

三元运算

利用 python 逻辑运算的短路求值特性,我们可以实现python不支持的三元运算符 bool ? a : b

bool and a or b     # 其中要求 a, b 为真

当然有更pythonic 的实现方法:

a if bool else b

and 与 or 优先级

True or True and False    #=> True

造成结果为True的原因是因为短路求值,不是因为存在臆想中的优先级问题--True or (True and False),orand` 一起使用,遵循自左向右计算原则。

参见:短路求值

装饰器

示例1:

table = [i * i for i in range(5)]

或:

def call(*argv, **kwargs):
    def call_fn(fn):
        return fn(*argv, **kwargs)
    return call_fn
@call(5)
def table(n):
    value = []
    for i in range(n):
        value.append(i*i)
    return value

或:

@list
@call(5)
def table(n):
    for i in range(n):
        yield i * i

结果:

len(table), table[3]    #=> (5, 9)

数组(List)

转置矩阵

m = [[1,2],[3,4]]
zip(*m)

碾平list

a = [1, 2, [3, 4], [[5, 6], [7, 8]]]
flatten = lambda x: [y for l in x for y in flatten(l)] \
    if type(x) is list else [x]
flatten(a)
# [1,2,3,4,5,6,7,8]

list分组

a=[3, 8, 9, 4, 1, 10, 6, 7, 2, 5]
print([a[i:i+3] for i in range(0,len(a),3)])
# [[3, 8, 9], [4, 1, 10], [6, 7, 2], [5]]

字典(Dict)

key,value互换

m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
{v: k for k, v in m.items()}
# {1: 'a', 2: 'b', 3: 'c', 4: 'd'}

Dict.get()

dict.get(key[, default=None]): 如果key存在,返回dict[key],否则返回defaultdefault默认值为None。相比较,dict['key'] 只能获取 dict 中存在的key的值,如果不存在则触发 KeyError。利用此方法,在对字典进行某些运算时会更优雅:

if key not in dct:
    dct[key] = 0
dct[key] = dct[key] + 1
dct[key] = dct.get(key, 0) + 1
d = {
    'a': 1,
    'b': 2,
}
d.get('c', 3)   #=> 3

Dict.setdefault()

Dict.setdefault(key, default):如果存在,返回 dct[key],不存在则把 dct[key] 设为 default 并返回它。当一个默认的值是一个你可以修改的对象的时候这是很有用的。

dct = {}
for key, value in data:
    if key in dct:
        dct[key].append(value)
    else:
        dct[key] = [value]
dct = {}
for (key, value) in data:
    group = dct.setdefault(key, []) # key might exist already
    group.append(value)

参见:Python:字典的剧本


l1xnan
549 声望19 粉丝

每天进步一点点……