aardio教程五) 写Python风格的aardio代码(字符串篇)

前言

熟悉一个新的语言最麻烦的就是需要了解一些库的使用,特别是基础库的使用。

所以我想给aardio封装一个Python风格的库,Python里的基础库是什么方法名,aardio里也封装同样的方法名。

这样就不需要单独去了解aardio里一些方法的使用细节,可以很方便的将Python代码改成aardio代码。

语法差异

不过因为语法上有差异,使用上不能做到完全一模一样。比如Python字符串是可迭代的,而aardio并不能迭代类,aardio中的迭代器是函数。

另外,有些函数较为复杂,我只实现最基本的意思,比如Python的isdigitisnumeric是检测字符串是否全是数字,它的数字还包含一些其他语言的数字,不只是0-9的10个阿拉伯数字。

下载地址

库名就叫pyaardio,然后封装字符串的库就是pyaardio.str,封装列表的库就是pyaardio.list。目前只实现了pyaardio.str,欢迎大家提bug

下载库的代码可以到上一篇文章里(aardio教程) 搭建自己的扩展库仓库 )的扩展库下载,或者在上篇文章里的github也能看到完整代码,。

Python字符串方法

简单使用
import console; 
import pyaardio.str;var s0 = pyaardio.str("你好");
console.log("center: " , s0.center(10, "#"));var s1 = pyaardio.str("swafdrerswfdccswwscsasw");
console.log("count: " , s1.count("sw"));
console.log("endswith: ", s1.endswith("sw"))
console.log("find: ", s1.find("ers"))
console.pause(true);

具体实现

首先定义一个类:

namespace pyaardio;class str{ctor(s){this.rawStr = s;}@_metaProperty;
}

这里只给前几个方法的具体实现,不然文章就太长了,感兴趣的可以看库的代码

capitalize()

功能:将字符串的第一个字符转换为大写,其余字符转换为小写

capitalize = function(){var ss = string.trimleft(owner.rawStr);var s1 = string.slice(ss,1,1,true); // 取第一个字符var s0 = string.slice(ss,2,,true); // 取后面的字符var newStr = table.clone(owner); // 因为无法在内部实例化pyaardio.str类,所以只能拷贝自身// 第一个字符串大写,后面小写newStr.rawStr = string.upper(s1) + string.lower(s0);return newStr;
};
casefold()

功能: 将字符串转换为小写,用于不区分大小写的匹配

这里我就当它是lower来实现:

casefold = function(){var newStr = table.clone(owner);newStr.rawStr = string.lower(owner.rawStr);return newStr;
};
center(width, fillchar)

功能: 将字符串居中,并使用指定字符填充至长度width

center = function(width, fillchar=" "){var ss = owner.rawStr;var len = string.len(ss);// 如果fillchar类型也是pyaardio.str,则取它的实际字符串if(type(fillchar) == type(owner)) fillchar = fillchar.rawStr;// 如果fillchar给定的不是字符串或长度不等于1if(type(fillchar) != type.string || string.len(fillchar) != 1) return;if(!len){ // 如果本身自己就是空字符串,就返回width个fillchar字符var newStr = table.clone(owner);newStr.rawStr = fillchar;return newStr*width; }if(width <= len){ return owner;}var paddingSize = width - len;// 计算左右需要填充的长度var leftPaddingSize = ..math.floor(paddingSize/2);var rightPaddingSize = paddingSize - leftPaddingSize;// 拼接字符串var leftStr = table.clone(owner);leftStr.rawStr = fillchar;var rightStr = table.clone(owner);rightStr.rawStr = fillchar;return leftStr*leftPaddingSize + owner + rightStr*rightPaddingSize;
};
count(sub, start=..., end=...)

功能: 返回sub在字符串里出现的次数,可以指定开始和结束位置

