每周精品是4个数字谐音祝福语几,猜1到16的4个数字谐音祝福语

- Copyright & 2017 www.xue63.com All Rights Reserved平板/笔记本
HiLink生态产品
终端云服务专区
【一周推荐】每周精品帖子推荐---4月第1周
&花粉版主&
来自:浏览器
本帖最后由 小摩尔 于
14:07 编辑
10.png (115.94 KB, 下载次数: 7)
12:20 上传
9.png (3.94 KB, 下载次数: 6)
12:24 上传
2.png (645.24 KB, 下载次数: 5)
12:56 上传
3.png (70.02 KB, 下载次数: 6)
12:57 上传
1、基于安卓6.0的4.0几时更新?
答:游客,如果您要查看本帖隐藏内容请
2、通话声音小,有杂音?
答: 通话过程中按音量上键可以提高通话音量。
& && & 请在网络信号较好和噪音干扰小的环境下通话。
& && & 将耳朵对准听筒的位置,可有效提高通话音量。
& && & 请注意不要用手指或其他物体遮挡住麦克风(通常在手机底部),声源不要远离麦克风。
& && & 请使用华为标配耳机进行通话,非标配耳机可能会出现不兼容的情况。
& && & 若问题依然存在,请重启手机或备份重要数据后恢复出厂设置。
& && & 若重启手机或恢复出厂设置后通话仍然有问题,请联系客服或携带购机发票前往服务网点检修。
& && & 进入 查询全国服务网点
3、升级系统后,感觉系统卡顿,应用无响应?
答: 针对个别应用无响应,进入设置,应用程序管理中,找到对应的应用程序,将应用程序的缓存数据清空。
& && & 针对系统卡顿,报错,内存不足等情况,各种未知bug,备份好重要资料,双清下,双清教程:
更多常见问题解答:
好赞~鼓掌~
好赞~鼓掌~
好赞~鼓掌~
************************************************
【这就是华为P8】无金属,不旗舰--华为p8综合评测
http://club.huawei.com/thread--1.html
************************************************
width:100%">
&花粉达人&
来自:浏览器
width:100%">
&炉火纯青&
来自:浏览器
6支持!支持!
width:100%">
&花粉分区版主&
来自:浏览器
赶飞机过来支持一下,辛苦了!
width:100%">
&炉火纯青&
来自:浏览器
支持华为,支持花粉社区!
width:100%">
&禁止访问&
来自:浏览器
提示: 作者被禁止或删除 内容自动屏蔽
width:100%">
&初窥门径&
来自:浏览器
width:100%">
&炉火纯青&
来自:浏览器
非常实用!支持一下
width:100%">
&花粉达人&
来自:浏览器
给力,赞赞赞
width:100%">
&花粉分区版主&
来自:浏览器
前来支持,很不错的集合,谢谢分享
帮助解除烦恼与忧愁!
width:100%">
关注华为花粉俱乐部微信公众平台——“华为花粉俱乐部”
界面语言专区花粉勋章
剁手小王子
参加荣耀双十一晒单活动获奖花粉,颁发剁手小王子勋章
参加花粉俱乐部特定活动获取,人工发放
至少3个原创技术帖,每个帖≥5K浏览,有效回复数≥150,被加分数≥15
1000万花粉
纪念花粉俱乐部注册花粉数超过1000万
好基友勋章
花粉好机友,注册时间大于99天
在职斑竹的身份勋章,感谢斑竹的辛勤劳动
沙发王勋章
花粉大贡献
精华帖数 ≥ 15 并且 主题数 & 200 并且 发帖数 & 500 并且 威望 & 500
荣誉元老勋章
荣誉元老勋章
参加“为你写诗”原创情诗大赛获奖
花粉俱乐部6周年
花粉俱乐部6周年
评测骑士团
荣耀评测骑士团
至少5个原创技术帖,每个帖≥8K浏览,有效回复≥300,加分数达≥25
大富翁勋章
达到1万花瓣后可申请获得大富翁勋章
塞外好风光车与模帝都双彩虹夜色阑珊白天不懂夜的黑美丽的北京
花粉客户端
Make it Possible
Make your device special
华为云空间
Huawei cloud services
音乐播放器
Huawei Music
Huawei Vmall
关注花粉俱乐部
举报邮箱:
|关注花粉俱乐部:
增值电信业务经营许可证:苏B2-号|
Copyright (C)
华为软件技术有限公司 版权所有 保留一切权利&p&不要挡我,我要回答。&/p&&p&更新:&/p&&p&&b&不好意思知友们,本人临近毕业,腾讯云学生优惠也到期了,所以下载链接取消了,同时也有小伙伴私信我公开地址,任意分享作者的pdf是不好的,于是我就这样吧。估计要掉粉。。。不过通过我获得资源,还不如自己寻找资源,我就来详细介绍一下我寻找pdf资源的方法。&/b&&/p&&ul&&li&&b&Google大法好。&/b&&/li&&/ul&&p&&b&
比如我要《Python machine learning》这本pdf,于是我可以这样:&/b&&/p&&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-fbb4ffcf34acef497e6598_b.jpg& data-rawwidth=&721& data-rawheight=&599& class=&origin_image zh-lightbox-thumb& width=&721& data-original=&https://pic4.zhimg.com/50/v2-fbb4ffcf34acef497e6598_r.jpg&&&/figure&&p&点开第一个链接:&/p&&br&&figure&&img src=&https://pic4.zhimg.com/50/v2-3d24dcb7eacb699233ae_b.jpg& data-rawwidth=&825& data-rawheight=&517& class=&origin_image zh-lightbox-thumb& width=&825& data-original=&https://pic4.zhimg.com/50/v2-3d24dcb7eacb699233ae_r.jpg&&&/figure&&p&看,我们就下载到了第一本书。所以Google实在是居家必备的搜索方式。有同学问,如何上Google,这就涉及到如何翻墙的问题,小伙伴们自行解决啊,我买的ss代理,80元一年的,具体名称就不说了,免得有打广告的嫌疑。&/p&&ul&&li&&b&
微博&/b&&/li&&/ul&&p&&b&
话说微博网盘现在不好使了,但是还是能搜到一些pdf 的。&/b&&/p&&ul&&li&&b& 百度网盘&/b&&/li&&li&&b&印象笔记 本人经常逛一些论坛已经技术博客,看见有意思的就使用印象笔记截屏下来,制作成pdf&/b&&/li&&/ul&&p&&b&授人以鱼不如授人以渔,希望小伙伴们学会自己搜索信息,自己掌握的才是真正的本领,谢谢大家。&/b&&/p&&br&&p&更新:&/p&&p&知友们太给力啦,让我一个知乎小白不知道说什么好,而且私信我的同学特别多,于是我就自己做了一个服务器,将pdf放在了上面,地址见最后,复制文件地址用下载器下载,直接打开很慢,租的1元的腾讯云服务器,点完赞再拿啊,谢谢大家。&/p&&br&&p&-------------------我是分割线,以下为回答------------------------------------------------------------------------&/p&&br&&p&首推&Python machine learning&,这本书我看了两个星期,里面每一行代码都打过,印象特别深刻,而且特别易懂,准备再看第二遍。&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-87bbf92a7e2b3e39f08cc2_b.jpg& data-rawwidth=&481& data-rawheight=&619& class=&origin_image zh-lightbox-thumb& width=&481& data-original=&https://pic1.zhimg.com/50/v2-87bbf92a7e2b3e39f08cc2_r.jpg&&&/figure&&br&&br&&p&其次就是《Python for data analysis》,这本书可以作为工具书来看,特别棒,覆盖了很多知识点,在业务中需要的时候翻翻。&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-5d1dddb9ac6d2_b.jpg& data-rawwidth=&381& data-rawheight=&519& class=&content_image& width=&381&&&/figure&&br&&p&第三就是:《Data Science from Scratch First Principles with Python》,这本书真的棒啊,作者从最基础的线代、概率出发,讲解在python中各种数学公式的实现,有代码,也有解释,不是教你用库,对,教你从头写一个机器学习算法,从简单的逻辑回归到复杂的神经网络,都有涉及,最后还介绍了大数据中常用的MapReduce,非常清晰。&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-f13f4f6f5d4cfa7ef8062_b.jpg& data-rawwidth=&435& data-rawheight=&615& class=&origin_image zh-lightbox-thumb& width=&435& data-original=&https://pic3.zhimg.com/50/v2-f13f4f6f5d4cfa7ef8062_r.jpg&&&/figure&&br&&br&&br&&p&第四:周志华老师的《机器学习》,就是西瓜书,讲解了传统的机器学习各种算法的思想,每一章节后面还有小练习,非常棒。&/p&&p&第五:《deep learning》,今年刚出炉的,主要讲解了最近火的不行的深度学习。&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-331ecbad28e2b7365f2eeb92b3a01959_b.jpg& data-rawwidth=&597& data-rawheight=&615& class=&origin_image zh-lightbox-thumb& width=&597& data-original=&https://pic4.zhimg.com/50/v2-331ecbad28e2b7365f2eeb92b3a01959_r.jpg&&&/figure&&p&最后:《Deep learnig with keras》,现在学习深度学习谁不知道keras啊,这本书我看了两遍,感觉还是不够,里面讲解了keras使用入门到进阶,代码实现,一应俱全,真实难的的针对小白的书。&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-ab301f09eb91fc128dd2a_b.jpg& data-rawwidth=&483& data-rawheight=&625& class=&origin_image zh-lightbox-thumb& width=&483& data-original=&https://pic3.zhimg.com/50/v2-ab301f09eb91fc128dd2a_r.jpg&&&/figure&&br&&p&还有一些其他的书也是很棒的,我就不一一列举了,如果知友们有兴趣,我会继续更新的。&/p&
不要挡我,我要回答。更新:不好意思知友们,本人临近毕业,腾讯云学生优惠也到期了,所以下载链接取消了,同时也有小伙伴私信我公开地址,任意分享作者的pdf是不好的,于是我就这样吧。估计要掉粉。。。不过通过我获得资源,还不如自己寻找资源,…
&figure&&img src=&https://pic3.zhimg.com/v2-17fa123af066c303b45d7c79afdf99e0_b.jpg& data-rawwidth=&1440& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1440& data-original=&https://pic3.zhimg.com/v2-17fa123af066c303b45d7c79afdf99e0_r.jpg&&&/figure&&p&今天,小魔王给大家推荐一篇很久之前看过的写Python的文章,因为特别有趣,很喜欢,所以之前就收藏起来,在这里来和大家分享一下。&/p&&p&还是那句话,Python是很好的语言,也是AI、Data领域的一门常用语言。学好和掌握之后对于自己的计算机技术的长远非常有帮助。当然如果各位谁是转专业开始来学习计算机的话,Python也是我个人推荐首选学习的编程语言。&/p&&p&所以大家enjoy下面这篇诙谐的Python文章。(作者: 石雨浓、引自:完全用Python工作 )&/p&&p&---------------&/p&&p&第一天, 太初有道, 神谕, import light, 于是便有光。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d99773c39dab11c4aca2a1af8f9d426c_b.jpg& data-rawwidth=&519& data-rawheight=&322& class=&origin_image zh-lightbox-thumb& width=&519& data-original=&https://pic2.zhimg.com/v2-d99773c39dab11c4aca2a1af8f9d426c_r.jpg&&&/figure&&p&(Quick fact: 在python解释器里输入import antigravity有彩蛋)&/p&&p&作为一个业余物理工作者以及入门计算机使用者, 选择一门称手的编程语言是非常重要的事。从计算能带, 处理数据, 编写脚本到画图, 写个http服务器分享文件 (看上去很专业,实际在Python里只有一行), 做个网页, 几乎全部需要计算机完成。但是为了这其中每个不同的目的单独去学一门语言成本简直过于高, 于是需要一个一般用途(general-purpose)的语言,处理所有的事是非常自然的事情。&/p&&p&编程语言的两极是Assembly和Haskell, 一个接近硬件的本质, 一个接近计算的本质。一个是地狱, 处理着最繁琐最耗神的事情:内存分配, 系统调度, 硬件架构, 各种寄存器A1, B2。 一个是天堂, 优美的写着递归, 高阶函数, lambda表达式, 优美的并行计算(完全不用考虑race condition)。&/p&&p&然而我们生活在人间, 所以大规模应用的语言不可能如此纯粹。 两端中间游离着很多general-purpose的语言, C, C++, Java, Ruby, 几乎都能达到我们所有日常的要求。 只不过,这些语言能做的Python都能做,而且Python做得更好。&/p&&p&接下来我说明为什么。但是要说明,本文的读者不包括写嵌入式,写javascript以及写大型项目对性能要求极高的人(即使是大型项目也可以80%用python,20%用C),当然还有就是java和C++的重度患者。(完全使用XX工作意思不是&所有人都完全使用XX工作”!显然只是部分人。&/p&&p&更多的是,非专业编程但是想提高效率的人。比如之前有篇&完全使用*nix工作&,C#,iOS开发的人显然就一下也不能用。对于我,linux再好我也只能装在老电脑上交交CS225的作业。当我把mint, opensuse, archlinux装遍了,下一步就是gentoo了的时候,否决它只有一条理由,我笔记本电池不经用,而桌面linux的电源管理...... 感谢我的cpu风扇~!)&/p&&p&&b&首先,我想说的是,为什么不用下面这些大部分人很熟悉的语言:&/b&&/p&&p&1. C: 你难道指针扎得不疼么? 每天收垃圾很舒服? 键盘上P右边两个键是不是已经按坏了?
&br&2. C++: 学C++三年以内请不要说你会C++;
学了三年以上的人, 恭喜你们, 你过去几年浪费的时间我可以拿着香飘飘环绕地球一圈了。&br&3. Java: 不好意思, Java的面向对象对我来说是原子弹打原子。 而且Java7才引进Lambda表达式实在是太晚了, 即使java以后会跟python越来越像, 至于支持真正的函数式编程? 我希望下个末日之前可以实现. 而且有时候我确实需要单行执行的解释器而Java并没有。&br&4. Ruby: Ruby很好,但是你为什么不直接说你只是为了用RoR?&br&5. Lisp: 如果你用lisp, 你平时肯定会用python或者perl写脚本。 而且你会Lisp不去拯救世界还来看这篇文章干什么?! 抽象语法树什么的最讨厌了....&br&6. Perl: 我第一次看Perl的代码就感觉像用脚写的. &为什么满屏的正则表达式?&!&br&7. C#, php, javascript:呵呵。&br&8. Shell: 这算语言么?&br&9. Matlab: &br&第一,我穷酸学生没钱每年买你的正版, 看到激活码就想吐。 &br&第二,我不想心血来潮画两个心形函数的时候用1mb的窄带花两天下个5.03Gb的文件在我128Gb的固态硬盘里装,然后用完两个小时就删,如此循环。 &br&第三,我会python了不想再花时间学你的sb语法,熟悉你的.m文件。&br&第四,所有对windows的垄断的血泪控诉都直接对mathwork转过来吧~什么对开源,对自由,对的打击信仰~绝对适用~ &br&第五,python大部分时候如果不比你好用至少跟你一样好用,而这只是它不到10%的功能,几个程序员业余时间写出来的库。真心请matlab你这个没事发邮件“培训一个星期2000刀打折700刀”的大公司滚粗。&br&10. Haskell: 每次想静下心来学haskell 都会情不自禁从范畴论看起....&/p&&p&&b&对于单纯程序语言的使用者来说,用途(内在逻辑)大于一切不必要的语言细节。&/b&比如我就想建个数组放东西,为什么我要懂内存回收?!&/p&&p&所以在易用性方面,Python相对于他们作了很大改进的部分。&/p&&p&好吧,你会说Python没有缺点么。确实有,而且很严重,那就是运行慢。而且是慢出风格,慢出自信。(Python 3比Python 2 慢 15%以上, 这是一种什么风格!)相同的程序Python比C慢几百倍很正常。这让Python的发展受到很多限制。但是对于个人使用来说这个缺点完全不属于缺点。&/p&&p&第一,这个年代谁没有奔腾酷睿2什么的。你手机的运行能力都可以几毫秒内把你在厕所拍的几千张自拍液化,磨皮,磨骨好几遍了。而且你觉得0.01秒和0.5秒的区别真的那么大么?12秒也不是很久啊。&br&第二,很大程度上程序的慢更关乎于算法,比起O(n)和O(n^2)的区别, 语言间的差异就显得很小了。&br&第三,请注意,如果你使用过Python而且真实的觉得Python慢,那么情看下这个列表:&/p&&p&1. Google创立前的第一个网络爬虫;&br&2. Quora,美国最大在线知识问答平台,开复哥总是在上面拽文的;&br&3. Dropbox;&br&4. Youtube;&br&5. BT;&br&6. 知乎,中国的Quora;&br&7. 豆瓣,开创社交工具绿色系代表yp的先河。&/p&&p&你知道我要说什么了。.....恩~他们有一个共同点~ ------------ 都是Python写的!如果tmd的Dropbox没有觉得Python慢,请你也有足够的信心不要觉得Python慢。另外八卦一下,现在Python之父前两天从google去Dropbox了,这是很值得自豪的事, 值得Dropbox为之自豪。&/p&&p&Python是荷兰人van Rossum1991年开发完成的脚本解释语言。起这个脑缺的名字是因为他是一个叫做Monty Python的脑缺喜剧团体的脑残粉(BTW,Monty Python出演的巨蟒与圣杯是英国电影史上跟大话西游同样地位的喜剧,其中亚瑟王被黑成了炭,里面圆桌骑士们拿着块石头敲来敲去各处蹦达着,看影评我才知道这是表示他们在骑马%&……×().
于是人们知道以这么脑残的名字取的语言不是像brainfuck语言一样是brainfucker,那么就会像莫里盖尔曼以乔伊斯“芬尼根的守夜人”中虚构名词来命名的夸克一样,成为一个一个不朽的新创造。Python显然属于后者。 &/p&&p&接下来,说正题,为什么Python如此先进(对于初学者)。&/p&&ul&&li&&strong&代码简洁性和可读性&/strong&&br&&/li&&/ul&&br&&p&写过hello world,hello android, hello **的人都知道,&b&学语言最好的途径就是写和读&/b&(即使是学书面的自然语言)。所以代码的可读性是选择学一门语言的关键因素,因为你代以后会花很多时间读别人的代码。可读性带来的影响是非常深远的。有种说法, 说在遥远的古代阿拉伯数字传入之前欧洲之前, 其数学发展几乎为0, 而造成这种缓慢的原因就是因为复杂的罗马数字的广泛使用。&/p&&p&这表明很多时候即使我们不愿意承认, 往往是形式决定的内容。 比如罗马数字没有0, 自然很多数学概念就难以发展。 没有流形也不可能发展广义相对论一样。 所以............如果想以后从此过上幸福的生活, 请不要选用perl。
如果不幸选择了perl, 那么就君就 一入侯门深似海,从此萧郎是路人 了。当以后你两行清泪的看着自己十天前写的不过10几行的楔形文字时, 你就会明白。&/p&&p&而Python的可读性是我见过最好的:&/p&&p&1. Python的代码格式使用缩进而不是括号。 首先节省了很多行数, 变得而为紧凑, 而美观。相传的俄罗斯人偷美国NASA的C代码那个段子满屏括号的情况是不可能出现Python版本的。&br&2.逻辑相当清晰. 循环的结束与开始一目了然。&br&3. 屏幕右方得到充分利用. 比如使用24寸屏幕的人是不是感觉自己总是望着左边编程.....和17寸等高的屏幕区别不大, 很费右边的电。&/p&&p&比如, 这是某个C用来图像采样的算法的代码:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-931fef94be5bda27a10a82ce14c8a739_b.jpg& data-rawwidth=&584& data-rawheight=&540& class=&origin_image zh-lightbox-thumb& width=&584& data-original=&https://pic3.zhimg.com/v2-931fef94be5bda27a10a82ce14c8a739_r.jpg&&&/figure&&p&好吧, 很带萌感, 画风也很不错。&/p&&p&但是Python也不是写不出混乱的代码, 或者说只要有一定自由性的语言就可以写出。 比如没事写个(Pseudo Code): boolean AlwaysTrue = F 或者int MagicNumber =42; 什么的。&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//rrurl.cn/6NRCe7& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这个&/a&是Python版, 完全不符合Python哲学。&/p&&ul&&li&&strong&Python的思想&/strong&&br&&/li&&/ul&&br&&p&上面一点是语言形式的, C也可以改成缩进, 所以此项不是核心优势. 而使用一门语言是使用它的思想. 于是要谈到Python的哲学, The Zen of Python。在python命令行里输入import this可以看到:&/p&&p&Beautiful is better than ugly.美优于丑&br&Explicit is better than implicit.晰胜于浑&br&Simple is better than complex. 简胜于繁&br&Complex is better than complicated. 繁胜于杂&br&Flat is better than nested. 平胜于嵌&br&Sparse is better than dense. 稀胜于稠&br&Readability counts. 可读至上&br&Special cases aren't special enough to break the rules. 殊例不足违训&br&Although practicality beats purity. 虽实用大于纯粹&br&Errors should never pass silently. 谬不可疏&br&Unless explicitly silenced. 除明示&br&In the face of ambiguity, refuse the temptation to guess. 晦不存疑&br&There should be one-- and preferably only one --obvious way to do it. 一法万用&br&Although that way may not be obvious at first unless you're Dutch. 若非尼德兰红毛,法难定 (......科学没有国籍)&br&Now is better than never. 今胜于无&br&Although never is often better than *right* now. 无胜于促&br&If the implementation is hard to explain, it's a bad idea. 难述其施,谬法也&br&If the implementation is easy to explain, it may be a good idea. 其施可述,或可行Namespaces are one honking great idea -- let's do more of those!命名空间,多多益善&/p&&p&如果觉得俺翻译得太烂可以看英文。 但是你看到一个物品/工具/器件/用品的设计理念是如上时, 除开认为设计者装逼之外, 必定会觉得这个工具是十分可靠, 清爽的。 首先看到这个蹩脚的诗我就想到的是Unix伟大的亲嘴原则(Keep It Simple and Stupid), 而Python的确如此。(部分)解读如下:&/p&&p&美优于丑。我只想举一个例子,你们感受一下(哈哈哈哈)。学C语言写辗转相除的novice们先include你的stdio去吧:&/p&&p&
-----&/p&&p&
def gcd(x, y):&/p&&p&
while y:&/p&&p&
x, y = y, x%y&/p&&p&
return x&/p&&p&
----&/p&&p&明晰胜于浑晦:&/p&&p&
Python逻辑与或用and 和 or 而不是
&& 和 ||&/p&&p&简胜于繁,繁胜于杂,平胜于嵌,稀胜于稠 可读至上:&/p&&p&
分别用C和Python写个hello world就能明白。&/p&&p&特例不足违反规则:&/p&&p&
这句话最好的例子是Python没有char类型。因为大伙儿认为char只是一位的字符串。&/p&&p&实用大于纯粹:&/p&&p&
于是Python里有chr()。&/p&&p&谬不可疏 除明示:&/p&&p&
有时候exception还是重要的。&/p&&p&晦不存疑,一法万用:&/p&&p&
1. 与其用iterator, for循环, 指针移动,数组下标移动, 不如一个for...in...直接解决问题。&/p&&p&
2. list,dict和tuple的数据结构也是希望能适用于绝大部分场合。这三位可以在必要的时候变成:列表,栈,队列,哈希表,七七八八各种东西....&/p&&p&
3. 函数的参数也勉强可以算进来。利用*和**, python的函数参数灵活性无以复加。&/p&&p&若非尼德兰红毛,法难定:&/p&&p&
第一次看到荷兰人写的xx= if yy&0 then 0 else 1 是不是想哭...&/p&&p&中间几句太哲学了.....:&/p&&p&
略过....&/p&&p&命名空间,多多益善:&/p&&p&
面向对象...&/p&&p&这些特性简直可以形容为黑曼巴...灵活,准确,快速,强力。&/p&&p&Python语法的优美之处数不胜数,难以名状,深入人心,犬牙交错,人神共愤,不随意肌。语法是思想的延伸,有人说你学一门新语言而不学习新的思想则。还是新评装旧酒。由于我不是写tutorial,就不一一讲述所有的细节了。 只列举下最好和简单的特性, 而像decorator(面向切面),generator,多线程,itertools,一次肯定也讲不完。&/p&&p&1. Python中的整数相当于C中的长整型(long), 32位的机器上整型取值范围为 -至, 64位机器上为-75807。Python的长整型是无限制的,只要内存允许。很相似的是Python里的无限list。一个很著名的例子是使用生成器(generator),就可以生成一个无限长的Fibonacci数列;&/p&&p&------&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&fib&/span&&span class=&p&&():&/span&
&span class=&n&&a&/span&&span class=&o&&=&/span&&span class=&n&&b&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&
&span class=&k&&while&/span& &span class=&bp&&True&/span&&span class=&p&&:&/span&
&span class=&k&&yield&/span& &span class=&n&&a&/span& &span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&o&&=&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&a&/span&&span class=&o&&+&/span&&span class=&n&&b&/span&
&/code&&/pre&&/div&&p&这个数列号称无限长,其实是需要运算哪一位时才计算。这就是著名的&a href=&https://link.zhihu.com/?target=http%3A//rrurl.cn/ijhaa2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&惰性求值&/a&。Python中的长整型和无限list的概念均来自于Haskell。&/p&&p&对于C和C++要处理大数据要使用高精度算法, 用一个struct表示一个大数, 使用一个array储存它, 然后自定义运算函数(加减乘除)。&/p&&p&2. List comprehension,切片等操作&/p&&p&使用list comprehension可以杜绝掉50%以上的for循环,后者的效率极其低下(可以看看C源码的实现),而且不够紧凑。我之前上面举的第一个粒子就是list comprehension的很好的运用。随便举个python官方文档的粒子:
&&& [(x, y) for x in [1,2,3] for y in [3,1,4] if x !=y]&/p&&p&
运行结果得到,&/p&&p&
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]&/p&&p&反转一个数列的例子,是个one-liner :&/p&&p&
lis[::-1]&/p&&p& 3. 正则表达式&/p&&p&Python正则表达是内置的。一个粒子是我在实验室测试Josephson Junctions时碰到的情况,简化的说就是:我有几百个文件夹,每个文件夹有几百个文件,每个文件有几万条数据,每几个数据我要处理完然后存在另外一个文件夹的另外一个文件里。我要做的工作有:&/p&&p&
-用正则表达式找到我要的文件夹和文件,剔除不需要的;&/p&&p&
-逐行读出txt文件里面的数据;&/p&&p&
-每几个数据设个参数平均,最小二乘处理,剔除几个极端情况,画出图;&/p&&p&
-保存 这里Python就起到了一个脚本语言应尽的责任了。&/p&&p&整个从打开文件到保存 不超过150行,还加上我罗哩叭嗦的注释。如果用C写... 呵呵呵呵呵呵。当然这个用Shell也不会太差,不过实验室用的是windows,用windows脚本我还不如去死。自从我写完这个脚本后,从此我们实验室的testing就过上了幸福的生活。(可能么?)&/p&&p&4.reduce, lambda, filter 和map&/p&&p& 这些全来自于函数式编程。比如找到prime之内的质数:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&nb&&filter&/span&&span class=&p&&(&/span&&span class=&k&&lambda&/span& &span class=&n&&prime&/span&&span class=&p&&:&/span& &span class=&nb&&all&/span&&span class=&p&&(&/span&&span class=&n&&prime&/span&&span class=&o&&%&/span&&span class=&n&&num&/span& &span class=&k&&for&/span& &span class=&n&&num&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&n&&prime&/span&&span class=&p&&)),&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span&&span class=&n&&prime&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&&p&如果作为中文读出来则是(prime是之前给定的一个数):在2到prime之间,过滤出那些所有不被2到自己整除的数。难道还能更简单么!如果用的C, 呵呵。 这里出现了Zen of Python没有提到但是是Python里非常重要的一点,对“数”的操纵。毕达哥拉斯信奉一切皆数,程序语言更应算更是如此,只有对“数”和“类型”的完全掌控,才能如鱼得水。&/p&5. 语言的动态性 Python是动态语言,这是非常重要的一点,一直忘了说。这一点可以直接完爆C++自己一向自豪的泛型编程,模板编程。且看一个strangeness为0的粒子:&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&build&/span&&span class=&p&&(&/span&&span class=&nb&&type&/span&&span class=&p&&,&/span& &span class=&n&&value&/span&&span class=&p&&):&/span&
&span class=&k&&return&/span& &span class=&nb&&type&/span&&span class=&p&&(&/span&&span class=&n&&value&/span&&span class=&p&&)&/span&
&span class=&n&&build&/span&&span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&所以稀饭们请看过来, 你们家C可以三行写出这种东西么?!!没完,接着:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&def impose(func, value):
return func(value)
def anyfunc(value):
return value*value
print impose(anyfunc, value) #此处是python2.7的语法
&/code&&/pre&&/div&&p&一看就知道是函数式编程。请问C可以么?!&/p&&p&当然还有之前说的函数参数的灵活性:&/p&&p&如果定义一个函数&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&def print_whatevercrapsthefuckinguserinputs(**params):
print params
&/code&&/pre&&/div&&p&你就可以想输入多少参数就输入多少了,比如:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&print_whatevercrapsthefuckinguserinputs&/span&&span class=&p&&(&/span&&span class=&err&&“&/span&&span class=&n&&I&/span&&span class=&s2&&&,”dont&&/span&&span class=&p&&,&/span& &span class=&s2&&&give&&/span&&span class=&p&&,&/span& &span class=&s2&&&a&&/span&&span class=&p&&,&/span& &span class=&s2&&&fuck“),&/span&
&/code&&/pre&&/div&&p&只要有print函数的接口(这又涉及了鸭子类型和类似haskell的typeclass的性质, 呱....)。其实际作用是 比如你想在数据库里输入大批量用户信息,mi amigo,对于这样一个蛋疼的函数名字,调用一次就够了。&/p&&p&在Python里类型,函数,全部都是可操作的对象。这可以改变一切。第一个例子显示了对数据类型的操作,第二个是对函数的操作,第三个是对参数的控制。我不想想象用C写这个例子了,因为C根本写不出来。 以上所有这些Python的特性,你可能说我用C实现一个一样的就好了。诚然,你可以在C里一个个写出来自己喜欢的特性,但是你写到后面你会发现你只是再次发明了Python,然后拿C重新写了一个解释器, 而且实现得更烂而已。Please! Don't re-invent the wheel。&/p&&br&&ul&&li&&strong&Python的类库齐全&/strong&&br&&/li&&/ul&&br&&p&对于我们普通人来说一个语言最重要的还是库函数的齐全程度,Java在此方面已经登峰造极了。而现在的Python不输于他。一个语言的火热程度可以从类库看出, 下面是github上语言的排名: &/p&&figure&&img src=&https://pic2.zhimg.com/v2-5d5f97ece19e05d8c394_b.jpg& data-rawwidth=&720& data-rawheight=&372& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic2.zhimg.com/v2-5d5f97ece19e05d8c394_r.jpg&&&/figure&&p&由于Javscript的特殊性和Ruby的RoR我们就不去管它了,Python占8%,C占6%. 貌似差得不远, 恩。但是如果你仔细看C的project,随便翻十页可能发现会有三页的项目其实是在写python的类库。真是母亲为孩子显出一切。&/p&&p&另外一个说明Python类库齐全的例子是我这个学期被某教授压着要算一个固体模型的Berry's Phase。正值final之前, 如何有心思写这厮。一筹莫展之际竟然发现python有个固体算能带和巴里态的库!!nm这也能有!? 仔细观摩了下源代码, 1000来行,干净整洁, 速度用之,皆大欢喜。这种小众库都有我已经不能想象你有什么变态要求Python不能满足了。以下是一些常用的类库。&/p&&p&1.如果你想写网络应用,轻量级:web.py (web.py的作者最近自杀去世,RIP)中量级:Django,Pylon 重量级:twist。其实很多人诟病Python的网络框架过于多,不能集中起来,我倒觉得无所谓。我用过Django, 写个小小的博客程序,1000多行,这是用java不可想象的。Youtube上有个半个小时的用Django写博客的演示:&a href=&https://link.zhihu.com/?target=http%3A//rrurl.cn/7kYG1A& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://www.youtube.com/watch?v=srHZoj3ASmk&/a& 。 半个小时!!一边写一边讲!一个博客程序!!还带后台功能!What the F*! 是编程么!?我脱稿写个平衡树都不只半个小时啊!&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ae3b1b4be_b.jpg& data-rawwidth=&720& data-rawheight=&327& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic4.zhimg.com/v2-ae3b1b4be_r.jpg&&&/figure&&p&2.如果你想做科学计算,NumPy&SciPy可以取代90%matlab的常用功能,然后让我想一想,他们好像只有几十mb!!加上Pythonxy也才700mb多!但是你没有更多的新学语法的成本,也不用付给mathwork血汗钱。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-734eeacb2568_b.jpg& data-rawwidth=&197& data-rawheight=&188& class=&content_image& width=&197&&&/figure&&p&3.网络爬虫。Python的超强项,beautifulsoup的网页解析,scrapy等等,不一而足。Twitter, 微博等好像也有python的API。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-08a713b639f5a6b3fbe09_b.jpg& data-rawwidth=&692& data-rawheight=&206& class=&origin_image zh-lightbox-thumb& width=&692& data-original=&https://pic1.zhimg.com/v2-08a713b639f5a6b3fbe09_r.jpg&&&/figure&&p&4.Machine Learning,数据分析和Natural Language Processing。 请去Kaggle上看看多少参赛者是用的Python。 著名的库有Pandas。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c682b4a0a90e_b.jpg& data-rawwidth=&615& data-rawheight=&125& class=&origin_image zh-lightbox-thumb& width=&615& data-original=&https://pic1.zhimg.com/v2-c682b4a0a90e_r.jpg&&&/figure&&p&5.桌面应用。 pyqt。Dropbox貌似就是使用的pyqt写的。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ab11ac0dc750e2c0302e5_b.jpg& data-rawwidth=&982& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&982& data-original=&https://pic1.zhimg.com/v2-ab11ac0dc750e2c0302e5_r.jpg&&&/figure&&p&最后我想讲下Python Challenge。Python作为一个强劲的编程语言有着极为活跃的社区,文档丰富,教程齐全。当然就有很好的网上解谜过关类的教程。Python Challenge是在各个类型的解谜过关性的我看到过的最好的一个。难度适中,而且可以从中学到很多。解法不局限于python,可以用perl, shell,C甚至Erlang!官方解答往往有10多种解法,精妙至极。但是你会一步步从中发现Python的优势。一共33关,在充满乐趣的智力挑战和极大的满足感后,你可以学到PIL库的使用,pickle的使用,正则表达式,完成后你会发现思维方式的改变。&/p&&p&Last words&/p&&p&神爱众人,于是带来Python。&/p&&p&
---------------PIRATICUS 13:7&/p&
今天,小魔王给大家推荐一篇很久之前看过的写Python的文章,因为特别有趣,很喜欢,所以之前就收藏起来,在这里来和大家分享一下。还是那句话,Python是很好的语言,也是AI、Data领域的一门常用语言。学好和掌握之后对于自己的计算机技术的长远非常有帮助。…
&figure&&img src=&https://pic4.zhimg.com/v2-a4c09d6a84950dbf7d3f7b51393ac91a_b.jpg& data-rawwidth=&587& data-rawheight=&442& class=&origin_image zh-lightbox-thumb& width=&587& data-original=&https://pic4.zhimg.com/v2-a4c09d6a84950dbf7d3f7b51393ac91a_r.jpg&&&/figure&Python中的装饰器有很多用处,比如输出日志、参数检查、代理设置、计数计时、结果缓存等等。本文就通过几个装饰器例子,详细解释一下Python中装饰器的用法。&ul&&li&一步步从简到繁学习装饰器用法&br&&/li&&li&其他一些装饰器实例&/li&&li&Python中自带的装饰器&/li&&/ul&&br&按照惯例,先上代码:&a href=&https://link.zhihu.com/?target=https%3A//github.com/xianhu/LearnPython& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - xianhu/LearnPython: 以撸代码的形式学习Python&/a&&br&&h2&一步步从简到繁学习装饰器用法&/h2&&p&(1)最简单的装饰器,实现日志输出功能:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 构建装饰器&/span&
&span class=&k&&def&/span& &span class=&nf&&logging&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&):&/span&
&span class=&nd&&@functools.wraps&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&decorator&/span&&span class=&p&&():&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&&/span&&span class=&si&&%s&/span&&span class=&s2&& called&&/span& &span class=&o&&%&/span& &span class=&n&&func&/span&&span class=&o&&.&/span&&span class=&n&&__name__&/span&&span class=&p&&)&/span&
&span class=&n&&result&/span& &span class=&o&&=&/span& &span class=&n&&func&/span&&span class=&p&&()&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&&/span&&span class=&si&&%s&/span&&span class=&s2&& end&&/span& &span class=&o&&%&/span& &span class=&n&&func&/span&&span class=&o&&.&/span&&span class=&n&&__name__&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&result&/span&
&span class=&k&&return&/span& &span class=&n&&decorator&/span&
&span class=&c1&&# 使用装饰器&/span&
&span class=&nd&&@logging&/span&
&span class=&k&&def&/span& &span class=&nf&&test01&/span&&span class=&p&&():&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 测试用例&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test01&/span&&span class=&p&&())&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test01&/span&&span class=&o&&.&/span&&span class=&n&&__name__&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&代码很简单,很容易看懂。这里注意&functools.wraps&用法,其目的是&test01.__name__&输出正确的&test01&。&@logging&相当于&test01 = logging(test01)&,返回的是decorator函数,所以如果不加&functools.wraps&,则&test01.__name__&返回为&decorator&。&/p&&p&注意,此时test01没有参数,对于带有参数的函数,logging装饰器则不再适用。那么如果想装饰带有参数的函数,装饰器该怎么写呢?&/p&&p&(2)装饰器传入函数参数,并正确返回结果:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 构建装饰器&/span&
&span class=&k&&def&/span& &span class=&nf&&logging&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&):&/span&
&span class=&nd&&@functools.wraps&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&decorator&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&&/span&&span class=&si&&%s&/span&&span class=&s2&& called&&/span& &span class=&o&&%&/span& &span class=&n&&func&/span&&span class=&o&&.&/span&&span class=&n&&__name__&/span&&span class=&p&&)&/span&
&span class=&n&&result&/span& &span class=&o&&=&/span& &span class=&n&&func&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&)&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&&/span&&span class=&si&&%s&/span&&span class=&s2&& end&&/span& &span class=&o&&%&/span& &span class=&n&&func&/span&&span class=&o&&.&/span&&span class=&n&&__name__&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&result&/span&
&span class=&k&&return&/span& &span class=&n&&decorator&/span&
&span class=&c1&&# 使用装饰器&/span&
&span class=&nd&&@logging&/span&
&span class=&k&&def&/span& &span class=&nf&&test01&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&in function test01, a=&/span&&span class=&si&&%s&/span&&span class=&s2&&, b=&/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 测试用例&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test01&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&&p&这里的test01函数带有参数a、b,那么decorator函数带有同样的参数即可。那么问题又来了,如何让logging装饰器更加通用,而不是只装饰参数为两个的函数呢?这时候自然想到Python中的 * 和 ** 的用法。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 构建装饰器&/span&
&span class=&k&&def&/span& &span class=&nf&&logging&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&):&/span&
&span class=&nd&&@functools.wraps&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&decorator&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&o&&**&/span&&span class=&n&&kwargs&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&&/span&&span class=&si&&%s&/span&&span class=&s2&& called&&/span& &span class=&o&&%&/span& &span class=&n&&func&/span&&span class=&o&&.&/span&&span class=&n&&__name__&/span&&span class=&p&&)&/span&
&span class=&n&&result&/span& &span class=&o&&=&/span& &span class=&n&&func&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&o&&**&/span&&span class=&n&&kwargs&/span&&span class=&p&&)&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&&/span&&span class=&si&&%s&/span&&span class=&s2&& end&&/span& &span class=&o&&%&/span& &span class=&n&&func&/span&&span class=&o&&.&/span&&span class=&n&&__name__&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&result&/span&
&span class=&k&&return&/span& &span class=&n&&decorator&/span&
&span class=&c1&&# 使用装饰器&/span&
&span class=&nd&&@logging&/span&
&span class=&k&&def&/span& &span class=&nf&&test01&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&in function test01, a=&/span&&span class=&si&&%s&/span&&span class=&s2&&, b=&/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 使用装饰器&/span&
&span class=&nd&&@logging&/span&
&span class=&k&&def&/span& &span class=&nf&&test02&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&in function test02, a=&/span&&span class=&si&&%s&/span&&span class=&s2&&, b=&/span&&span class=&si&&%s&/span&&span class=&s2&&, c=&/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 测试用例&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test01&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&))&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test02&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&o&&=&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&n&&d&/span&&span class=&o&&=&/span&&span class=&mi&&4&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&&p&此时对于任意参数的函数,logging都可以进行装饰。但是注意,logging装饰器是不带参数的,那么装饰器可以带参数吗?当然可以,我们换个例子:参数检查。&/p&&p&(3)构建带有参数的装饰器,并正确返回结果:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 构建装饰器&/span&
&span class=&k&&def&/span& &span class=&nf&&params_chack&/span&&span class=&p&&(&/span&&span class=&n&&a_type&/span&&span class=&p&&,&/span& &span class=&n&&b_type&/span&&span class=&p&&):&/span&
&span class=&k&&def&/span& &span class=&nf&&_outer&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&):&/span&
&span class=&nd&&@functools.wraps&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&_inner&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&):&/span&
&span class=&k&&assert&/span& &span class=&nb&&isinstance&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&a_type&/span&&span class=&p&&)&/span& &span class=&ow&&and&/span& &span class=&nb&&isinstance&/span&&span class=&p&&(&/span&&span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&b_type&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&func&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&_inner&/span&
&span class=&k&&return&/span& &span class=&n&&_outer&/span&
&span class=&c1&&# 使用装饰器&/span&
&span class=&nd&&@params_chack&/span&&span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&nb&&list&/span&&span class=&p&&,&/span& &span class=&nb&&tuple&/span&&span class=&p&&))&/span&
&span class=&k&&def&/span& &span class=&nf&&test03&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&in function test03, a=&/span&&span class=&si&&%s&/span&&span class=&s2&&, b=&/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 测试用例&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test03&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&]))&/span&
&span class=&c1&&# 参数正确&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test03&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&))&/span&
&span class=&c1&&# 参数错误&/span&
&/code&&/pre&&/div&&p&从代码可以看出,实际上就是在原有装饰器的基础上,外层又加了一层包装。params_check装饰器的作用是限制第一个参数为a_type,第二个参数为b_type。类似于(2),这里如何让装饰器更加通用,而不是只装饰参数为两个的函数呢?这里又一次想到Python中的 * 和 **。&/p&&br&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 构建装饰器&/span&
&span class=&k&&def&/span& &span class=&nf&&params_chack&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&types&/span&&span class=&p&&,&/span& &span class=&o&&**&/span&&span class=&n&&kwtypes&/span&&span class=&p&&):&/span&
&span class=&k&&def&/span& &span class=&nf&&_outer&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&):&/span&
&span class=&nd&&@functools.wraps&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&_inner&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&o&&**&/span&&span class=&n&&kwargs&/span&&span class=&p&&):&/span&
&span class=&n&&result&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&nb&&isinstance&/span&&span class=&p&&(&/span&&span class=&n&&_param&/span&&span class=&p&&,&/span& &span class=&n&&_type&/span&&span class=&p&&)&/span& &span class=&k&&for&/span& &span class=&n&&_param&/span&&span class=&p&&,&/span& &span class=&n&&_type&/span& &span class=&ow&&in&/span& &span class=&nb&&zip&/span&&span class=&p&&(&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&n&&types&/span&&span class=&p&&)]&/span&
&span class=&k&&assert&/span& &span class=&nb&&all&/span&&span class=&p&&(&/span&&span class=&n&&result&/span&&span class=&p&&),&/span& &span class=&s2&&&params_chack: invalid parameters&&/span&
&span class=&n&&result&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&nb&&isinstance&/span&&span class=&p&&(&/span&&span class=&n&&kwargs&/span&&span class=&p&&[&/span&&span class=&n&&_param&/span&&span class=&p&&],&/span& &span class=&n&&kwtypes&/span&&span class=&p&&[&/span&&span class=&n&&_param&/span&&span class=&p&&])&/span& &span class=&k&&for&/span& &span class=&n&&_param&/span& &span class=&ow&&in&/span& &span class=&n&&kwargs&/span& &span class=&k&&if&/span& &span class=&n&&_param&/span& &span class=&ow&&in&/span& &span class=&n&&kwtypes&/span&&span class=&p&&]&/span&
&span class=&k&&assert&/span& &span class=&nb&&all&/span&&span class=&p&&(&/span&&span class=&n&&result&/span&&span class=&p&&),&/span& &span class=&s2&&&params_chack: invalid parameters&&/span&
&span class=&k&&return&/span& &span class=&n&&func&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&o&&**&/span&&span class=&n&&kwargs&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&_inner&/span&
&span class=&k&&return&/span& &span class=&n&&_outer&/span&
&span class=&c1&&# 使用装饰器&/span&
&span class=&nd&&@params_chack&/span&&span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&,&/span& &span class=&nb&&str&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&o&&=&/span&&span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&,&/span& &span class=&nb&&str&/span&&span class=&p&&))&/span&
&span class=&k&&def&/span& &span class=&nf&&test04&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&in function test04, a=&/span&&span class=&si&&%s&/span&&span class=&s2&&, b=&/span&&span class=&si&&%s&/span&&span class=&s2&&, c=&/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 测试用例&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test04&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&s2&&&str&&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&))&/span&
&span class=&c1&&# 参数正确&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test04&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&s2&&&str&&/span&&span class=&p&&,&/span& &span class=&s2&&&abc&&/span&&span class=&p&&))&/span&
&span class=&c1&&# 参数正确&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test04&/span&&span class=&p&&(&/span&&span class=&s2&&&str&&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&s2&&&abc&&/span&&span class=&p&&))&/span&
&span class=&c1&&# 参数错误&/span&
&/code&&/pre&&/div&&p&此时params_check装饰器不但能够传入任意个数的参数,而且支持K-V形式的参数传递。&/p&&p&(4)使用装饰器装饰类中的函数,比较简单,直接看代码。注意此时第一个参数为self本身:&/p&&br&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 使用装饰器&/span&
&span class=&k&&class&/span& &span class=&nc&&ATest&/span&&span class=&p&&(&/span&&span class=&nb&&object&/span&&span class=&p&&):&/span&
&span class=&nd&&@params_chack&/span&&span class=&p&&(&/span&&span class=&nb&&object&/span&&span class=&p&&,&/span& &span class=&nb&&int&/span&&span class=&p&&,&/span& &span class=&nb&&str&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&test&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&in function test of ATest, a=&/span&&span class=&si&&%s&/span&&span class=&s2&&, b=&/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 测试用例&/span&
&span class=&n&&a_test&/span& &span class=&o&&=&/span& &span class=&n&&ATest&/span&&span class=&p&&()&/span&
&span class=&n&&a_test&/span&&span class=&o&&.&/span&&span class=&n&&test&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&s2&&&str&&/span&&span class=&p&&)&/span&
&span class=&c1&&# 参数正确&/span&
&span class=&n&&a_test&/span&&span class=&o&&.&/span&&span class=&n&&test&/span&&span class=&p&&(&/span&&span class=&s2&&&str&&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&c1&&# 参数错误&/span&
&/code&&/pre&&/div&&p&(5)多个装饰器同时装饰一个函数,也比较简单,直接看代码:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 使用装饰器&/span&
&span class=&nd&&@logging&/span&
&span class=&nd&&@params_chack&/span&&span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&,&/span& &span class=&nb&&str&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&nb&&list&/span&&span class=&p&&,&/span& &span class=&nb&&tuple&/span&&span class=&p&&))&/span&
&span class=&k&&def&/span& &span class=&nf&&test05&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&in function test05, a=&/span&&span class=&si&&%s&/span&&span class=&s2&&, b=&/span&&span class=&si&&%s&/span&&span class=&s2&&, c=&/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 测试用例&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test05&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&s2&&&str&&/span&&span class=&p&&,&/span& &span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&]))&/span&
&span class=&c1&&# 参数正确&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test05&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&s2&&&str&&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&)))&/span&
&span class=&c1&&# 参数正确&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test05&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&s2&&&str&&/span&&span class=&p&&,&/span& &span class=&s2&&&str1str2&&/span&&span class=&p&&))&/span&
&span class=&c1&&# 参数错误&/span&
&/code&&/pre&&/div&&p&(6)将装饰器写为类的形式,即“装饰器类”。此时对于装饰器类的要求是必须是可被调用的,即必须实现类的__call__方法。直接上代码:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 构建装饰器类&/span&
&span class=&k&&class&/span& &span class=&nc&&Decorator&/span&&span class=&p&&(&/span&&span class=&nb&&object&/span&&span class=&p&&):&/span&
&span class=&k&&def&/span& &span class=&nf&&__init__&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&n&&func&/span&&span class=&p&&):&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&func&/span& &span class=&o&&=&/span& &span class=&n&&func&/span&
&span class=&k&&return&/span&
&span class=&k&&def&/span& &span class=&nf&&__call__&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&o&&*&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&o&&**&/span&&span class=&n&&kwargs&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&&/span&&span class=&si&&%s&/span&&span class=&s2&& called&&/span& &span class=&o&&%&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&func&/span&&span class=&o&&.&/span&&span class=&n&&__name__&/span&&span class=&p&&)&/span&
&span class=&n&&result&/span& &span class=&o&&=&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&func&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&o&&**&/span&&span class=&n&&kwargs&/span&&span class=&p&&)&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&&/span&&span class=&si&&%s&/span&&span class=&s2&& end&&/span& &span class=&o&&%&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&func&/span&&span class=&o&&.&/span&&span class=&n&&__name__&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&result&/span&
&span class=&c1&&# 使用装饰器&/span&
&span class=&nd&&@Decorator&/span&
&span class=&k&&def&/span& &span class=&nf&&test06&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&in function test06, a=&/span&&span class=&si&&%s&/span&&span class=&s2&&, b=&/span&&span class=&si&&%s&/span&&span class=&s2&&, c=&/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 测试用例&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test06&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&这里的装饰器类的构造函数中传入func,使其能在__call__方法中被调用。同时这里的装饰器类并没有带有参数,实现不了类似于参数检查的功能。类似于上边的思路,我们这里也可以构建带有参数的装饰器类,还是以参数检查为例:&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 构建装饰器类&/span&
&span class=&k&&class&/span& &span class=&nc&&ParamCheck&/span&&span class=&p&&(&/span&&span class=&nb&&object&/span&&span class=&p&&):&/span&
&span class=&k&&def&/span& &span class=&nf&&__init__&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&o&&*&/span&&span class=&n&&types&/span&&span class=&p&&,&/span& &span class=&o&&**&/span&&span class=&n&&kwtypes&/span&&span class=&p&&):&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&types&/span& &span class=&o&&=&/span& &span class=&n&&types&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&kwtypes&/span& &span class=&o&&=&/span& &span class=&n&&kwtypes&/span&
&span class=&k&&return&/span&
&span class=&k&&def&/span& &span class=&nf&&__call__&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&n&&func&/span&&span class=&p&&):&/span&
&span class=&nd&&@functools.wraps&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&_inner&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&o&&**&/span&&span class=&n&&kwargs&/span&&span class=&p&&):&/span&
&span class=&n&&result&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&nb&&isinstance&/span&&span class=&p&&(&/span&&span class=&n&&_param&/span&&span class=&p&&,&/span& &span class=&n&&_type&/span&&span class=&p&&)&/span& &span class=&k&&for&/span& &span class=&n&&_param&/span&&span class=&p&&,&/span& &span class=&n&&_type&/span& &span class=&ow&&in&/span& &span class=&nb&&zip&/span&&span class=&p&&(&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&types&/span&&span class=&p&&)]&/span&
&span class=&k&&assert&/span& &span class=&nb&&all&/span&&span class=&p&&(&/span&&span class=&n&&result&/span&&span class=&p&&),&/span& &span class=&s2&&&params_chack: invalid parameters&&/span&
&span class=&n&&result&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&nb&&isinstance&/span&&span class=&p&&(&/span&&span class=&n&&kwargs&/span&&span class=&p&&[&/span&&span class=&n&&_param&/span&&span class=&p&&],&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&kwtypes&/span&&span class=&p&&[&/span&&span class=&n&&_param&/span&&span class=&p&&])&/span& &span class=&k&&for&/span& &span class=&n&&_param&/span& &span class=&ow&&in&/span& &span class=&n&&kwargs&/span& &span class=&k&&if&/span& &span class=&n&&_param&/span& &span class=&ow&&in&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&kwtypes&/span&&span class=&p&&]&/span&
&span class=&k&&assert&/span& &span class=&nb&&all&/span&&span class=&p&&(&/span&&span class=&n&&result&/span&&span class=&p&&),&/span& &span class=&s2&&&params_chack: invalid parameters&&/span&
&span class=&k&&return&/span& &span class=&n&&func&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&o&&**&/span&&span class=&n&&kwargs&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&_inner&/span&
&span class=&c1&&# 使用装饰器&/span&
&span class=&nd&&@ParamCheck&/span&&span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&,&/span& &span class=&nb&&str&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&nb&&list&/span&&span class=&p&&,&/span& &span class=&nb&&tuple&/span&&span class=&p&&))&/span&
&span class=&k&&def&/span& &span class=&nf&&test07&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s2&&&in function test06, a=&/span&&span class=&si&&%s&/span&&span class=&s2&&, b=&/span&&span class=&si&&%s&/span&&span class=&s2&&, c=&/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 测试用例&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test07&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&s2&&&str&&/span&&span class=&p&&,&/span& &span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&]))&/span&
&span class=&c1&&# 参数正确&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test07&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&s2&&&str&&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&)))&/span&
&span class=&c1&&# 参数正确&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&test07&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&)))&/span&
&span class=&c1&&# 参数错误&/span&
&/code&&/pre&&/div&&br&&h2&其他一些装饰器实例&/h2&&p&函数缓存:一个函数的执行结果可以被缓存在内存中,下次再次调用时,可以先查看缓存中是否存在,如果存在则直接返回缓存中的结果,否则返回函数调用结果。这种装饰器比较适合装饰过程比较复杂或耗时的函数,比如数据库查询等。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 实例: 函数缓存&/span&
&span class=&k&&def&/span& &span class=&nf&&funccache&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&):&/span&
&span class=&n&&cache&/span& &span class=&o&&=&/span& &span class=&p&&{}&/span&
&span class=&nd&&@functools.wraps&/span&&span class=&p&&(&/span&&span class=&n&&func&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&_inner&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&args&/span&&span class=&p&&):&/span&
&span class=&k&&if&/span& &span class=&n&&args&/span& &span class=&ow&&not&/span& &span class=&ow&&in&/span& &span class=&n&&cache&/span&&span class=&p&&:&/span&
&span class=&n&&cache&/span&&span class=&p&&[&/span&&span class=&n&&args&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&func&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&args&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&cache&/span&&span class=&p&&[&/span&&span class=&n&&args&/span&&span class=&p&&]&/span&
&span class=&k&&return&/span& &span class=&n&&_inner&/span&
&span class=&c1&&# 使用装饰器&/span&
&span class=&nd&&@funccache&/span&
&span class=&k&&def&/span& &span class=&nf&&test08&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&):&/span&
&span class=&c1&&# 其他复杂或耗时计算&/span&
&span class=&k&&return&/span& &span class=&n&&a&/span& &span class=&o&&+&/span& &span class=&n&&b&/span& &span class=&o&&+&/span& &span class=&n&&c&/span&
&/code&&/pre&&/div&&p&还有很多其他例子,比如函数调用计数、函数计时、函数自动重试等,思路都基本相同,这里就不一一列举了。&/p&&br&&br&&h2&Python中自带的装饰器&/h2&&p&Python中自带有三个和class相关的装饰器:@staticmethod、@classmethod 和@property。
&/p&&p&(1)先看@property,可以将其理解为“将类方法转化为类属性的装饰器”。先看实例: &/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 使用Python自带的装饰器&/span&
&span class=&k&&class&/span& &span class=&nc&&People&/span&&span class=&p&&(&/span&&span class=&nb&&object&/span&&span class=&p&&):&/span&
&span class=&k&&def&/span& &span class=&nf&&__init__&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&):&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&_name&/span& &span class=&o&&=&/span& &span class=&bp&&None&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&_age&/span& &span class=&o&&=&/span& &span class=&bp&&None&/span&
&span class=&k&&return&/span&
&span class=&nd&&@property&/span&
&span class=&k&&def&/span& &span class=&nf&&name&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&):&/span&
&span class=&k&&return&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&_name&/span&
&span class=&nd&&@name.setter&/span&
&span class=&k&&def&/span& &span class=&nf&&name&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&n&&name&/span&&span class=&p&&):&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&_name&/span& &span class=&o&&=&/span& &span class=&n&&name&/span&
&span class=&k&&return&/span&
&span class=&nd&&@property&/span&
&span class=&k&&def&/span& &span class=&nf&&age&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&):&/span&
&span class=&k&&return&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&_age&/span&
&span class=&nd&&@age.setter&/span&
&span class=&k&&def&/span& &span class=&nf&&age&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&n&&age&/span&&span class=&p&&):&/span&
&span class=&k&&assert&/span& &span class=&mi&&0&/span& &span class=&o&&&&/span& &span class=&n&&age&/span& &span class=&o&&&&/span& &span class=&mi&&120&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&_age&/span& &span class=&o&&=&/span& &span class=&n&&age&/span&
&span class=&k&&return&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&People&/span&&span class=&p&&()&/span&
&span class=&n&&p&/span&&span class=&o&&.&/span&&span class=&n&&name&/span& &span class=&o&&=&/span& &span class=&s2&&&tom&&/span&
&span class=&c1&&# 设置name&/span&
&span class=&n&&p&/span&&span class=&o&&.&/span&&span class=&n&&age&/span& &span class=&o&&=&/span& &span class=&mi&&12&/span&
&span class=&c1&&# 设置age&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&o&&.&/span&&span class=&n&&name&/span&&span class=&p&&,&/span& &span class=&n&&p&/span&&span class=&o&&.&/span&&span class=&n&&age&/span&&span class=&p&&)&/span&
&span class=&c1&&# 输出name和age&/span&
&span class=&n&&p&/span&&span class=&o&&.&/span&&span class=&n&&age&/span& &span class=&o&&=&/span& &span class=&mi&&120&/span&
&span class=&c1&&# 设置age, 此时认为120为异常数据&/span&
&/code&&/pre&&/div&&p&这里定义一个People类,有两个属性name和age。当我们声明了实例p,使用p操作name和age时,实际上是调用的name、age方法,此时会做参数检查等工作。@property将name方法转化为属性,同时当对该属性进行赋值时,会自动调用@name.setter将下边的name方法。&/p&&p&@property有.setter、.getter和.deleter三中装饰器,分别对应赋值、取值和删除三种操作。&/p&&p&(2)@staticmethod 将类成员方法声明为类静态方法,类静态方法没有 self 参数,可以通过类名或类实例调用。&/p&&p&(3)@classmethod 将类成员方法声明为类方法,类方法所接收的第一个参数不是self,而是cls,即当前类的具体类型。&/p&&p&静态方法和类方法都比较简单,一个简单的例子解释静态方法和类方法:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 类静态方法和类方法&/span&
&span class=&k&&class&/span& &span class=&nc&&A&/span&&span class=&p&&(&/span&&span class=&nb&&object&/span&&span class=&p&&):&/span&
&span class=&n&&var&/span& &span class=&o&&=&/span& &span class=&mi&&1&/span&
&span class=&k&&def&/span& &span class=&nf&&func&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&):&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&var&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span&
&span class=&nd&&@staticmethod&/span&
&span class=&k&&def&/span& &span class=&nf&&static_func&/span&&span class=&p&&():&/span&
&span class=&k&&print

我要回帖

更多关于 每周精品猜1到16的数字 的文章

 

随机推荐