免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: caesarok
打印 上一主题 下一主题

创建string.strip()替代函数: [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-02-25 13:06 |只看该作者
大家不要回答了
大概思路和代码都帖出来了,让他自己动手把

论坛徽章:
0
12 [报告]
发表于 2009-02-25 13:06 |只看该作者

回复 #10 zhenglxd 的帖子

中间有空格就不行了

论坛徽章:
0
13 [报告]
发表于 2009-02-25 13:19 |只看该作者

回复 #9 3227049 的帖子

你的这个方法效率很高,
如果不用re跟string的所有函数,用最原始方法,有什么好的办法吗?

论坛徽章:
0
14 [报告]
发表于 2009-02-25 13:30 |只看该作者

回复 #11 xiaoyu9805119 的帖子

谢谢你的好意,我明白,我也会找更多的方法解答的,
但是我通过提出问题,是希望了解跟学习到更多更好的方法.

论坛徽章:
0
15 [报告]
发表于 2009-02-25 13:33 |只看该作者
用这个试试
def strip(str):
        start = 0
        end = len(str)
        for c in str:
                if c == ' ' or c == '\t':
                        start += 1
                else:
                        break
        for c in str[::-1]:
                if c == ' ' or c == '\t':
                        end -= 1
                else:
                        break

        return str[start:end]

论坛徽章:
0
16 [报告]
发表于 2009-02-25 13:46 |只看该作者
函数头两行替换为:
    start = end = 0
更好一些

论坛徽章:
0
17 [报告]
发表于 2009-02-25 13:49 |只看该作者
默认的快不快其实取决于有没有加载psyco。。。。。。。。。。

  1. #coding:utf-8


  2. str_strip=lambda s:s.strip()

  3. def str_strip2(s):
  4.     left_index,right_index=0,len(s)-1
  5.     left_char,right_char=s[left_index],s[right_index]
  6.     while left_char.isspace():
  7.         left_index+=1
  8.         left_char=s[left_index]
  9.     while right_char.isspace():
  10.         right_index-=1
  11.         right_char=s[right_index]
  12.     return s[left_index:right_index+1]

  13. def str_strip3(str):
  14.         start = 0
  15.         end = len(str)
  16.         for c in str:
  17.                 if c.isspace():
  18.                         start += 1
  19.                 else:
  20.                         break
  21.         for c in str[::-1]:
  22.                 if c.isspace():
  23.                         end -= 1
  24.                 else:
  25.                         break

  26.         return str[start:end]

  27. import re

  28. regex_strip=lambda s:re.sub(r'^\s*|\s*$', '', s)

  29. regex_strip2=lambda s:re.sub("^\s*(.+?)\s*$",lambda x:x.group(1),s)


  30. if __name__=="__main__":
  31.     from timeit import Timer
  32.     import sys
  33.     if sys.argv[-1]=='psyco':
  34.         try:
  35.            import psyco
  36.            psyco.full()
  37.         except ImportError,e:
  38.            sys.exit(e)
  39.     print Timer("str_strip('        sjaksja      ')","from __main__ import str_strip").timeit(10000)
  40.    
  41.     print Timer("str_strip2('        sjaksja      ')","from __main__ import str_strip2").timeit(10000)


  42.     print Timer("str_strip3('        sjaksja      ')","from __main__ import str_strip3").timeit(10000)

  43.     print Timer("regex_strip('        sjaksja      ')","from __main__ import regex_strip").timeit(10000)
  44.    

  45.     print Timer("regex_strip2('        sjaksja      ')","from __main__ import regex_strip2").timeit(10000)


复制代码

论坛徽章:
0
18 [报告]
发表于 2009-02-25 13:50 |只看该作者
python strip_test.py

python strip_test.py psyco
有质的变化。。。

论坛徽章:
0
19 [报告]
发表于 2009-02-25 13:56 |只看该作者
原帖由 3227049 于 2009-2-25 13:50 发表
python strip_test.py

python strip_test.py psyco
有质的变化。。。

psyco对循环,尤其是爆大循环时候能提速不少的

论坛徽章:
0
20 [报告]
发表于 2009-02-25 14:00 |只看该作者

回复 3227049 的帖子

我的风格不是很 pythonic,而有点像 c
向你学习

[ 本帖最后由 izhier 于 2009-2-25 15:37 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP