注意,摸鱼程序员常用的9个小技巧,早点下班不秃头
9个养生小技巧,祝大家不秃头
- 嗨害大家好鸭! 我是小熊猫~
- 毕竟摸鱼一时爽,一直摸一直爽嘛~
- 一、整理字符串输入
- 二、迭代器切片(Slice)
- 三、跳过可迭代对象的开头
- 四、只包含关键字参数的函数 (kwargs)
- 五、创建支持「with」语句的对象
- 六、用`「slots」`节省内存
- 七、限制`「CPU」`和内存使用量
- 八、控制可以/不可以导入什么
- 九、实现比较运算符的简单方法
嗨害大家好鸭! 我是小熊猫~
作为一个python程序员
小熊猫我鸭每天都在想怎么才能养生
毕竟这头发掉得确实是有点让人害怕
最近从前辈那里习来的8个小技巧
说是能让我小熊猫不秃头,
这种好东西肯定要分享出来给大家快乐快乐~
毕竟摸鱼一时爽,一直摸一直爽嘛~
python其他资料电子书:点击此处跳转文末名片获取
一、整理字符串输入
整理用户输入的问题在编程过程中极为常见。
通常情况下,
将字符转换为小写或大写就够了,
有时你可以使用正则表达式模块「Regex」
完成这项工作。
但是如果问题很复杂,
可能有更好的方法来解决:
user_input = "This\nstring has\tsome whitespaces...\r\n"character_map = {#python学习交流扣扣qun:540305994ord('\n') : ' ',ord('\t') : ' ',ord('\r') : None
}
user_input.translate(character_map) # This string has some whitespaces...
在本例中,
你可以看到空格符「\ n」和「\ t」都被替换成了单个空格,
「\ r」都被删掉了。
这只是个很简单的例子,
我们可以更进一步,
使用「unicodedata」程序包生成大型重映射表,
并使用其中的「combining()」进行生成和映射,
二、迭代器切片(Slice)
如果对迭代器进行切片操作,
会返回一个「TypeError」,
提示生成器对象没有下标,
但是我们可以用一个简单的方案来解决这个问题:
import itertoolss = itertools.islice(range(50), 10, 20) # <itertools.islice object at 0x7f70fab88138>
for val in s:...
我们可以使用「itertools.islice」
创建一个「islice」
对象,
该对象是一个迭代器,
可以产生我们想要的项。
但需要注意的是,
该操作要使用切片之前的所有生成器项,
以及「islice」
对象中的所有项。
三、跳过可迭代对象的开头
有时你要处理一些以不需要的行(如注释)开头的文件。
「itertools」再次提供了一种简单的解决方案:
string_from_file = """
// Author: ...
// License: ...
//
// Date: ...
Actual content...
"""
#python学习交流扣扣qun:540305994
import itertoolsfor line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("\n")):print(line)
这段代码只打印初始注释部分之后的内容。
如果我们只想舍弃可迭代对象的开头部分
(本示例中为开头的注释行),
而又不知道要这部分有多长时,
这种方法就很有用了。
四、只包含关键字参数的函数 (kwargs)
当我们使用下面的函数时,
创建仅仅需要关键字参数
作为输入的函数来提供更清晰的函数定义,
会很有帮助:
def test(*, a, b):passtest("value for a", "value for b") # TypeError: test() takes 0 positional arguments...
test(a="value", b="value 2") # Works...
如你所见,
在关键字参数之前加上一个「」就可以解决这个问题。
如果我们将某些参数放在「」参数之前,
它们显然是位置参数。
五、创建支持「with」语句的对象
举例而言,
我们都知道如何使用「with」语句打开文件或获取锁,
但是我们可以实现自己上下文表达式吗?
是的,
我们可以使用「enter」和「exit」来实现上下文管理协议:
class Connection:def __init__(self):...def __enter__(self):def __exit__(self, type, value, traceback):with Connection() as c:
这是在 Python 中最常见的实现上下文管理的方法,
但是还有更简单的方法:
from contextlib import contextmanager@contextmanager
def tag(name):print(f"<{name}>")yieldprint(f"</{name}>")with tag("h1"):print("This is Title.")
上面这段代码使用
contextmanager
的 manager
装饰器实现了内容管理协议。
在进入 with
块时 tag
函数的第一部分
(在 yield
之前的部分)就已经执行了,
然后with
块才被执行,
最后执行 tag 函数的其余部分。
六、用「slots」
节省内存
如果你曾经编写过一个创建了某种类的大量实例的程序,
那么你可能已经注意到,
你的程序突然需要大量的内存。
那是因为 Python 使用字典来表示类实例的属性,
这使其速度很快,但内存使用效率却不是很高。
通常情况下,这并不是一个严重的问题。
但是,如果你的程序因此受到严重的影响,
不妨试一下「slots」
:
class Person:__slots__ = ["first_name", "last_name", "phone"]def __init__(self, first_name, last_name, phone):self.first_name = first_nameself.last_name = last_nameself.phone = phone
当我们定义了「slots」
属性时,
Python 没有使用字典来表示属性,
而是使用小的固定大小的数组,
这大大减少了每个实例所需的内存。
使用「slots」
也有一些缺点:
我们不能声明任何新的属性,
我们只能使用「slots」
上现有的属性。
而且,带有「slots」
的类不能使用多重继承。
七、限制「CPU」
和内存使用量
如果不是想优化程序对内存或 CPU 的使用率,
而是想直接将其限制为某个确定的数字,
Python 也有一个对应的库可以做到:
import signal
import resource
import osdef time_exceeded(signo, frame):print("CPU exceeded...")raise SystemExit(1)def set_max_runtime(seconds):soft, hard = resource.getrlimit(resource.RLIMIT_CPU)resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))signal.signal(signal.SIGXCPU, time_exceeded)def set_max_memory(size):soft, hard = resource.getrlimit(resource.RLIMIT_AS)resource.setrlimit(resource.RLIMIT_AS, (size, hard))
我们可以看到,在上面的代码片段中,
同时包含设置最大 CPU 运行时间和最大内存使用限制的选项。
在限制 CPU 的运行时间时,
我们首先获得该特定资源(RLIMIT_CPU)的软限制和硬限制,
然后使用通过参数指定的秒数和先前检索到的硬限制来进行设置。
最后,如果 CPU 的运行时间超过了限制,
我们将发出系统退出的信号。
在内存使用方面,我们再次检索软限制和硬限制,
并使用带「size」参数的「setrlimit」和先前检索到的硬限制来设置它。
八、控制可以/不可以导入什么
有些语言有非常明显的机制来导出成员(变量、方法、接口),
例如在 Golang 中只有以大写字母开头的成员被导出。
然而,在 Python 中,
所有成员都会被导出(除非我们使用了「all」
):
def foo():passdef bar():pass__all__ = ["bar"]
在上面这段代码中,
我们知道只有「bar」函数被导出了。
同样,我们可以让「all」为空,
这样就不会导出任何东西,
当从这个模块导入的时候,
会造成「AttributeError」。
九、实现比较运算符的简单方法
为一个类实现所有的比较运算符(如 lt , le , gt , ge
)
是很繁琐的。
有更简单的方法可以做到这一点吗?
这种时候,
「functools.total_ordering」
就是一个很好的帮手:
from functools import total_ordering@total_ordering
class Number:def __init__(self, value):self.value = valuedef __lt__(self, other):return self.value < other.valuedef __eq__(self, other):return self.value == other.valueprint(Number(20) > Number(3))
print(Number(1) < Number(5))
print(Number(15) >= Number(15))
print(Number(10) <= Number(2))
这里的工作原理究竟是怎样的呢?
我们用「total_ordering」
装饰器简化实现对类实例排序的过程。
我们只需要定义「lt」
和「eq」
就可以了,
它们是实现其余操作所需要的最小的操作集合
(这里也体现了装饰器的作用——为我们填补空白)。
相关文章:

