鱼C论坛

 找回密码
 立即注册
查看: 2142|回复: 1

[技术交流] python细节之1、字符串方法中功能相近的方法辨析

[复制链接]
发表于 2018-12-26 17:22:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 sunrise085 于 2020-4-3 19:36 编辑

前几天学习了一下python中字符串的方法,,发现字符串的处理方法真的蛮多的,小甲鱼整理的很很好。各种方法及注释见帖子
在帖子中介绍了各种方法并加上了注释,然而又一些极为相似的方法,可能有些鱼油们会弄不清楚,我刚开始的时候也不清楚,然后就查阅资料,并亲自测试,现在总结如下,希望对广大鱼油们有所帮助。
第一组:isdecimal()、isdigit()和isnumeric()
这三个方法基本上都是判断字符串中是否只包含数字,但是却不尽相同。小甲鱼给出的注释如下:
isdecimal()        如果字符串只包含十进制数字则返回 True,否则返回 False。
isdigit()        如果字符串只包含数字则返回 True,否则返回 False。
isnumeric()        如果字符串中只包含数字字符,则返回 True,否则返回 False。
注释中的差别是:十进制数字、数字、数字字符。
就这么看,还真有点晕了。第一个好一些,限定了十进制,后面两个差别是啥啊?字符串中不都是字符吗?什么是数字,什么是数字字符?是不是一头雾水?
我来为大家解惑:
isdecimal()
True: Unicode数字,,全角数字(双字节)
False: 罗马数字,汉字数字
Error: byte数字(单字节)

isdigit()
True: Unicode数字,byte数字(单字节),全角数字(双字节),罗马数字
False: 汉字数字
Error: 无

isnumeric()
True: Unicode数字,全角数字(双字节),罗马数字,汉字数字
False: 无
Error: byte数字(单字节)
举个例子:
  1. str1='Ⅷ'#罗马数字
  2. print(str1,str1.isdecimal())
  3. print(str1,str1.isdigit())
  4. print(str1,str1.isnumeric())
  5. print()
  6. str2='五'
  7. print(str2,str2.isdecimal())
  8. print(str2,str2.isdigit())
  9. print(str2,str2.isnumeric())
  10. print()
  11. str3=b'10010'#二进制
  12. #print(str3,str3.isdecimal()) #这里是会报错的
  13. print(str3,str3.isdigit())
  14. #print(str3,str3.isnumeric())#这里是会报错的
  15. print()
  16. str4='123'#全角字符
  17. print(str4,str4.isdecimal())
  18. print(str4,str4.isdigit())
  19. print(str4,str4.isnumeric())
复制代码

程序输出结果如下:
  1. Ⅷ False
  2. Ⅷ False
  3. Ⅷ True

  4. 五 False
  5. 五 False
  6. 五 True

  7. b'10010' True

  8. 123
  9. 123 True
  10. 123 True
  11. 123 True
复制代码


第二组:casefold()和lower()
这两个方法都是大写转小写,小甲鱼中给出的注释如下:
casefold()        把整个字符串的所有字符改为小写
lower()        转换字符串中所有大写字符为小写
字面区别,一个是将所有字符改为小写,一个是将大写字符改为小写。听起来,好像第一个的功能更强大一些,但是小写字符也不需要改啊。这样想的话,两个方法意思不是一样的么?
其实,这两个方法是有区别的。查资料得到的是一下解释。lower()方法只能将ASCII码中的0x41到0x5a转换为0x61到0x7a,即将'A-Z'转换为'a-z',对其他字符无效;而casefold()可以将所有的有大小写区分的字符都进行转换,比如德语中的'ß'等。
我查了一下德语中的'ß',在德语中该字母本身是小写,所以lower()函数对其无效,而该字母还有其小写,即'ss',因此casefold()能对其进行转换。
此外我进行了一些其他语系字母的尝试,发现lower()函数不单单能转换'A-Z',还可以转换俄文字母和希腊字母等其他语系字母。
下面是我的一些尝试。
  1. str1='"ß"'
  2. print(str1,'使用casefold转换',str1.casefold())
  3. print(str1,'使用lower转换',str1.lower())
  4. print()
  5. str2='"AB   T Ф Φ Β Ε Ω  Π  Δ Σ"'
  6. print(str2,'\n使用casefold转换\n',str2.casefold())
  7. print('使用lower转换\n',str2.lower())
复制代码

程序结果
  1. "ß" 使用casefold转换 "ss"
  2. "ß" 使用lower转换 "ß"

  3. "AB   T Ф Φ Β Ε Ω  Π  Δ Σ"
  4. 使用casefold转换
  5. "ab   t ф φ β ε ω  π  δ σ"
  6. 使用lower转换
  7. "ab   t ф φ β ε ω  π  δ σ"
复制代码

这是自己学习过程中的一些总结,拿出来和大家交流交流,希望大家多多讨论,共同进步。


PS:发帖几个小时之后,才发现有些语系的字母无法正常显示,包括德语中的那个字母,和β有点相似,想了解的可以自己去搜一下“德语字母β”,还有一些其他的字母无法显示,我就删除了

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
是尘埃呀 + 5 + 5 + 2 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-26 17:46:28 From FishC Mobile | 显示全部楼层
总结的很好,支持
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-19 21:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表