aardio教程五) 寫Python風格的aardio程式碼(字串篇)

Python成长路發表於2024-04-07

前言

熟悉一個新的語言最麻煩的就是需要了解一些庫的使用,特別是基礎庫的使用。

所以我想給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 釋出!

相關文章