注意,摸鱼程序员常用的9个小技巧,早点下班不秃头
9个养生小技巧,祝大家不秃头嗨害大家好鸭! 我是小熊猫~毕竟摸鱼一时爽,一直摸一直爽嘛~一、整理字符串输入二、迭代器切片(Slice)三、跳过可迭代对象的开头四、只包含关键字参数的函数 (kwargs)五、创建支持「with」语…...

【Linux】文件时间-ACM
文章目录文件时间-acmAccessChangeModify文件时间-acm 我们可以使用stat 文件名的方式查看对应的文件的时间信息 Access 表示文件最近一次被访问的时间 文件的访问 实际也就是文件的读取 实际操作中,文件的Access时间可能没有变化,这是因为在新的Linux内核中,Access时间不…...

[架构之路-124]-《软考-系统架构设计师》-操作系统-3-操作系统原理 - IO设备、微内核、嵌入式系统
第11章 操作系统第5节 设备管理/文件管理:IO5.1 文件管理5.2 IO设备管理(内存与IO设备之间)数据传输控制是指如何在内存和IO硬件设备之间传输数据,即:设备何时空闲?设备何时完成数据的传输?SPOO…...

【竞赛/TPU】算能TPU编程竞赛总结
如果觉得我的分享有一定帮助,欢迎关注我的微信公众号 “码农的科研笔记”,了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【竞赛/TPU】算能TPU编程竞赛总结 1 基础知识 1.1【Ubuntu】 Ubuntu操作系统中有很多不同的文件夹,每个…...

