喂!这么强悍的五个python内置方法你到现在才说!
要说起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装饰器,我们就可以完成上下文管理,实在是太方便了!
结尾
咱们的内置标准库十分强大,还有非常多实用的工具方法等着你去挖掘,如果你喜欢这篇文章,我将继续推出相关系列,请在评论区告诉我吧!