count = function(sub,i,j){if(type(sub) == type(owner)) sub = sub.rawStr;var len = string.len(owner.rawStr);// aardio中索引是1开头,这里我们遵循Python的规范(0开始)i,j = formatSlice(i,j,len);if(!j) return 0;var count = 0;var pos;var subLen = string.len(sub);while(i<j){pos = owner.find(sub,i,j);if(pos == -1) break;count += 1;i = pos + subLen;if(i+subLen>len) break;}return count;
};
endswith(suffix, start=..., end=...)

功能: 检查字符串是否以指定的后缀结束

endswith = function(suffix,i,j){var len = string.len(owner.rawStr);i,j = formatSlice(i,j,len);if(!j) return false;var s = string.slice(owner.rawStr, i+1,j,true);return string.endWith(s,suffix);
};
expandtabs(tabsize=8)

功能: 将字符串中的tab符号('\t')转换为指定数量的空格

expandtabs = function(tabsize=8){var spaceStr = table.clone(owner);spaceStr.rawStr = " ";var space = spaceStr*tabsize;return string.replace(owner.rawStr,"\t",space.rawStr);
};
find(sub, start=..., end=...)

功能: 查找sub在字符串中的第一个出现位置,找不到时返回-1

find = function(sub,i,j){if(type(sub) == type(owner)) sub = sub.rawStr;var s = owner.rawStr;var len = string.len(s);i,j = formatSlice(i,j,len);if(!j) return -1;s = string.slice(s,1,j,true); if(i+string.len(sub) > len) return -1;var si,sj = string.find(s,"@"+sub,i+1,true);if(!si) si = 0;return si-1;
};
其他方法
  • format(*args, kwargs): 格式化字符串, 我只实现{变量}和{0}两种格式
  • format_map(mapping): 使用字典来格式化字符串
  • index(sub, start=..., end=...): 和find类似,但找不到子字符串时会抛出ValueError, aardio中我实现和find一样
  • isalnum(): 检查字符串是否由字母和数字组成
  • isalpha(): 检查字符串是否只包含字母
  • isascii(): 检查字符串是否只包含ASCII字符
  • isdecimal(): 检查字符串是否只包含十进制字符
  • isdigit(): 检查字符串是否只由数字组成
  • isidentifier(): 检查字符串是否是有效的标识符名
  • islower(): 检查字符串中所有字母是否都是小写
  • isnumeric(): 检查字符串中是否所有字符都是数字字符
  • isprintable(): 检查字符串中所有字符是否都是可打印的
  • isspace():检查字符串是否只包含空白字符
  • istitle(): 检查字符串是否为标题化的(所有单词的首字母大写,其余字母小写)
  • isupper(): 检查字符串中的所有字母是否都是大写
  • join(iterable): 将iterable中的字符串合并成一个字符串
  • ljust(width, fillchar): 返回左对齐字符串,并使用指定字符填充至长度width
  • lower(): 转换字符串中所有大写字符为小写
  • lstrip(chars): 移除字符串左边的指定字符集合
  • maketrans(intab, outtab): 创建字符映射的转换表
  • partition(sep): 根据分隔符将字符串分为三部分:sep前面的、sep、sep后面的
  • replace(old, new [, count]): 将字符串中的old替换成new,如果指定count,则替换不超过count次
  • rfind(sub, start=..., end=...): 从右侧开始查找sub在字符串里的第一个出现位置,找不到时返回-1
  • rindex(sub, start=..., end=...): 从右侧开始查找sub在字符串中的第一个出现位置,与rfind相似,但找不到时会抛出ValueError
  • rjust(width, fillchar): 返回右对齐字符串,并使用指定字符填充至长度width
  • rpartition(sep): 与partition相似,但是从右侧开始
  • rsplit(sub,count): 从字符串的末尾开始,按照指定的分隔符分割字符串
  • rstrip(sub): 删除字符串末尾的空格或指定字符, 注意sub指定的是字符集,比如sub="ab"则是指末尾所有的a和所有的b,而不是一个整体
  • split(sub,count): 从字符串的开头开始,按照指定的分隔符分割字符串
  • splitlines(sub,count): 按照行('\r', '\r\n', '\n')分割字符串
  • startswith(sub): 检查字符串是否以指定的前缀开始
  • strip(sub): 删除字符串前后的空格或指定字符
  • swapcase(): 将字符串中的小写字母转换为大写,大写字母转换为小写
  • title(): 将字符串中每个单词的首字母转换为大写
  • translate(tab): 根据给定的转换表替换字符串中的字符
  • upper(): 将字符串中的所有小写字母转换为大写字母
  • zfill(): 在数字字符串的左边填充零,直到达到指定的长度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lanelets_ 高效的自动驾驶地图表达方式

