免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 41474 | 回复: 35

分享有礼:Python代码的魔鬼细节大比拼!(获奖名单已公布-2014-8-11) [复制链接]

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2014-07-14 09:47 |显示全部楼层
获奖名单已公布,详情请看:http://bbs.chinaunix.net/thread-4149830-1-1.html

细节体现态度,细节决定成败,不管是多么高大上的架构/设计/算法,终将依赖代码的有力执行,代码就是魔鬼细节。常常发觉,使用他人的优秀代码容易,而真正理解其设计与实现就要狠下功夫,至于写出同等水平的代码,往往是可望不可即。通过代码能发觉开发者的思维是否严谨,逻辑是否清晰,代码就是开发者的自白。

Python是一门十分灵活的动态语言,给了开发者极大的自由度,但要写出高质量代码,要求并不比传统语言低。有写过自己也看不懂的代码?有写过运行效率极差的代码?有写过深得我心的代码?一切尽在细节中。

本期话题

分享自己最得意的Python代码,“Talk is cheap. Show me the code”。要求:
1.抽象浓缩到100行之内(不算空行和注释),放入code标签内。
2.逻辑完整且可运行于Python 2.5+或Python 3.3+,有简单输入和输出,不依赖第三方库。
3.重点说明代码的核心功能和让你得意的地方,体现出态度和思考,你就赢了。

本期奖品

分享精彩的网友有机会获得《编写高质量代码:改善Python程序的91个建议》 一本,共5本
本书作者有丰富的Python实践经验,书中很多建议也是Python社区长期积累的最佳实践,对大家平时的学习和工作很有参考价值。

活动时间
2014年7月14日 - 2014年7月31日

图书信息
《编写高质量代码:改善Python程序的91个建议》  购买链接:China-pub   京东

作者: 张颖    赖勇浩  
丛书名: Effective系列丛书
出版社:机械工业出版社
ISBN:9787111467045
上架时间:2014-6-13
出版日期:2014 年6月
开本:16开
页码:262
版次:1-1

论坛徽章:
26
CU十二周年纪念徽章
日期:2013-10-24 15:41:34技术图书徽章
日期:2014-07-11 16:27:52辰龙
日期:2014-09-04 13:40:43白羊座
日期:2014-09-09 12:51:55双子座
日期:2014-09-26 11:00:042014年中国系统架构师大会
日期:2014-10-14 15:59:00子鼠
日期:2014-10-23 16:48:23巨蟹座
日期:2014-10-27 08:21:10申猴
日期:2014-12-08 10:16:282015年辞旧岁徽章
日期:2015-03-03 16:54:15NBA常规赛纪念章
日期:2015-05-04 22:32:03IT运维版块每日发帖之星
日期:2016-01-29 06:20:00
发表于 2014-07-14 10:14 |显示全部楼层
好书,支持。。。。。。。。。

论坛徽章:
0
发表于 2014-07-14 10:37 来自手机 |显示全部楼层
支持,坐等大神分享代码!学习中。

论坛徽章:
6
CU大牛徽章
日期:2013-05-20 10:43:41IT运维版块每日发帖之星
日期:2016-07-29 06:20:00IT运维版块每日发帖之星
日期:2016-01-27 06:20:00CU大牛徽章
日期:2013-05-20 10:44:16CU大牛徽章
日期:2013-05-20 10:44:0615-16赛季CBA联赛之广东
日期:2018-03-09 11:17:08
发表于 2014-07-14 11:35 |显示全部楼层
支持啊。。。现在python越来越流行了。  openstack貌似就大量用了python

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
发表于 2014-07-14 11:50 |显示全部楼层
好高端的样子~

论坛徽章:
18
卯兔
日期:2013-09-27 17:41:0615-16赛季CBA联赛之佛山
日期:2016-07-09 17:34:45操作系统版块每周发帖之星
日期:2015-12-02 15:01:04IT运维版块每日发帖之星
日期:2015-12-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-07 06:20:00IT运维版块每日发帖之星
日期:2015-10-03 06:20:00IT运维版块每日发帖之星
日期:2015-10-01 06:20:00羊年新春福章
日期:2015-04-01 17:56:06拜羊年徽章
日期:2015-04-01 17:56:062015年迎新春徽章
日期:2015-03-04 09:49:452015年辞旧岁徽章
日期:2015-03-03 16:54:15天秤座
日期:2015-01-14 06:39:28
发表于 2014-07-14 14:07 |显示全部楼层
不是好高端,是很高端

论坛徽章:
32
CU大牛徽章
日期:2013-05-20 10:45:13每日论坛发贴之星
日期:2015-09-07 06:20:00每日论坛发贴之星
日期:2015-09-07 06:20:00数据库技术版块每日发帖之星
日期:2015-12-13 06:20:0015-16赛季CBA联赛之江苏
日期:2016-03-03 11:56:13IT运维版块每日发帖之星
日期:2016-03-06 06:20:00fulanqi
日期:2016-06-17 17:54:25IT运维版块每日发帖之星
日期:2016-07-23 06:20:0015-16赛季CBA联赛之佛山
日期:2016-08-11 18:06:41JAVA
日期:2016-10-25 16:09:072017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:33:21
发表于 2014-07-14 15:10 |显示全部楼层
支持,好书。。

