技术交流QQ群:1027579432,欢迎你的加入!

Python3中一些有用的函数

  • 1.根据两个列表创建一个字典
    prod_id = [1, 2, 3]
    prod_name = ["foo", "bar", "baz"]
    prod_dict = dict(zip(prod_id, prod_name))
    print("prod_dict:", prod_dict)
  • 2.从一个列表中删除重复值,并保持原始列表中元素的顺序
    from collections import OrderedDict

    nums = [1, 2, 4, 3, 0, 4, 1, 2, 5]
    result = list(OrderedDict.fromkeys(nums))
    print("result:", result)
  • 3.创建一个多级字典
    from collections import defaultdict

    def multi_level_dict():
        return defaultdict(multi_level_dict)


    d = multi_level_dict()
    d['a']['a']['y'] = 2
    d['b']['c']['a'] = 66
    d['x']['z'] = 4
    print("d:", d)
  • 4.首项匹配
    nums = [1, 2, 4, 0, 5]
    first_match = next(i for i in nums if i > 3)
    print("first match:", first_match)
  • 上面的首项匹配时,如果没有找到任何符合条件的匹配值时,将会抛出StopIteration异常;为了捕捉到这个异常,可以自定义first_matched函数
    def first_matched(iterable, check_condition, default_value=None):
        return next((i for i in iterable if check_condition(i)), default_value)


    first_match = first_matched(nums, lambda x: x > 3)
    print("first match:", first_match)

    first_match = first_matched(nums, lambda x: x > 9, 'no_match')
    print("first match:", first_match)
  • 5.查找集合Set的所有子集subset
    import itertools as it


    def powerset(iterable):
        s = list(iterable)
        return it.chain.from_iterable(it.combinations(s, r) for r in range(len(s) + 1))


    list1 = list(powerset([1, 2, 3]))
    print(list1)
  • 6.定时器装饰器函数
    from time import time
    from functools import wraps

    # 装饰器函数


    def timeit(func):
        """
            参数func:被修饰的函数名
            返回值:被定时器进行装饰的函数
        """
        @wraps(func)
        def wrapper(*args, **kwargs):
            start = time()
            result = func(*args, **kwargs)
            end = time()
            print("函数{}的执行时间是:{: .4f}s".format(func.__name__, end - start))
            return result
        return wrapper


    # 实例如下:
    import random


    @timeit
    def sort_rnd_num():   # 被修饰函数
        numbers = [random.randint(100, 200) for _ in range(100000)]
        numbers.sort()
        return numbers


    numbers = sort_rnd_num()
    print("numbers:", numbers)
  • 7.计算文件有多少行
    def file_len(file_name, encoding="utf8"):
        with open(file_name, encoding=encoding) as f:
            i = -1
            for i, line in enumerate(f):
                pass
            return i + 1


    from pathlib import Path
    p = Path()

    path = p.resolve()  # 类似于os.path.abspath
    print(sum(file_len(f) for f in path.glob('*.py')))