前言
熟悉一个新的语言最麻烦的就是需要了解一些库的使用,特别是基础库的使用。
所以我想给aardio封装一个Python风格的库,Python里的基础库是什么方法名,aardio里也封装同样的方法名。
这样就不需要单独去了解aardio里一些方法的使用细节,可以很方便的将Python代码改成aardio代码。
语法差异
不过因为语法上有差异,使用上不能做到完全一模一样。比如Python字符串是可迭代的,而aardio并不能迭代类,aardio中的迭代器是函数。
另外,有些函数较为复杂,我只实现最基本的意思,比如Python的isdigit
和isnumeric
是检测字符串是否全是数字,它的数字还包含一些其他语言的数字,不只是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)
: 返回左对齐字符串,并使用指定字符填充至长度widthlower()
: 转换字符串中所有大写字符为小写lstrip(chars)
: 移除字符串左边的指定字符集合maketrans(intab, outtab)
: 创建字符映射的转换表partition(sep)
: 根据分隔符将字符串分为三部分:sep前面的、sep、sep后面的replace(old, new [, count])
: 将字符串中的old替换成new,如果指定count,则替换不超过count次rfind(sub, start=..., end=...)
: 从右侧开始查找sub在字符串里的第一个出现位置,找不到时返回-1rindex(sub, start=..., end=...)
: 从右侧开始查找sub在字符串中的第一个出现位置,与rfind相似,但找不到时会抛出ValueErrorrjust(width, fillchar)
: 返回右对齐字符串,并使用指定字符填充至长度widthrpartition(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()
: 在数字字符串的左边填充零,直到达到指定的长度