本文主要是介绍python利用capitalize()处理字符串,cpython源码溯源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
python有很多处理str格式的方法,可以方便利用
capitalize():将首字母大写,其他字母变小写
def stringCase():info0='youngCase'str.capitalize(info0)print("首字母大写"+info0.capitalize())
官方python测试代码为
def test_capitalize(self):self.checkequal(' hello ', ' hello ', 'capitalize')self.checkequal('Hello ', 'Hello ','capitalize')self.checkequal('Hello ', 'hello ','capitalize')self.checkequal('Aaaa', 'aaaa', 'capitalize')self.checkequal('Aaaa', 'AaAa', 'capitalize')
深挖源码:尝试用vscode直接进入capitalize()函数,目录为:
结果为:
@overloaddef capitalize(self: LiteralString) -> LiteralString: ...@overloaddef capitalize(self) -> str: ... # type: ignore[misc]
并没有看到具体的实现方法:
Python的内置函数(用于cpython)是用C编写的,因此vscode提供了只显示函数签名的伪方法。因此需要查找包含源代码的GitHub页面:
So,先在cpython中找到buitins.pyi对应的源文件,其他教程提示是在:
https://github.com/python/cpython/blob/main/Python/bltinmodule.c(其实不是)
我是在https://github.com/python/cpython/blob/main/Objects/bytearrayobject.c
找到了方法声明:
点击stringlib_capitalize跳转到(到头文件了):
cpython/ctype.h at main · python/cpython · GitHub
tatic PyObject*
stringlib_capitalize(PyObject *self, PyObject *Py_UNUSED(ignored))
{PyObject* newobj;newobj = STRINGLIB_NEW(NULL, STRINGLIB_LEN(self));if (!newobj)return NULL;_Py_bytes_capitalize(STRINGLIB_STR(newobj), STRINGLIB_STR(self),STRINGLIB_LEN(self));return newobj;
}
再点击_Py_bytes_capitalize跳转到:
cpython/bytes_methods.c at main · python/cpython · GitHub
得到如下代码
其实如注释所示:就是将首字母大写,后续字符置为小写.再后再返回
我也查找了java 的capitalize()实现,在import com.sun.xml.internal.ws.util.StringUtils后可以看到java的实现方式比较简单,只是将首字母进行大写,后续字符没有变小写。
public static String capitalize(String name) {if (name != null && name.length() != 0) {char[] chars = name.toCharArray();chars[0] = Character.toUpperCase(chars[0]);return new String(chars);} else {return name;}}
}
【注:文章内容可能不正确,欢迎指正】
这篇关于python利用capitalize()处理字符串,cpython源码溯源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!