1.python中常见技巧

标题说是技巧,其实也是常常遇到的一些问题,有些方法尽管可以解决问题甚至是常用的,但是python提供了更好的解决方法。对应的演示我会注明推荐和不推荐的用法。

判断列表空数据

经常我们需要判断列表是否为空,都是用len判断长度,其实python自动会将空列表判断为False,因此直接判断即可,如下:

def test1():
    arr1 = [1, 2, 3, 4, 5]
    arr2 = []

    # 不推荐
    if len(arr1)!=0:
        print("arr1 is not empty-len!")
    if len(arr2)!=0:
        print("arr2 is not empty-len!")

    # 推荐
    if arr1:
        print("arr1 is not empty!")
    if arr2:
        print("arr2 is not empty!")

字典键值是否存在

经常需要取字典的键对应的值,但是一般我们会先判断键是否存在,然后再取对应值,如果直接取键不存在的字典值会报异常,可以使用get函数,它在键不存在时返回None,甚至我们可以封装一个键不存在时返回默认值的函数,如下:

def test2():
    dict1 = {1:"val1", 2:"val2", 3:"val3", 5:"val5" }
    print(dict1)

    # 不推荐
    for i in xrange(1,6):
        if dict1.has_key(i):
            print("%s->%s\n" %(i, dict1[i]))

    # 推荐
    for i in xrange(1, 6):
        v = dict1.get(i)
        if v:
            print("%s->%s\n" %(i, v))

    print(get_default(dict1, 3, "default"))
    print(get_default(dict1, 4, "default"))


def get_default(dict, key, default):
    v = dict.get(key)
    if v:
        return v
    else:
        return default

遍历同时获取索引

经常会遇到遍历列表同时需要获取当前索引序号的场合,一般我们是按长度生成range/xrange索引来访问,实际上python提供了enumerate函数,它会返回包装后的迭代器,每次调用同时返回当前索引和值,如下:

def test3():
    l1 = [11, 22, 30, 41, 51]

    # 不推荐
    for i in xrange(0, 5):
        print("%s->%s" %(i, l1[i]))

    # 推荐
    for i, v in enumerate(l1):
        print("%s->%s" % (i, v))

同时遍历多个列表

经常需要同时遍历两个列表,取对应值来做操作,一般我们是按长度生成range/xrange索引来分别访问,实际上python提供了zip函数,它会返回包装后的迭代器,每次调用同时返回每个列表的值,如下:

def test4():
    l1 = [11, 22, 30, 41, 51]
    l2 = ["a", "bb", "c", "d", "ee"]

    # 不推荐
    for i in xrange(0, 5):
        print("%s->%s" %(l1[i], l2[i]))

    # 推荐
    for v1, v2 in zip(l1, l2):
        print("%s->%s" % (v1, v2))

字典列表生成式

通常推荐对列表遍历优先使用列表生成式,但是其实字典也支持和推荐优先使用列表生成式,如下:

def test5():
    dict1 = {1: "val1", 2: "val2", 3: "val3", 5: "val5"}

    dict2 = {k*2: v for k, v in dict1.items()}
    print(dict2)

演示代码下载链接

原创,转载请注明来自http://blog.csdn.net/wenzhou1219

猜你喜欢

转载自blog.csdn.net/wenzhou1219/article/details/81274610