Substrate 基础教程(Tutorials) -- 模拟网络 添加可信节点
三、模拟网络 本教程基本介绍了如何使用一个私有验证器(validators)的授权集合来启动私有区块链网络。 Substrate节点模板使用授权共识模型(authority consensus model),该模型将块生产限制为授权帐户的旋转列表(rotating list)。授权帐户(…...
SAP 设置无物料号的费用采购
现在还是以外购电来说一下ERP中费用采购单的使用步骤: (1).Tcode:OMSF定义物料组D1,如下图。 (2).到配置路径IMG Path:物料管理->采购->帐户分配(或直接SE16:V_T163K)定义一科目分配类别,默认的K就是费用采购科目分配类型,如果可能可以复制一个,如下图,注意下…...

k8s ConfigMap 中 subPath 字段和 items 字段
Kubernetes中什么是subPath 有时,在单个 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 属性可用于指定所引用的卷内的子路径,而不是其根路径。 这句话理解了,基本就懂subPath怎么用了,比如我们要替换nginx.cnf, 挂…...

UML建模
主要记录UML中的相关知识,包括类、对象、接口、方法、用例、活动、状态、组件和部署图,详细介绍类之间关系与类图的绘制 文章目录一、UML介绍二、类图类之间的关系依赖关系继承关系实现关系关联关系组合关系聚合关系正文内容: 一、UML介绍 …...
JavaScript常见面试题(更新中)
介绍js的基本数据类型 js一共有五种数据类型 分别是undefined null boolean number string 还有ES6中新增的symbol和ES10的bigInt symbol代表创建后独一无二的不可变的数据类型,他的出现我认为是为了解决可能出现的全局变量冲突的问题 BigInt是一种数字类型的数据 …...

TCP/IP协议
✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录TCP/IP协议应用层协议自定义应用层协议DNS传输层协议端口号UDP协议UDP协议端格式TCP协议TCP协议段格式TCP工作机制确认应答(安…...

Python使用异步线程池实现异步TCP服务器交互
背景: 实现客户端与服务端交互,由于效率原因,要发送与接收异步,提高效率。 需要多线程,本文用线程池管理。 common代码: import pickle import struct import timedef send_msg(conn, data):time.sleep(…...

matplotlib常用操作
文章目录1 matplotlib绘图1.1 绘图步骤2 matplotlib基本元素2.1 matplotlib 画布2.2 设置坐标轴长度和范围2.3 设置图形的线型和颜色2.4 设置图形刻度范围、刻度标签和坐标轴标签等2.4.1 设置刻度范围2.4.2 设置坐标轴刻度2.5 文本标签图例3 matplotlib的ax对象绘图4 绘制子图5…...

二分算法题
文章目录一、在排序数组中查找数字二、0~n-1中缺失的数字三、旋转数组的最小数字四、二维数组中的查找一、在排序数组中查找数字 题目传送门 法一:暴力解 直接遍历然后计数 法二:二分法求边界 看到关键字排序数组、有序数组,一定要想到二分…...

Vue+ElementUI+SpringBoot项目配合分页插件快速实现分页(简单暴力)
首先需要在项目中引入Element-UI的组件库,使用以下命令,不会引入的请自行百度。 npm i element-ui -S Element官网地址:https://element.eleme.cn/#/zh-CN/component/changelog 去Element-UI官网组件库找到合适的分页插件,并把他引…...
【回眸】牛客网刷刷刷!嵌入式软件中也会遇到的嵌入式硬件,通讯,通讯协议专题(一)
前言 最近继续刷题,看看嵌入式软件还需要了解一些嵌入式硬件中的通讯协议和常用接口协议 比如说SPI CAN I2C 通讯协议专题 1.波特率 波特率 每秒传送的字符数 * 字符位数。串口的工作模式为1个起始位,7个数据位,1个校验位,1个…...

使用Vue展示数据(动态查询)
学习内容来源:视频P4 本篇文章进度接着之前的文章进行续写 精简前后端分离项目搭建 Vue基础容器使用 目录选择组件修改表格组件修改分页组件增加后端接口前端请求数据接口页面初始化请求数据点击页码请求数据选择组件 在官方文档中选择现成的组件,放在页…...
构建数据库测试数据——mysql
建表脚本 -- 建表 CREATE TABLE test_table (id INT(11) NOT NULL AUTO_INCREMENT,varchar_col VARCHAR(50),char_col CHAR(10),text_col TEXT,tinyint_col TINYINT(4),smallint_col SMALLINT(6),mediumint_col MEDIUMINT(9),int_col INT(11),bigint_col BIGINT(20),float_col…...

你想要的Android性能优化系列:启动优化 !
App启动优化为什么要做App的启动优化?网页端存在的一个定律叫8秒定律:即指用户访问一个网站时,如果等待打开的时间超过8秒,超过70%的用户将会放弃等待。同样的,移动端也有一个8秒定律:如果一个App的启动时间…...
python3的基础入门3:基本数据类型
基本数据类型 python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号(&…...

消息队列原理与实战-学习笔记
消息队列:保存消息的一个容器,本质是个队列,但是需要支持高吞吐、高并发、高可用。 1 前世今生 1.1 业界消息队列对比 Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色RocketMQ:低延迟、强一致、高性…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...

如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...