首页 > 编程语言 >aardio教程五) 写Python风格的aardio代码(字符串篇)

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

时间:2024-04-07 09:46:49浏览次数:28  
标签:教程 sub Python rawStr aardio len var 字符串 string

前言

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

所以我想给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给定的不是字符串或长度不等于1
    if(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(): 在数字字符串的左边填充零,直到达到指定的长度

本文由博客一文多发平台 OpenWrite 发布!

标签:教程,sub,Python,rawStr,aardio,len,var,字符串,string
From: https://www.cnblogs.com/kanadeblisst/p/18118429

相关文章

  • python面向对象(二)继承:最直接的代码复用
    继承简介继承是指通过在创建类时提供另一个类(称为父类)的名称,来获取父类的属性与方法。继承最明显的作用就是节约代码量,不需要重复定义已经存在的属性与方法。但是深入思考就会发现,复用只是继承的附带作用,继承最有意义的一点,是将不同的类联系了起来,让不同的类之间能够有一定的共性......
  • JetBrains PyCharm 2024.1 (macOS, Linux, Windows) - 面向专业开发者的 Python IDE
    JetBrainsPyCharm2024.1(macOS,Linux,Windows)-面向专业开发者的PythonIDE请访问原文链接:JetBrainsPyCharm2024.1(macOS,Linux,Windows)-面向专业开发者的PythonIDE,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsPyCharm-面向专业开发......
  • 【蚂蚁笔试题汇总】[全网首发] 2024-04-06-蚂蚁春招笔试题-三语言题解(CPP/Python/Jav
    ......
  • 强化学习—PPO代码实现及个人详解1(python)
    上一篇文章我们已经搞定了如何搭建一个可以运行强化学习的python环境,现在我们就跑一下代码,这里我对代码加上一些个人理解,方便基础差一些的朋友进行理解和学习。我在这段时间对强化学习进行了学习,所以知识和代码基本来自这本:磨菇书一、定义模型importtorch.nnasnnimport......
  • 使用Python的turtle模块绘制美丽的樱花树
    引言Python的turtle模块是一个直观的图形化编程工具,让用户通过控制海龟在屏幕上的移动来绘制各种形状和图案。turtle模块的独特之处在于其简洁易懂的操作方式以及与用户的互动性。用户可以轻松地通过使用诸如前进、后退、左转、右转等基本命令,来编写程序控制海龟的行动路径,从而创......
  • python 浅拷贝与深拷贝
    copy Python的赋值语句不复制对象,而是创建目标和对象的绑定关系。对于自身可变,或包含可变项的集合,有时要生成副本用于改变操作,而不必改变原始对象。浅拷贝(ShallowCopy)和深拷贝(DeepCopy)是在Python中用于复制数据结构(如列表)时经常用到的概念。浅拷贝(ShallowCopy)浅复制创建......
  • python_列表推导式_矩阵运算
    带条件的列表推导式even_number=[iforiinrange(10)ifi%2==0]even_number#output[0,2,4,6,8][0,2,4,6,8]列表推导式的嵌套matrix=[[i*jforiinrange(1,4)]forjinrange(1,4)]matrix#output=[[1,2,3],[2,4,6],[3,6,9]][[1,......
  • Python SciPy库
    SciPy库为Python提供了科学计算的基本算法基本操作求解非线性方程(组)scipy.optimize模块的fsolve和root可求非线性方程(组)的解fsolve或root求解非线性方程组时,先把非线性方程组写成F(x)=0这样的形式,其中,x为向量,F(x)为向量函数scipy.optimize.fsolve(func, x0, args......
  • 环境配置——已解决ModuleNotFoundError: No module named ‘cv2’(python)
    一、报错代码在网上搜到不少用Python处理图形的代码,于是复制别人的代码直接运行却报错,得到的结果却是:已解决ModuleNotFoundError:Nomodulenamed‘cv2’。(当时心里瞬间凉了一大截,最后顺利解决了,顺便记录一下希望可以帮助到更多遇到这个bug不会解决的小伙伴),代码如下:impor......
  • 环境配置——python代码打包超详细教程
    在Python开发的过程中我们经常会需要将自己的代码打包成一个可执行文件,方便将代码分享给其他人使用,下面这篇文章主要给大家介绍了关于python代码打包的相关资料,需要的朋友可以参考下一、前言网上的文章对小白都不太友好呀,讲得都比较高大上,本文章就用最简单的方式来教会......