设为首页 收藏本站
查看: 709|回复: 0

[经验分享] 为什么我们用Python?

[复制链接]

尚未签到

发表于 2015-4-21 09:09:06 | 显示全部楼层 |阅读模式
  这个问题来源于一次回答问题的过程。论坛上有新手提了一个问题,问题是这样的:
  
  python re 有没有 php里 preg_replace 这样的函数?        
我想实现两组数对调的效果  ,比如  1对5 2对6  3对7 4对8      
php里只需要      
$a=array('1','2','3','4');      
$b=array('5','6','7','8');      
$strnow='1234';      
$new=preg_replace($a,$b,$strnow);      
new就是5678      
但是re.sub肯定是不能这么批量实现的,怎么解决呢?
  相信这个问题对熟悉Python的朋友来说一定不难,虽然论坛上人气不高,还是有了好几个回复。比如某位朋友回复:
def root(x,y='',dct={'1':'5','2':'6','3':'7','4':'8'}):
for i in x:
if i in dct:
y+=dct
else:
y+=i
return y
  这段代码其实可以运行并且结果是对的,但一眼看上去总觉得有些别扭。于是我跟帖给了3个答案做这件事情:

a = ['1', '2', '3', '4']
b = ['5', '6', '7', '8']
s = '1234'
# method1
import re
print re.sub('.', lambda m: dict(zip(a, b)).get(m.group(), m.group()), s)
# method2
print ''.join(dict(zip(a, b)).get(c, c) for c in s)
#method3
import string
print s.translate(string.maketrans(''.join(a), ''.join(b)))
  这时候一位朋友提到:

  大家都迷上了使用一行的代码来解决问题,看起来又复杂又酷,这些代码如果让新人看到得琢磨一阵子了

  这句话的前半部分确实有一定的道理。我们在论坛上遇到类似这样的问题帖时,经常会看到跟帖者像是在竞赛一样用各种语言尽可能短地给出答案。我给的前两个答案也有同样的毛病,实现确实带有一些炫耀性质,实际上是应该这样写的:

d = dict(zip(a, b))
# method1
import re
def repr(m):
c = m.group()
return d.get(c, c)
print re.sub('.', repr, s)
# method2
print ''.join(d.get(c, c) for c in s)
  但如果说只因为酷就要避开,这似乎又走入了另一个极端。再回头看看第一段类似C的代码吧,如果我们的代码都这样写,为什么我们还要用Python呢?
  有大牛说过,一门好的编程语言,能改变你的编程思维,如果你觉得一门语言没有做到这一点,那么就不值得花时间去学习这门语言(大意如此,记忆力不佳^^)。体现在C to Python上的话,内置的列表解析和大量的封装代码逻辑的方法(Python有一个文档详细介绍了这些,标题很酷叫做函数式编程指南)完全可以颠覆对程序源代码的认识。试想,如果用一个列表生成另一个列表,写成这样:

l2 = []
for i in l1:
l2.append(i)
  与写成这样:

l2 = [i for i in l1]
  哪个会好一些呢?可能对新人来说,上面那样更符合他们固有的逻辑,但我想这并不足以阻挡我们使用列表解析,更不应该因此而逃避内置的zip map reduce等等方法,这些方法都有现成的文档可查,为什么我们要放弃他们,使用一层一层的for循环呢?我在第一次看到Python这么精妙的代码时,很是惊叹。如果要放弃这些功能,那是多么令人郁闷的事情。
  别因为cool就抗拒,别忘了酷也是Python的特性之一。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59097-1-1.html 上篇帖子: 利用Python和Beautiful Soup抓取网页内容 下篇帖子: Python——赋值、浅拷贝、深拷贝
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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