喂!这么强悍的五个python内置方法你到现在才说!

liftword1个月前 (03-28)技术文章16

要说起python好用的库,那是多到说也说不完,不过很多都是第三方库。他们除了需要安装,其最麻烦的地方就是打包!

很多时候,你可能打包不顺畅,就是因为其第三方库引用太多,依赖太多导致的。

所以今天我们来隆重介绍五个python内置的标准库,它们十分强大,不需要依赖不需要安装!

1、二分查找

二分查找是一个非常经典的搜索查询方法,如果你自己通过python实现的话,其实还是挺麻烦的。

我们现在需要在一个充满字典的列表中插入一个新的字典,这个列表是有序的,所以很适合二分查找,它的普通实现如下:

def binary_search_right(arr, target):
    left, right = 0, len(arr)
    while left < right:
        mid = (left + right) // 2
        if arr[mid]['id'] <= target:
            left = mid + 1
        else:
            right = mid
    return left


dicts = [{'id': 1}, {'id': 2}, {'id': 6}, {'id': 8}]
data = {'id': 3}
# 获取插入的位置
index = binary_search_right(dicts, data['id'])
print(index)

那么如果通过内置标准库又该如何实现呢?请看代码:

from bisect import bisect_right

dicts = [{'id': 1}, {'id': 2}, {'id': 6}, {'id': 8}]
data = {'id': 3}

ids = [item['id'] for item in dicts]
index = bisect_right(ids, data['id'])
print(index)

怎么样,一下子就把代码量缩减了不少!

2、异常处理

文件处理是我们日常工作不可分割的重要部分,大多情况下我们需要进行文件是否存在的判断才能进行下一步操作,正常代码应该如下:

try:
    with open('test.txt', 'r') as f:
        f.read()
except FileNotFoundError:
    pass

我们需要去通过try来判断文件是否存在,然后通过FileNotFoundError异常来抛出。

其实可以有更方便的方式,请出内置标准库来为你实现:

from contextlib import suppress

with suppress(FileNotFoundError):
    with open('test.txt', 'r') as f:
        f.read()

不需要再写冗长的try代码,仅一个with直接搞定,方便快捷。

3、重复的数列

想象一下,我需要排列出所有1、2、3的组合,那么将会有以下几种排列方式:

  • 1、2、3
  • 1、3、2
  • 2、1、3
  • 2、3、1
  • 3、1、2
  • 3、2、1

我们如何用python去实现它呢?请看代码:

def get_permutations(nums):
    # 如果列表为空,返回空列表
    if not nums:
        return []

    # 如果列表只有一个元素,返回该元素本身
    if len(nums) == 1:
        return [nums]

    # 用于存储所有排列的结果
    result = []

    # 遍历列表中的每个元素
    for i in range(len(nums)):
        # 当前元素
        current_num = nums[i]

        # 剩余元素
        remaining_nums = nums[:i] + nums[i + 1:]

        # 递归获取剩余元素的排列
        for perm in get_permutations(remaining_nums):
            # 将当前元素与剩余元素的排列组合
            result.append([current_num] + perm)

    return result


num_list = [1, 2, 3]
results = get_permutations(num_list)
for res in results:
    print(res)

怎么样,没想到简单的问题,需要这么长的逻辑去实现。还好我们有内置的python库,来吧:

from itertools import permutations


num_list = [1, 2, 3]
results = permutations(num_list)
for res in results:
    print(res)

4、脚本参数

我想很多人开发python脚本,大部分情况下都是直接一个.py脚本完事,一般情况不会去进行打包。那就需要经常使用脚本参数来制定规则,例如python xxx.py -n类似这样的方式,那普通代码是这样的:

import sys

if __name__ == '__main__':
    if '-v' in sys.argv or '--version' in sys.argv:
        print('v3.1')
    elif '-add' in sys.argv:
        index = sys.argv.index('-add') + 1
        try:
            num = int(sys.argv[index])
            print(5 + num)
        except Exception as e:
            print('没有数字')

咱们需要自己去获取及解析传递的参数,相对来说还是很麻烦,还好内置库可以快速实现:

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        prog='项目',
        description='这个项目用来测试',
        epilog='这里是帮助语句底部内容'
    )
    parser.add_argument('-v', '--version', action='store_true', help='查看版本')
    parser.add_argument('-add', '--add', type=int, help='计算加5的和')

    args = parser.parse_args()

    if args.version:
        print('v3.1')

    if args.add:
        print(5 + args.add)

它是基于面向对象的,方便快捷的同时还保持了代码可读性,非常实用。

快捷创建上下文管理

python中有一种写法特别受开发者喜爱,就是with的用法。它使用了上下文管理,方便我们去管理一些操作,例如文件的关闭,socket的关闭等等,正常实现需要实现一个类:

class MyOpen:
    def __init__(self, path='', mode='w'):
        self.file = open(path, mode)

    def __enter__(self):
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

with MyOpen('test.txt', 'r') as f:
    f.read()

那么更简单的操作其实可以用内置库:

from contextlib import contextmanager


@contextmanager
def my_open(path='', mode='w'):
    file = open(path, mode)
    try:
        yield file
    finally:
        file.close()


with my_open('test.txt', 'r') as f:
    f.read()

直接使用@contextmanager装饰器,我们就可以完成上下文管理,实在是太方便了!

结尾

咱们的内置标准库十分强大,还有非常多实用的工具方法等着你去挖掘,如果你喜欢这篇文章,我将继续推出相关系列,请在评论区告诉我吧!

相关文章

Python 算法 01--二分查找

猜数游戏在程序中预设一个 0-9 之间的整数,让用户通过键盘输入所猜的数,如果大于预设的数,显示 “遗憾,太大了”;小于预设的数,显示 “遗憾,太小了”如此循环,直至猜中该数,显示 “预测 N 次,你...

如何用Python实现二分搜索算法

如何用Python实现二分搜索算法二分搜索(Binary Search)是一种高效的查找算法,适用于在有序数组中快速定位目标值。其核心思想是通过不断缩小搜索范围,每次将问题规模减半,时间复杂度为 (O...

如何对日志文件进行二分查找?二分查找工具timecat介绍

今天我要分享一个头条用于对日志文件进行二分查找的工具:timecat。项目地址是:https://github.com/fanfank/timecat安装方式很简单,只要你装了Python 2,那么可...

玩蛇(Python) - 算法:二分查找(Binary Search)

一、二分查找算法介绍二分查找(Binary Search)也称为折半查找,如果一个查找问题能够用一个条件消除一半的查找区域,那么就对目标在特定空间搜索,从而减少查找空间。它是一种在有序数组中查找某一特...

Python中如何使用二分法快速查找数据

平时我们会经常找东西,东西少,随便找下就可以找到了,当东西很多很多的时候,找起来就要花大量的时间。假如你平时摆放的东西很整齐、很有规律,那就方便多了,如果你对所有的东西都编号标记,那可能一下就找出来了...

【程序员常用十算法】二分查找法—5分钟掌握

【上期《ChatGPT写的vs我写的——快速排序算法》出来以后,有不少朋友都在感慨未来怎么办啊,是不是初级程序员这些岗位都可以被取代了?我觉得这是一体两面,可以理解为危机(被取代)、也可以理解为机遇(...