Lanelets: 高效的自动驾驶地图表达方式 附赠自动驾驶学习资料和量产经验&#xff1a;链接 LaneLets是自动驾驶领域高精度地图的一种高效表达方式&#xff0c;它以彼此相互连接的LaneLets来描述自动驾驶可行驶区域&#xff0c;不仅可以表达车道几何&#xff0c;也可以完整表述车…

.NET9 PreView2+.AOT ILC 的重大变化

RyuJIT 增强功能 1. 环路优化 (循环优化) 这种优化实际上是一种 for 循环叠加态的优化&#xff0c;for 循环叠加计算的过程中&#xff0c;会对其中部分变量进行感应。比如循环中放置 0 扩展 (第一个索引为 0)&#xff0c;这种优化灵感来源于 LLVM 标量演化。下面看例子&#…

每天一个数据分析题(二百五十四)

在大数据时代背景下&#xff0c;我们使用的数据主要包含两种类别&#xff0c;一种称为结构化数据&#xff0c;另一种称为非结构化数据。请问以下哪个选项属于非结构化数据&#xff1f; A. 利润表 B. 短视频 C. 产品库存表 D. 产品进货表 题目来源于CDA模拟题库 点击此处获…

LeetCode 每日一题 2024/4/1-2024/4/7

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 4/1 2810. 故障键盘4/2 894. 所有可能的真二叉树4/3 1379. 找出克隆二叉树中的相同节点4/4 2192. 有向无环图中一个节点的所有祖先4/5 1026. 节点与其祖先之间的最大差值4/…

8种专坑运维的 SQL 写法,性能降低100倍,您不来看看?

1、LIMIT 语句 分页查询是最常用的场景之一&#xff0c;但也通常也是最容易出问题的地方。比如对于下面简单的语句&#xff0c;一般 DBA 想到的办法是在 type&#xff0c;name&#xff0c; create_time 字段上加组合索引。这样条件排序都能有效的利用到索引&#xff0c;性能迅…

AIGC实战——ProGAN(Progressive Growing Generative Adversarial Network)

AIGC实战——ProGAN 0. 前言1. ProGAN2. 渐进式训练3. 其他技术3.1 小批标准差3.2 均等学习率3.3 逐像素归一化 4. 图像生成小结系列链接 0. 前言 我们已经学习了使用生成对抗网络 (Generative Adversarial Network, GAN) 解决各种图像生成任务。GAN 的模型架构和训练过程具有…

真实的招生办对话邮件及美国高校官网更新的反 AI 政策

这两年 ChatGPT 的热度水涨船高&#xff0c;其编写功能强大&#xff0c;且具备强大的信息整合效果&#xff0c;所以呈现的内容在一定程度上具备可读性。 那么&#xff0c;美国留学文书可以用 ChatGPT 写吗&#xff1f;使用是否有风险&#xff1f;外网博主 Kushi Uppu 在这个申…

C++20 semaphore(信号量) 详解

头文件在C20中是并发库技术规范&#xff08;Technical Specification, TS&#xff09;的一部分。信号量是同步原语&#xff0c;帮助控制多线程程序中对共享资源的访问。头文件提供了标准C方式来使用信号量。 使用环境 Windows&#xff1a;VS中打开项目属性&#xff0c;修改C语…

基于卷积神经网络的天气识别系统(pytorch框架)【python源码+UI界面+前端界面+功能源码详解】