论坛徽章:
5
子鼠
日期:2014-05-15 13:49:32子鼠
日期:2014-07-16 11:16:45卯兔
日期:2014-07-17 11:34:49巨蟹座
日期:2014-07-21 12:05:002015亚冠之柏太阳神
日期:2015-07-30 16:26:53
发表于 2014-07-14 16:56 |显示全部楼层
好像很厉害的样子,正在python学习中,支持一下

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
发表于 2014-07-14 21:38 |显示全部楼层
本帖最后由 ssfjhh 于 2014-07-16 22:11 编辑

蚂蚁爬杆
这个问题,一开始写了个很复杂的代码来计算,错误百出,没心情调试了,重写了个,只用4行代码就把问题解决了。happy,不会用数学证明,所以没有证明,但感觉是正确的。
  1. def ant(m, *args):
  2.     p = sorted(args, key = abs)
  3.     t = [-i for i in p if i<0] + [m - i for i in p if i >0]
  4.     return sorted(zip(t,p))
  5. print(ant(27,3,-7,11,-17,23))
复制代码
一开始写的代码只想着模拟蚂蚁在杆上爬时的过程来计算蚂蚁离开的时间,整个过程挺复杂的,蚂蚁有可能在非整数点相遇,离开的时间也有可能不是整数,写的代码漏洞百出。
后来看到蚂蚁爬离杆子最长所需要的时间是通过幻影算法计算出来的,感觉这个算法真是太美了,竟然这么容易就计算出来了。但是却不甘于只知道最后一个蚂蚁离开的时间,仍然想通过算法计算出每只蚂蚁离开的时间,这个幻影算法给了我提示。
我总结出的结论如下:
为了方便描述,用左端和右端表示朝向杆子的始端和末端。
1、既然两只蚂蚁相遇要掉头,那么在还没有蚂蚁爬离杆子的任意时刻,向左爬的蚂蚁和向右爬的蚂蚁的数量始终是一样多的;
2、左边的蚂蚁永远不可能爬到右边的蚂蚁的右侧,因为同方向时,在后的蚂蚁一定追不上在前的蚂蚁;相对方向时,相遇就会掉头,左端的蚂蚁依然不会爬到右边的蚂蚁的右侧;同理,右边的蚂蚁也不能爬到左边蚂蚁的左侧;
3、根据幻影算法,两只相遇的蚂蚁爬离杆子需要的时间等于对方不掉头时爬离杆子需要的时间;
由此得出结论,4、杆子上有多少只朝向左爬的蚂蚁,最终就会有多少只蚂蚁从左端离开;同理,有多少只朝向右爬的蚂蚁,也一定会有多少只从右端爬离的蚂蚁;
5、左侧的蚂蚁从左端离开,右端的蚂蚁从右端离开,而且由2可知,最左端的蚂蚁一定是向左方向最先离开的。
左侧的蚂蚁离开的时间等于向左的蚂蚁完全不掉头所需要的时间,右侧的蚂蚁离开的时间等于向右的蚂蚁完全不掉头所需要的时间。

剩下代码的就好办了,
一、先按位置给蚂蚁排好顺序;(主要是为了保证参数规范,如果参数传入规范,其实这一行也是可以不要的)
二、再按照朝向将蚂蚁分为向左和向右两部分并计算爬离的时长,这表示蚂蚁向左和向右爬离的只数和时长,结合一,打个包并按照时间排序就得出蚂蚁离开的顺序、时长和初始位置了。

论坛徽章:
1
NBA常规赛纪念章
日期:2015-05-04 22:32:03
发表于 2014-07-14 21:52 |显示全部楼层
本帖最后由 给个理由先 于 2014-07-15 23:03 编辑
  1. def isISBNvalid(isbn):
  2.     '''
  3.     To verify a ISBN valid or invalid, return True or False.
  4.     Supports both 10/13 digits.
  5.     '''
  6.     if len(isbn) == 13:
  7.         weight = (1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1)
  8.         return sum([(ord(x)-48)*y for (x,y) in zip(isbn,weight)])%10 == 0
  9.     elif len(isbn) == 10:
  10.         weight = (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
  11.         return sum([(ord(x)-48)*y for (x,y) in zip(isbn,weight)])%11 == 0
  12.     else:
  13.         return False

  14. if __name__ == '__main__':
  15.     for (isbn, result) in {'7560924182':True, '7302273608':False, '9771003551004':True}.items():
  16.         assert(isISBNvalid(isbn) == result)
复制代码
验证isbn合法的一小段代码,so easy 都不用解释了

simple and comprehensible semantics
use to use and powerful built-in data structure
more productivity
self documentation
......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP