前言
熟悉一個新的語言最麻煩的就是需要了解一些庫的使用,特別是基礎庫的使用。
所以我想給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給定的不是字符串或長度不等於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)
: 返回左對齊字符串,並使用指定字符填充至長度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()
: 在數字字符串的左邊填充零,直到達到指定的長度
本文由博客一文多發平臺 OpenWrite 發佈!