功能演示&#xff1a; 天气识别系统&#xff0c;vgg16&#xff0c;mobilenet卷积神经网络&#xff08;pytorch框架&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的天气识别系统是在pytorch框架下实现的&#xff0c;系统中有两个模型可选…

vue+elementUI实现表格组件的封装

效果图&#xff1a; 在父组件使用表格组件 <table-listref"table":stripe"true":loading"loading":set-table-h"slotProps.setMainCardBodyH":table-data"tableData":columns"columns.tableList || []":ra…

快速创建Python库文档:pdoc的简便之道

快速创建Python库文档:pdoc的简便之道 什么是pdoc&#xff1f; pdoc 是一个用于自动生成 Python 模块文档的库,它可以根据代码中的 docstrings 自动生成漂亮的文档网页. 为什么选择使用pdoc库&#xff1f; 简单易用: pdoc不需要复杂的配置,只需运行一个命令即可生成文档。 …

项目管理工具对比:甘特图与看板

许多项目管理工具都能帮助你规划、管理和跟踪项目&#xff0c;比如甘特图和看板。如果比较一下甘特图和看板&#xff0c;会发现两者在不同方面都对项目有价值。 让我们来看看看板与甘特图的区别&#xff0c;了解它们是如何工作的&#xff0c;以及各自的优缺点&#xff0c;看看…

基于Springboot的Java学习平台

采用技术 基于Springbootjava学习平台的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 系统功能模块 后台管理 用户注册 课程信息 作业信息 资料信息…

电工技术学习笔记——正弦交流电路

一、正弦交流电路 1. 正弦量的向量表示法 向量表示方法&#xff1a;正弦交流电路中&#xff0c;相量表示法是一种常用的方法&#xff0c;用于描述电压、电流及其相位关系。相量表示法将正弦交流信号表示为复数&#xff0c;通过复数的运算来描述电路中各种参数的相互关系 …

java中的正则表达式和异常

正则表达式&#xff1a; 作用一&#xff1a;用来校验数据格式是否合法 作用二&#xff1a;在文本中查找满足要求的内容 不用正则表达式&#xff1a;检验QQ号是否合法&#xff0c;要求全部是数字&#xff0c;长度在6-20&#xff0c;不能以0开头 public class test {public stat…

使用阿里云试用Elasticsearch学习:2.3 深入搜索——多字段搜索

查询很少是简单一句话的 match 匹配查询。通常我们需要用相同或不同的字符串查询一个或多个字段&#xff0c;也就是说&#xff0c;需要对多个查询语句以及它们相关度评分进行合理的合并。 有时候或许我们正查找作者 Leo Tolstoy 写的一本名为 War and Peace&#xff08;战争与…

【Linux实践室】Linux高级用户管理实战指南:创建与删除用户组操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux创建用户组命令2.1.1 知识点讲解2.1.2…

设计模式的区别

很多设计模式看起来或者感觉上差不多&#xff0c;其实不仅仅要从具体的实现方式来辨别&#xff0c;更要主要该种设计模式的意图。 那些容易混淆的设计模式&#xff0c;了解一下~_看了几种设计模式发现有点混乱,都差不多啊-CSDN博客

亲手开发全国海域潮汐表查询微信小程序详情教程及代码

最近在做一个全国海域潮汐表查询&#xff0c;可以为赶海钓鱼爱好者提供涨潮退潮时间表及潮高信息。 下面教大家怎么做一个这样的小程序。 主要功能&#xff0c;根据IP定位地理位置&#xff0c;自动查询出省份或城市的港口&#xff0c;进入后预测7天内港口潮汐表查询。 步骤&…

全坚固笔记本丨工业笔记本丨三防笔记本相较于普通笔记本有哪些优势?

三防笔记本和普通笔记本在设计和性能方面存在显著差异&#xff0c;三防笔记本相较于普通笔记本具备以下优势&#xff1a; 三防笔记本通常采用耐磨、耐摔的材料&#xff0c;并具有坚固的外壳设计&#xff0c;能够承受恶劣环境和意外碰撞&#xff0c;有效保护内部组件不受损坏。相…