Python Functools: 几个有意思的工具函数

functools 模块应用于高阶函数,即参数或(和)返回值为其他函数的函数,如装饰器、sorted函数的key参数等。通常来说,此模块功能适用于所有可调用对象。 https://docs.python.org/zh-cn/3/library/functools.html 发现functools里面有几个有意思的函数,记录一下: cmp_to_key 将(旧式的)比较函数转换为新式的 key function . 在类似于 sorted() , min() , max() , heapq.nlargest() , heapq.nsmallest() , itertools.groupby() 等函数的 key 参数中使用。此函数主要用作将 Python 2 程序转换至新版的转换工具,以保持对比较函数的兼容。 比较函数意为一个可调用对象,该对象接受两个参数并比较它们,结果为小于则返回一个负数,相等则返回零,大于则返回一个正数。key function则是一个接受一个参数,并返回另一个用以排序的值的可调用对象。 实例: 使用sorted + cmp_to_key,实现逆序排序 from functools import cmp_to_key def mycmp(a, b): return b - a arr = [1,9,3,7,8,2] arr = sorted(arr, key=cmp_to_key(mycmp)) print(arr) 输出: [9, 8, 7, 3, 2, 1] 一般的 key function 只接受一个参数,使用cmp_to_key,可以实现自定义的排序逻辑,如上述,也可以实现其他逻辑,比较经典的是 leetcode-179最大数,要求我们将数字按照特定的规律排序,然后返回一个长的字符串,参考答案: class Solution: def largestNumber(self, nums: List[int]) -> str: # 第一步:定义比较函数,把最大的放左边 # 第二步:排序 # 第三步:返回结果 def compare(x, y): return int(y+x) - int(x+y) nums = sorted(map(str, nums), key=cmp_to_key(compare)) print(cmp_to_key) return "0" if nums[0]=="0" else ""....

May 5, 2022 · 3 min · LingZihuan

Linux创建简单的systemd服务

参考地址: https://linuxconfig.org/how-to-write-a-simple-systemd-service https://www.freedesktop.org/software/systemd/man/systemd.service.html 前言 systemd是系统的服务和进程的管理工具,在linux系统下,我们使用 ps aux | head,我们可以看到,系统启动的第一个进程就是systemd。 有时候,我们想要让程序运行在后台,而不是一直在前台,开一个终端挂着。(使用nohup可以实现这个) 有时候,想要在开机的时候就自动启动某个服务,比如redis、mysql、nginx这些,这时候,我们就可以将这些程序的启动编写成为一个服务,这样,在系统启动的时候,systemd会自动加载服务配置,然后启动这些服务。 现在,我想要创建一个python jupyter notebook服务。 创建文件 systemd services存在路径 /etc/systemd/system 下,我们在这路径下创建的 .service 文件,都可以作为系统服务运行。 我们创建一个 notebook.service vi notebook.service 文件创建完毕后,我们开始编写里面的内容,一个 .service文件里面包含三个关键部分: Unit, Service, Install Unit 对于一个简单服务来说,我们在 [Unit] 这个块只要写上服务描述就可以了,字段为Description。 [Unit] Description=Jupyter notebook service at port[8080] Serivce [Service] 块是服务配置的集合,这里面的配置声明了该如何去运行这个服务。 [Service] Type=simple ExecStart=/usr/bin/env /root/miniconda3/bin/jupyter notebook Restart=on-failure User=root WorkingDirectory=/tmp/notebook 在Serivce声明中,我们首先要说明这个服务的类型 Type=simple 然后,是最重要的部分,我们需要告诉系统应该去执行什么东西: ExecStart=/usr/bin/env /root/miniconda3/bin/jupyter notebook, 这里,我们指定了执行 jupyter notebook 这个命令,前面加载了用户的环境变量。 随后指定这个服务的重启策略:Restart=on-failure, 我要求的是启动失败后重启 最后,这个服务运行的角色:User=root,以及运行时所在路径: WorkingDirectory=/tmp/notebook...

May 4, 2022 · 1 min · LingZihuan

LeetCode 179:最大数 -- 一道有点意思的题目

今天做了一道有点意思的算法题目,在这里记录下。提交记录 leetcode 179: 最大数 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 示例 1: 输入:nums = [10,2] 输出:“210” 示例 2: 输入:nums = [3,30,34,5,9] 输出:“9534330” 提示: 1 <= nums.length <= 100 0 <= nums[i] <= 109 上最终AC代码: def greater(a, b): # 对比函数,a > b # a, b expect str return int(a + b) - int(b + a) > 0 # 快排 def pivot(arr, low, high): x = arr[high] j = low - 1 for i in range(low, high): if greater2(arr[i], x): j += 1 arr[i], arr[j] = arr[j], arr[i] j += 1 arr[j], arr[high] = arr[high], arr[j] return j def quick_sort(arr, low, high): if low < high: pi = pivot(arr, low, high) quick_sort(arr, low, pi - 1) quick_sort(arr, pi + 1, high) class Solution: def largestNumber(self, nums: List[int]) -> str: nums = [str(n) for n in nums] quick_sort(nums, 0, len(nums) - 1) if nums[0] == '0': return '0' return ''....

April 28, 2022 · 2 min · LingZihuan

Go与Hdf5,数据读写实践

前言 HDF5 (Hierarchical Data Format) 是由美国伊利诺伊大学厄巴纳-香槟分校,是一种跨平台传输的文件格式,存储图像和数据 优势 通用数据模型,可以通过无限多种数据类型表示非常复杂、异构的数据对象和各种各样的元数据 高速原始数据采集 可移植和可扩展,文件大小没有限制 自描述的,不需要外部信息应用程序来解释文件的结构和内容 拥有用于管理、操作、查看和分析数据的开源工具和应用程序软件生态系统 在各种计算平台和编程语言(包括C、C++、Fortran90和Java)上运行的软件库。 参考文章链接: 大数据存储 hdf5简介 实践 环境安装 对于go语言,hdf5已经有了支持的库: gonum/hdf5,我们可以直接安装这个包,并且使用。 需要注意的是,这个包使用了 cgo,依赖了hdf5的C语言库,因此,需要我们自己预先安装,使用centos系统,可以很方便安装,直接使用命令: yum install -y hdf5 hdf5-devel 当然,如果系统没有软件源的话,hdf5也提供了源码安装,下载 hdf5-1.12.1,解压后,执行安装: cd hdf5-1.12.1 ./configure --prefix /usr/local make -j 2 && make install 然后我们初始化一个项目,名为 h5,用于编写go、hdf5 的简单测试用例 mkdir -p ~/go/src/h5 cd ~/go/src/h5 go mod init # 安装 go get -v gonum.org/v1/hdf5 使用 创建文件 func main() { // 创建hdf5文件 f, err := hdf5....

April 23, 2022 · 3 min · LingZihuan

使用python socket实现双向的tcp通信

很久之前玩过的python socket,今天用来做个双向的通信程序。 服务端代码: server.py # coding: utf-8 # tcp stream server import socket import logging import time import datetime as dt from threading import Thread, currentThread # 配置logging logging.basicConfig( level=logging.INFO, format="%(asctime)s%(levelname)s%(process)s%(threadName)s|%(message)s", ) class Server: """ socket 服务端 """ def __init__(self, host='localhost', port=8099): self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._sock.bind((host, port)) self.msg = None def read(self, conn: socket.socket = None): """ 从tcp连接里面读取数据 """ while True: try: data = conn....

April 22, 2022 · 3 min · LingZihuan