鱼C论坛

 找回密码
 立即注册
查看: 1273|回复: 4

[技术交流] Python 重构字符串的内置方法

[复制链接]
发表于 2020-4-10 11:38:31 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 qiuyouzhi 于 2020-4-10 12:06 编辑

Python 重构字符串的内置方法


最近闲得没事,突然想起重构字符串的方法了。。

差不多做出了十多个吧,还会继续更新

有一些是我真的没有好思路的,便借鉴了鱼油和网上的思路。

也有一些是功能不完备的(strip),这里放上源代码(顺便做个备份):

  1. class MyStr(str):
  2.     def __init__(self,str1):
  3.         self.str1 = str1
  4.         
  5.     def Isdigit(self):
  6.         for each in self.str1:
  7.             try:
  8.                 int(each)
  9.             except:
  10.                 return False
  11.         return True

  12.     def Isalpha(self):
  13.         temp = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
  14.         for each in self.str1:
  15.             if each not in temp:return False
  16.         return True

  17.     def isspace(self):
  18.         for each in self.str1:
  19.             if self.str1 != ' ':
  20.                 return False
  21.         return True

  22.     def Isalnum(self):
  23.         temp = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
  24.         temp2 = "1234567890"
  25.         for each in self.str1:
  26.             if not (each not in temp or each not in temp2):
  27.                 return False
  28.         return True

  29.     def Islower(self):
  30.         for each in self.str1:
  31.             if ord(each) < 97 or ord(each) > 122:
  32.                 return False
  33.         return True

  34.     def Istitle(self):
  35.         if ord(self.str1[0]) < 65 or ord(self.str1[0]) > 90:
  36.             return False
  37.         else:
  38.             for each in self.str1[1:]:
  39.                 if ord(each) < 97 or ord(each) > 122:
  40.                     return False
  41.             else:
  42.                 return True

  43.     def DAS(self):
  44.         temp = list(self.str1)
  45.         for i in range(len(temp)):
  46.             try:
  47.                 temp.remove(' ')
  48.             except ValueError:
  49.                 break
  50.         return ''.join(temp)

  51.     # 这里借鉴了网上的思路: https://blog.csdn.net/smfswxj/article/details/79513713
  52.     # 原理就是找出字符所在的位置,然后把那个范围里面的字符串(切片)打印出来
  53.     def Strip(self, targ = None):
  54.         c = 0
  55.         nspace = []
  56.         for each in self.str1:
  57.             c += 1
  58.             if each != ' ':
  59.                 nspace.append(c)

  60.         if nspace:
  61.             return self.str1[nspace[0]-1: nspace[-1]]
  62.         return ''

  63.         

  64.     def Count(self, value):
  65.         c = 0
  66.         for each in self.str1:
  67.             if each == value:
  68.                 c += 1
  69.         return c

  70.     def Capitalize(self):
  71.         return chr(ord(self.str1[0]) - 32) + self.str1[1:]

  72.     def Split(self, svalue):
  73.         res = []
  74.         length = len(self.str1)
  75.         lchar = len(svalue)

  76.         for i in range(length):
  77.             index = self.str1.find(svalue)
  78.             if index == -1:
  79.                 res.append(self.str1)
  80.                 return res
  81.             else:
  82.                 res.append(self.str1[:index])
  83.                 self.str1 = self.str1[index+lchar:]


  84.     def Title(self):
  85.         def Value(str1):
  86.             temp = str1.split(' ')
  87.             for i in range(len(temp)):
  88.                 temp[i] = chr(ord(temp[i][0]) - 32) + temp[i][1:]
  89.                 yield temp[i]

  90.         return ' '.join(Value(self.str1))
  91.         # 这里附上普通做法,比较直观
  92.         """res = ''
  93.         for each in Value(self.str1):
  94.             res += Print(each, end = ' ')
  95.         return res[:-1]"""
  96.     # 这里附上最简洁的代码
  97.     def STitle(self):
  98.         return ' '.join((chr(ord(temp[0])-32)+temp[1:] for temp in self.str1.split(' ')))

  99.     def Lower(self):
  100.         res = list(self.str1)
  101.         temp = []
  102.         for i in range(len(res)):
  103.             if not (ord(res[i]) < 65 or ord(res[i]) > 90):
  104.                 temp.append(chr(ord(res[i]) + 32))
  105.         return ''.join(temp)

  106.     def Find(self,target):
  107.         i, j = 0,0
  108.         length = len(target)
  109.         for k in range(len(self.str1)+1):
  110.             if self.str1[i:j] == target:
  111.                 return i
  112.             if j >= length:
  113.                 i += 1
  114.             j += 1
  115.         return -1           
  116.    

  117. # 没想到好的解法,把一位鱼油的代码搬了过来,简单删减了一下
  118. def Print(*values,sep=None,end=''):
  119.     if sep is None:
  120.         sep=''
  121.     return sep.join((str(i) for i in values))+end

  122. def Str(sth):
  123.     return MyStr(sth)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-10 11:48:46 | 显示全部楼层
124行
    # len其实不算内置的,但还是写上吧
len是内置的哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-10 11:53:12 | 显示全部楼层

我的意思是不是字符串内置的
字符串不能:
  1. str1.len()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-10 11:53:46 | 显示全部楼层
  1. >>> int('   78')
  2. 78
  3. >>> '      78'.isdigit()
  4. False
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-10 12:00:32 | 显示全部楼层
qiuyouzhi 发表于 2020-4-10 11:53
我的意思是不是字符串内置的
字符串不能:

  1. str1.__len__()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 06:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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