求助,老主机更新.当前没有新版本更新版本还是5.51吗

篇头打点鸡血、给点精神:&br&&br&聪明的程序员们,你们是当今世界最具发展潜力的一个充满智慧、崇尚自由的群体,只要敢于打开你们的视野,你们的发展空间是无限的! &br&&br&从你饱含着浓厚的兴趣去接触程序的那天起,如果能一直坚持实干而不是空谈,多年以后仍能不忘初心,那你已经在不知不觉中掌握了一项十分强大的技能,甚至改变了你的思维模式,别丢掉它,它是你的核心竞争力,将让你受益终生。&br&&br&---------------------------------------------&br&&br&0、深入理解计算机系统&br&&img data-rawheight=&312& src=&/v2-f22d4e63e00b_b.jpg& data-rawwidth=&220& class=&content_image& width=&220&&&br&理解计算机系统首选书目,是10余万程序员的共同选择,不必多言。&br&&br&1、编译系统透视-图解编译原理&br&&img data-rawheight=&300& src=&/v2-e0aeabfe1adc1be8626f_b.jpg& data-rawwidth=&300& class=&content_image& width=&300&&&br&龙书!!希望深入了解程序的底层运作机制的人绝不可错过这本书!&br&&br&编译原理领域的鸿篇巨著,它让编译原理不再像是一门高深晦涩的“数学课”,而是一个可以调试、可以接触、可以真切感受的理论体系。本书用1140余幅信息量巨大的运行时结构图和视频动画取代了同类书中复杂枯燥的数学公式,更加立体和直观,生动地将编译后的执行程序在内存中的运行时结构图展现了出来;&br&它将GCC源代码、编译原理、运行时结构、编译系统原理(包含汇编与链接)的内在关系、逻辑与原理梳理清楚了,并将它们结合成一个整体。真正能够让读者透彻掌握编译器如何运行和如何设计,以及为什么要这么设计;&br&它是系统解读著名商用编译器GCC核心源代码的著作,GCC源代码一共有600万行,为了便于讲解和阅读,本书进行了取舍和裁剪,讲解了与编译本质相关的最核心的60万行代码。&br&&br&2、深度探索C++对象模型&br&&img data-rawheight=&500& src=&/v2-cac43e799bb46d7337d3_b.jpg& data-rawwidth=&499& class=&origin_image zh-lightbox-thumb& width=&499& data-original=&/v2-cac43e799bb46d7337d3_r.jpg&&&br&深度剖析C++面向对象的底层机制,追求杰出、卓越的高级程序员必读之经典!&br&&br&3、设计模式:可复用面向对象软件的基础&br&&img data-rawheight=&600& src=&/v2-169fa9dbc76eccb89e00e081f95b3fd6_b.jpg& data-rawwidth=&409& class=&content_image& width=&409&&&br&这本书的重要性根本不需要多废话了。&br&&br&4、领域特定语言 Martin Fowler&br&&img data-rawheight=&500& src=&/v2-1e4474dab325c2e5f288f_b.png& data-rawwidth=&355& class=&content_image& width=&355&&&br&踏上高效的应用开发之门,专业软件开发管理者必读。&br&&br&世界级软件开发大师和软件开发“教父”Martin Fowler历时多年写作而成,全面详尽地讲解了各种DSL及其构造方式,揭示了与编程语言无关的通用原则和模式,阐释了如何通过DSL有效提高开发人员的生产力以及增进与领域专家的有效沟通,能为开发人员选择和使用DSL提供有效的决策依据和指导方法。&br&&br&5、统计思维:程序员数学之概率统计&br&&img data-rawheight=&1012& src=&/v2-3bddfca797e8f3e27fa76f5a_b.jpg& data-rawwidth=&700& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-3bddfca797e8f3e27fa76f5a_r.jpg&&&br&当今社会,各行各业皆进入了大数据时代,站在时代浪尖上的程序员只有具备统计思维才能掌握数据分析的必杀技,只有善于有效分析数据,你才能嗅探到各种潜在的机会,手握屠龙刀,就看你会不会使用了。&br&&br&本书正是一本概率统计方面的入门图书,但视角极为独特,折射出大数据浪潮的别样风景。作者将基本的概率统计知识融入Python编程,有效拓展了程序员的视野,告诉你如何借助编写程序,用计算而非数学的方式实现统计分析。一个趣味实例贯穿全书,生动地讲解了数据分析的全过程:从采集数据和生成统计量,到识别模式和检验假设。一册在手,让你轻松掌握分布、概率论、可视化以及其他工具和概念。&br&&br&---------------------------------------------&br&&br&对软件专业人士来说,都非常值得反复阅读,犹如青橄榄,刚开始有点苦涩,反复咀嚼,会越来越有甜味、回味无穷,都很有深度,特别有助于打下坚实软件技术基础、搭建专业的软件架构思维,甚至影响到你看待现实生活问题的深度。&br&&br&除了以上比较有一定高度的书外,还有一些涉及程序基本功的好书,不得不提:&br&&br&0、汇编语言 ~ 王爽&br&&img data-rawheight=&500& src=&/v2-449fb88bde67e14cbb13ccd27d37325b_b.jpg& data-rawwidth=&500& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-449fb88bde67e14cbb13ccd27d37325b_r.jpg&&&br&为编程技术打下坚实基础的好书,软件专业人士绝不可错过!&br&&br&1、Effective C++ 以及 More Effective C++&br&&br&2、Effective Java
篇头打点鸡血、给点精神: 聪明的程序员们,你们是当今世界最具发展潜力的一个充满智慧、崇尚自由的群体,只要敢于打开你们的视野,你们的发展空间是无限的! 从你饱含着浓厚的兴趣去接触程序的那天起,如果能一直坚持实干而不是空谈,多年以后仍能不忘初心…
&img src=&/v2-c84ae6fe206e427eb8ce_b.jpg& data-rawwidth=&1623& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1623& data-original=&/v2-c84ae6fe206e427eb8ce_r.jpg&&&blockquote&这篇文章是去年写的,经过了简单修改。适合编程时间0-2年群体阅读。ps: 只收藏不点赞是不对的,,,&/blockquote&&p&我认为最重要的有三点&/p&&ul&&li&热爱&/li&&li&努力(多做项目,每天学习编程 5小时以上)&/li&&li&解决问题的能力&/li&&/ul&&p&这三点保证了其次最重要的就是&/p&&ul&&li&选好方向(深度和广度都得保证,最好是80%时间专精保证深度,20%时间来涉猎各种知识保证广度)&/li&&li&学会思考&/li&&/ul&&h2&1. 热爱&/h2&&blockquote&&strong&编程这么有趣的事,竟然还有钱赚&/strong&(by c++ 之父)&/blockquote&&p&这个几乎是最重要的,我见过的所有大牛都是都编程无比热爱。&/p&&p&我大一也迷茫过,“编程是我所喜爱的东西吗?”,我花了一年时间来确认并给了肯定的答案,现在我非常喜欢写 优雅的代码,顺便喜欢技术带给我的 能力、自信、钱。&/p&&p&然后选择方向上,最好由你的兴趣决定,follow your heart&/p&&h2&2. 努力&/h2&&blockquote&热爱和努力往往决定了你在编程的路上能走多远。&/blockquote&&img src=&/v2-ded010dd7fd6d8d4988c_b.jpg& alt=&& class=&content_image&&&p&第一点做到了,这一点应该是顺理成章的。&/p&&p&&strong&其中最重要的是,要 learn by doing。也就是做中学,多做项目&/strong&,非常重要。让你写的程序从100行到1000行,再到万行,就好比看着你创造的城市在一点点的扩大,当然要确保代码的优美,时刻思考,不然那不是城市,而是垃圾堆。&strong&每碰到一个问题,解决它并思考它都可以让你受益匪浅。&/strong&&/p&&p&&strong&还有就是看书&/strong&,仔细阅读一本经典的书(做笔记、写博客、思考、把理论付诸于实践),胜过看十本普通的书,一百本烂书。所以选书很重要。练习、思考更重要。&/p&&p&总结一下,努力就是我后面说的 基本功 和 熟练度 的积累过程,记住&strong&量变导致质变&/strong&&/p&&h2&3. 解决难题的能力&/h2&&p&这个复杂一点,是程序员的 核心竞争力,我觉得解决问题的过程无外乎三点&/p&&ol&&li&&strong&透彻理解问题是什么&/strong&&/li&&li&&strong&弄清导致问题的根本原因&/strong&&/li&&li&&strong&寻找最佳解决方案&/strong&&/li&&/ol&&p&有一种说法是面对 谷歌编程,面对 stackoverflow 编程,其实当你把这三点弄透,你就知道为啥了。你搜索之前应该弄懂前两点,看前人的经验来完成第三点。所以根本不是谷歌帮你编程,而是你在使用谷歌这个工具,最关键的还是你自己,不同人用谷歌搜索的效果是天差地别的。英文搜索质量远高于中文搜索。&/p&&p&搜索的思想和谷歌技巧&a href=&/?target=http%3A//simplyy.space/article/56c2d71f6ba384e& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SimplyY 的博客:如何用好 Google 等搜索引擎&i class=&icon-external&&&/i&&/a&&/p&&p&除了搜索的技巧,基本功、熟练度、胆量 也很重要&/p&&h3&基本功&/h3&&ul&&li&当然基本功很重要,不然你不可能真的能理解问题,比如你不会数据结构,然后面对这方面问题,肯定是一脸懵逼的。&/li&&li&说白了,当你真的懂了一个问题,问题的答案就是呼之欲出的。而透彻的懂一个问题,需要你对这个问题的方方面面有一定的了解和思考。&/li&&/ul&&h3&熟练度&/h3&&blockquote&无他,为熟能尔 (by 卖油翁)&img src=&/v2-a2eb9ecbe13cad01f5da91_b.jpg& alt=&& class=&content_image&&&/blockquote&&p&量变导致质变,当你解决了数千个问题后,谷歌了上万次,你会发现你再用谷歌,就是一目十行,眼睛跟老鹰一样,瞬间就锁定到了答案。&/p&&h3&胆量&/h3&&p&对于新手,编程学习的路途中有个胆量问题,对于绝大多数人这个问题还很严重。&/p&&ol&&li&谷歌不会,翻墙好难&/li&&li&英文好多,英语好难&/li&&li&自学好难,代码、编程书看不懂,编程好难&/li&&li&这里出 bug 了,debug 好难&/li&&li&做项目好难,我不敢写有趣的项目&/li&&/ol&&p&我还是 qq 问一下别人吧。&/p&&p&于是海量的伸手党就出现了。&/p&&p&其实说白了,就是,大家都没有解决这个问题的胆量,都不敢自己一个人去解决问题,总是在自己的安逸区里活着,虽然这是共性,但是一定要有意识的克服,不然你会一直没有进步。&/p&&blockquote&记得有人说过这样一句话,在公司上班,假如技术上的大问题来了,而你没有胆量去解决,而是总是交给别人,ok,别人就会一直进步,最后成为你的主管,你的大主管,你的大大主管,而你原地踏步,说不定还会被新来的淘汰。&/blockquote&&p&并且,没有胆量熟练度就无从谈起,做有趣的项目就无从谈起,你学的所有基本功就会持续荒废,学而不用就会怎么样?忘记!&/p&&p&所以胆量是编程入门的 基石。&/p&&h2&方向&/h2&&blockquote&深度和广度都得保证,最好是80%时间专精保证深度,20%时间来涉猎各种知识保证广度&/blockquote&&p&选择方向上,很大一部分是取决你的兴趣的,你对算法感兴趣 or 工程 or 数据 or 优美的代码,这个要慎重选择,我花了半年时间才选择的,多了解、多尝试,发现自己的兴趣点,再为之努力,潜下心来学习,挖深领域。&/p&&h2&具体怎么学&/h2&&p&谷歌搜。&/p&&img src=&/v2-97ab7d32501dbb880f7cf9_b.png& alt=&& class=&content_image&&&p&具体怎么学编程 也是一个 待解决的问题,我的经验就是看书、做项目、多思考,但是对于不同方向 具体细节是不一样的,答案知乎、论坛里很多很多,学会如何高效学习是一件很重要的事情。&/p&&h2&最后: 总结一下非常重要的东西&/h2&&ol&&li&热爱&/li&&li&努力(学会自学)&/li&&li&解决难题的能力&/li&&/ol&&ul&&li&基本功&ul&&li&编程能力:语言语法、debug 能力、写优雅的代码、数据结构、算法&/li&&li&底层知识:操作系统、计算机网络、编译原理等&/li&&li&各领域特定知识:根据你的方向来&/li&&/ul&&/li&&li&熟练度&/li&&li&胆量&/li&&li&工具(君子生非异也,善假于物也)&ul&&li&英语 非常重要&/li&&li&搜索:谷歌(学会用英文搜)&/li&&li&社区:github、stackoverflow等&/li&&li&各类英文文档:MDN、dash(osx 专属,全平台文档利器在这里&a href=&/?target=http%3A//devdocs.io/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&devdocs.io/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&)&/li&&/ul&&/li&&/ul&&ol&&li&成果&/li&&/ol&&ul&&li&扎实的基本功&/li&&li&多写几个有一定规模(纯代码量 3k 行以上)的有趣的项目,最好都发布在 github 上&/li&&li&等(看完十本经典编程书?)&/li&&/ul&&p&&a href=&/?target=http%3A//devdocs.io/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&devdocs.io/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&:&/p&&img src=&/v2-336dc6a87b5d_b.png& alt=&& class=&content_image&&&blockquote&关于大学里怎么学编程的问题和专栏,我回答了不少大学生学编程的题目。&/blockquote&1. &a href=&/p/& class=&internal&&大学生学习编程的典型问题解答 - 知乎专栏&/a&&p&2. &a href=&/p/& class=&internal&&关于“如何学习编程”的我的一些回答 - 知乎专栏&/a&&/p&
这篇文章是去年写的,经过了简单修改。适合编程时间0-2年群体阅读。ps: 只收藏不点赞是不对的,,,我认为最重要的有三点热爱努力(多做项目,每天学习编程 5小时以上)解决问题的能力这三点保证了其次最重要的就是选好方向(深度和广度都得保证,最好是80%…
&img src=&/v2-e44ade440bd3657e45abfc4a0b7b4448_b.jpg& data-rawwidth=&500& data-rawheight=&265& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-e44ade440bd3657e45abfc4a0b7b4448_r.jpg&&&i&原文转自 &b&Piglei&/b& 的博客文章:&/i&&a href=&/?target=http%3A///articles/instagram-pycon-2017/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Instagram 在 PyCon 2017 的演讲摘要&i class=&icon-external&&&/i&&/a&&blockquote&&a href=&/?target=http%3A///articles/instagram-pycon-2017/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&I&i class=&icon-external&&&/i&&/a&nstagram 最近搞了件大事情:作为一个重度依赖 Python 的系统,从 Python 2.7 + Django 1.3 全面升级到了 Python 3.6。然后在 PyCon 2017 上,他们分享了这一过程,以及相关的一些开发经验。&br&由于我们项目用的技术栈和 Instagram 非常相似(并且同样存在版本老旧的问题),这个主题对我来说真是干货满满,其中不少坑当年也都踩过。如果你用 Django 开发过商业项目,对于里面提到的一定也有体会。而如果你打算深入学习 Django,那也迟早会遇上其中的问题。&br&所以十分感谢 Piglei(知乎 &a href=&/people/21b911e7c75d79a0b0e4& data-hash=&21b911e7c75d79a0b0e4& class=&member_mention& data-title=&@朱雷& data-editable=&true& data-hovercard=&p$b$21b911e7c75d79a0b0e4&&@朱雷&/a& )做的中文摘要,经授权在此转载。他的博客上还有其他一些关于 Python Web 开发相关的文章,推荐关注。&br&即便你还是个新手,对文中的内容不甚了解,那至少也可以给你这样几个结论:&br&&ol&&li&所谓的 Python 效率低、不适合大型网站开发的说法并不准确,一般说『Python 效率低』的人,其实只是『他写的 Python 效率低』。语言撕逼党建议多把精力放在提升自己的能力上。&/li&&li&Python 2 没毛病,照样能支撑起 Instagram 这样的大项目。但如果你要纠结的话,不用想了,直接 Python 3。选择困难党也可以消停了。&br&&/li&&li&Django 是个好框架,你可以不用它,但没必要用它的性能做借口。&/li&&/ol&&br&文章略长,但绝对值得阅读和收藏。&/blockquote&&h2&PyCon 简介&/h2&&p&PyCon 是全世界最大的以 &a href=&/?target=https%3A//en.wikipedia.org/wiki/Python_%28programming_language%29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python 编程语言&i class=&icon-external&&&/i&&/a& 为主题的技术大会。大会由 Python 社区组织,每年举办一次。在大会上,来自世界各地的 Python 用户与核心开发者齐聚一堂,共同分享 Python 世界的新鲜事、Python 语言的应用案例、使用技巧等等内容。&/p&&h2&Instagram 简介&/h2&&p&Instagram 是一款移动端的照片与视频分享软件,由 Kevin Systrom 和 Mike Krieger 在 2010 年创办。Instagram 在发布后开始快速流行。于 2012 年被 Facebook 以 10 亿美元的价格收购。而当时 Instagram 的员工仅有区区 13 名。&/p&&p&如今,Instagram 的总注册用户达到 30 亿,月活用户超过 7 亿 &em&(作为对比,微信最新披露的月活跃用户为 9.38 亿)&/em&。而令人吃惊的是,这么高的访问量背后,竟完全是由以速度慢著称的 Python + Django 支撑。&/p&&p&在 Python 2017 上,Instagram 的工程师们带来了一个有关 Python 在 Instagram 的主题演讲,同时还分享了 Instagram 如何将整个项目运行环境升级到 Python 3 的故事。&/p&&p&本文为该次演讲的内容摘要。&/p&&h2&Python @Instagram&/h2&&h2&为什么选择 Python 和 Django&/h2&&p&Instagram 选择 Django 的原因很简单,Instagram 的两位创始人 &em&(Kevin Systrom and Mike Krieger)&/em& 都是产品经理出身。在他们想要创造 Instagram 时,Django 是他们所知道的最稳定和成熟的技术之一。&/p&&p&时至今日,即使已经拥有超过 30 亿的注册用户。Instagram 仍然是 Python 和 Django 的重度使用者。Instagram 的工程师 Hui Ding 说到: &em&『一直到用户 ID 已经超过了 32bit int 的限额(约为 20 亿),Django 本身仍然没有成为我们的瓶颈所在。』&/em&&/p&&p&不过,除了使用 Django 的原生功能外,Instagram 还对 Django 做了很多定制化工作:&/p&&ul&&li&扩展 Django Models 使其支持 Sharding &em&(一种数据库分片技术)&/em&,&a href=&/?target=https%3A///%40InstagramEng& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Instagram Engneering&i class=&icon-external&&&/i&&/a& 博客专门为这件事情写过一篇博客,可参阅:&a href=&/?target=https%3A///sharding-ids-at-instagram-1cf5a71e5a5c& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sharding & IDs at Instagram&i class=&icon-external&&&/i&&/a&&/li&&li&手动关闭 GC(垃圾回收)来提升 Python 内存管理效率,他们同样也写过一篇博客来说明这件事情:&a href=&/?target=https%3A///dismissing-python-garbage-collection-at-instagram-4dca40b29172& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Dismissing Python Garbage Collection at Instagram&i class=&icon-external&&&/i&&/a&&/li&&li&在位于不同地理位置的多个数据中心部署整套系统&/li&&/ul&&h2&Python 语言的优势所在&/h2&&p&Instagram 的联合创始人 Mike Krieger 说过: &em&『我们的用户根本不关心 Instagram 使用了哪种关系数据库,他们当然也不关心 Instagram 是用什么编程语言开发的。』&/em&&/p&&p&所以,Python 这种 简单 而且 实用至上 的编程语言最终赢得了 Instagram 的青睐。他们认为,使用 Python 这种简单的语言有助于塑造 Instagram 的工程师文化,那就是:&/p&&ol&&li&专注于定位问题、解决问题 - 而不是工具本身的各种花花绿绿的特性&/li&&li&使用那些经过市场验证过的成熟技术方案 - 而不用被工具本身的问题所烦扰&/li&&li&用户至上:专注于用户所能看到的新特性,为用户带去价值&/li&&/ol&&p&但是,即使使用 Python 语言有这么多好处,它还是很慢,不是吗?&/p&&p&不过,这对于 Instagram 不是问题,因为他们认为:『Instagram 的最大瓶颈在于开发效率,而不是代码的执行效率』&/p&&blockquote&&p&At Instagram, our bottleneck is development velocity, not pure code execution.&/p&&/blockquote&&p&所以,最终的结论是:你完全可以使用 Python 语言来实现一个超过几十亿用户使用的产品,而根本不用担心语言或框架本身的性能瓶颈。&/p&&h2&如何提升运行效率&/h2&&p&但是,即使是选用了拥有诸多好处的 Python 和 Django。在 Instagram 的用户数迅速增长的过程中,性能问题还是出现了:服务器数量的增长率已经慢慢的超过了用户增长率。Instagram 是怎么应对这个问题的呢?&/p&&p&他们使用了这些手段来缓解性能问题:&/p&&ul&&li&开发工具来帮助调优:Instagram 开发了很多涵盖各个层面的工具,来帮助他们进行性能调优以及找到性能瓶颈。&/li&&li&使用 C/C++ 来重写部分组件:把那些稳定而且对性能最敏感的组件,使用 C 或 C++ 来重写,比如访问 memcache 的 library。&/li&&li&使用 &a href=&/?target=http%3A//cython.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cython&i class=&icon-external&&&/i&&/a&:Cython 也是他们用来提升 Python 效率的法宝之一。&/li&&/ul&&p&除了上面这些手段,他们还在探索异步 IO 以及新的 Python Runtime 所能带来的性能可能性。&/p&&h2&升级到 Python 3&/h2&&p&在相当长的一段时间,Instagram 都跑在 Python 2.7 + Django 1.3 的组合之上。在这个已经落后社区很多年的环境上,他们的工程师们还打了非常非常多的小 patch。难道他们要被永远卡在这个版本上吗?&/p&&p&所以,在经过一系列的讨论后,他们最终做出一个重大的决定:升级到 Python 3!!&/p&&p&事实上,Instagram 目前已经完成了将运行环境迁移到 Python 3 的工作 - 他们的整套服务已经在 Python 3 上跑了好几个月了。那么他们是怎么做到的呢?接下来便是由 Instagram 工程师 Lisa guo 带来的 Instagram 如何迁移到 Python 3 的故事。&/p&&h2&Instagram 升级到 Python 3 的故事&/h2&&h2&为什么要升级到 Python 3&/h2&&p&对于 Instagram 来说,下面这些因素是推动他们将运行环境迁移到 Python 3 的主要原因:&/p&&h2&1. 新特性:类型注解 Type Annotations&/h2&&p&看看下面这段代码:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&compose_from_max_id&/span&&span class=&p&&(&/span&&span class=&n&&max_id&/span&&span class=&p&&):&/span&
&span class=&sd&&'''@param str max_id'''&/span&
&/code&&/pre&&/div&&p&图中函数的 max_id 参数究竟是什么类型呢?int?tuple?或是 list? 等等,函数文档里面说它是 str 类型。&/p&&p&但随着时间推移,万一这个参数的类型发生变化了呢?如果某位粗心的工程师修改代码的同时忘了更新文档,那就会给函数的使用者带来很大麻烦,最终还不如没有注释呢。&/p&&h2&2. 性能&/h2&&p&Instagram 的整个 Django Stack 都跑在 uwsgi 之上,全部使用了同步的网络 IO。这意味着同一个 uwsgi 进程在同一时间只能接收并处理一个请求。这让如何调优每台机器上应该运行的 uwsgi 进程数成了一个麻烦事:&/p&&p&&em&为了更好利用 CPU,使用更多的进程数?但那样会消耗大量的内存。而过少的进程数量又会导致 CPU 不能被充分利用。&/em&&/p&&p&为此,他们决定跳过 Python 2 中哪些蹩脚的异步 IO 实现 &em&(可怜的 gevent、tornado、twisted 众)&/em&,直接升级到 Python 3,去探索标准库中的 asyncio 模块所能带来的可能性。&/p&&h2&3. 社区&/h2&&p&因为 Python 社区已经停止了对 Python 2 的支持。如果把整个运行环境升级到 Python 3,Instagram 的工程师们就能和 Python 社区走的更近,可以更好的把他们的工作回馈给社区。&/p&&h2&确定迁移方案&/h2&&p&在 Instagram,进行 Python 3 的迁移需要必须满足两个前提条件:&/p&&ol&&li&不停机,不能有任何的服务因此不可用&/li&&li&不能影响产品新特性的开发&/li&&/ol&&p&但是,在 Instagram 的开发环境中,要满足上面这两点来完成迁移到 Python 3.6 这种庞大的工程是非常困难的。&/p&&h2&基于主分支的开发流程&/h2&&p&即便使用了以多分支功能著称的 git,Instagram 所有的开发工作都是主要在 master 分支上进行的,Instagram 所奉行的开发哲学是:『不管是多大的新特性或代码重构,都应该拆解成较小的 Commit 来进行。』&/p&&p&那些被合并进 master 分支的代码,都将在一个小时内被发布到线上环境。而这样的发布过程每天将会发生上百次。在这么频繁的发布频率下,如何在满足之前的那两个前提下来完成迁移变得尤其困难。&/p&&h2&被弃用的迁移方案&/h2&&p&&b&创建一个新分支&/b&&/p&&p&很多人在处理这类问题时,第一个蹦进脑子的想法就是: &em&『让我们创建一个分支,当我们开发完后,再把分支合并进来』&/em&&/p&&p&但在 Instagram 这么高的迭代频率上,使用一个独立分支并不是好主意:&/p&&ol&&li&Instagram 的 Codebase 每天都在频繁更新,在开发 Python 3 分支的过程中,让新分支与现有 master 分支保持同步开销极大,同时极易出错&/li&&li&最终将 Python 3 分支这个改动非常多的分支合并回 Master 拥有非常高的风险&/li&&li&只有少数几个工程师在 Python 3 分支上专职负责升级工作,其他想帮助迁移工作的工程师无法参与进来&/li&&/ol&&p&&b&挨个替换接口&/b&&/p&&p&还有一个方案就是,挨个替换 Instagram 的 API 接口。但是 Instagram 的不同接口共享着很多通用模块。这个方案要实施起来也非常困难。&/p&&p&&b&微服务&/b&&/p&&p&还有一个方案就是将 Instagram 改造成微服务架构。通过将那些通用模块重写成 Python 3 版本的微服务来一步步完成迁移工作。&/p&&p&但是这个方案需要重新组织海量的代码。同时,当发生在进程内的函数调用变成 RPC 后 ,整个站点的延迟会变大。此外,更多的微服务也会引入更高的部署复杂度。&/p&&p&所以,既然 Instagram 的开发哲学是:小步前进,快速迭代。他们最终决定的方案是:一步一步来,最终让 master 分支上的代码同时兼容 Python 2 和 Python 3 。&/p&&h2&开始迁移工作&/h2&&p&既然要让整个 codebase 同时兼容 Python 2 和 Python 3,那么首先要符合这点的就是那些被大量使用的第三方 package。针对第三方 package,Instagram 做到了下面几点:&/p&&ul&&li&拒绝引入所有不兼容 Python 3 的新 package&/li&&li&去掉所有不再使用的 package&/li&&li&替换那些不兼容 Python 3 的 package&/li&&/ul&&p&在代码的迁移过程中,他们使用了工具 &a href=&/?target=https%3A//python-modernize.readthedocs.io/en/latest/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&modernize&i class=&icon-external&&&/i&&/a& 来帮助他们。&/p&&p&使用 modernize 时,有一个小技巧:每次修复多个文件的一个兼容问题,而不是一下修复一个文件中的多个兼容问题。 这样可以让 Code Review 过程简单很多,因为 Reviewer 每次只需要关注一个问题。&/p&&h2&使用单元测试来帮助迁移&/h2&&p&对于 Python 这种灵活性极强的动态语言来说,除了真正去执行代码外,几乎没有其他比较好的检查代码错误的手段。&/p&&p&前面提到,Instagram 所有被合并到 master 的代码提交会在一个小时内上线到线上环境,但这不是没有前提条件的。在上线前,所有的提交都需要通过成千上万个单元测试。&/p&&p&于是,他们开始加入 Python 3 来执行所有的单元测试。一开始,只有极少数的单元测试能够在 Python 3 环境下通过,但随着 Instagram 的工程师们不断的修复那些失败的单元测试,最终所有的单元测试都可以在 Python 3 环境下成功执行。&/p&&h2&单元测试的局限性&/h2&&p&但是,单元测试也是有局限性的:&/p&&ul&&li&Instagram 的单元测试没有做到 100% 的代码覆盖率&/li&&li&很多第三方模块都使用了 mock 技术,而 mock 的行为与真实的线上服务可能会有所不同&/li&&/ul&&p&所以,当所有的单元测试都被修复后,他们开始在线上正式使用 Python 3 来运行服务。&/p&&p&这个过程并不是一蹴而就的。首先,所有的 Instagram 工程师开始访问到这些使用 Python 3 来执行的新服务,然后是 Facebook 的所有雇员,随后是 0.1%、20% 的用户,最终 Python 3 覆盖到了所有的 Instagram 用户。&/p&&img src=&/v2-6749d01ace119ad9b016_b.png& data-rawwidth=&500& data-rawheight=&282& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-6749d01ace119ad9b016_r.png&&&p&图:循序渐进的发布流程&/p&&h2&迁移过程的技术问题&/h2&&p&Instagram 在迁移到 Python 3 时碰到很多问题,下面是最典型的几个:&/p&&h2&Unicode 相关的字符串问题&/h2&&p&Python 3 相比 Python 2 最大的改动之一,就是在语言内部对 unicode 的处理。&/p&&p&在 Python 2 中,文本类型 &em&(也就是 unicode)&/em& 和二进制类型 &em&(也就是 str)&/em& 的边界非常模糊。很多函数的参数既可以是文本,也可以是二进制。但是在 Python 3 中,文本类型和二进制类型的字符串被完全的区分开了。&/p&&p&于是,下面这段在 Python 2 下可以正常运行的代码在 Python 3 下就会报错:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&mymac&/span& &span class=&o&&=&/span& &span class=&n&&hmac&/span&&span class=&o&&.&/span&&span class=&n&&new&/span&&span class=&p&&(&/span&&span class=&s1&&'abc'&/span&&span class=&p&&)&/span&
&span class=&ne&&TypeError&/span&&span class=&p&&:&/span& &span class=&n&&key&/span&&span class=&p&&:&/span& &span class=&n&&expected&/span& &span class=&nb&&bytes&/span& &span class=&ow&&or&/span& &span class=&nb&&bytearray&/span&&span class=&p&&,&/span& &span class=&n&&but&/span& &span class=&n&&got&/span& &span class=&s1&&'str'&/span&
&/code&&/pre&&/div&&p&解决办法其实很简单,只要加上判断:如果 value 是文本类型,就将其转换为二进制。如下所示:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&value&/span& &span class=&o&&=&/span& &span class=&s1&&'abc'&/span&
&span class=&k&&if&/span& &span class=&nb&&isinstance&/span&&span class=&p&&(&/span&&span class=&n&&value&/span&&span class=&p&&,&/span& &span class=&n&&six&/span&&span class=&o&&.&/span&&span class=&n&&text_type&/span&&span class=&p&&):&/span&
&span class=&n&&value&/span& &span class=&o&&=&/span& &span class=&n&&value&/span&&span class=&o&&.&/span&&span class=&n&&encode&/span&&span class=&p&&(&/span&&span class=&n&&encoding&/span&&span class=&o&&=&/span&&span class=&s1&&'utf-8'&/span&&span class=&p&&)&/span&
&span class=&n&&mymac&/span& &span class=&o&&=&/span& &span class=&n&&hmac&/span&&span class=&o&&.&/span&&span class=&n&&new&/span&&span class=&p&&(&/span&&span class=&n&&value&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&但是,在整个代码库中,像上面这样的情况非常多。作为开发人员,如果需要在调用每个函数时都要想想: &em&这里到底是应该编码成二进制,或者是解码成文本呢?&/em& 将会是非常大的负担。&/p&&p&于是 Instagram 封装了一些名为 ensure_str()、ensure_binary()、ensure_text() 的帮助函数,开发人员只需对那些不确定类型的字符串,使用这些帮助函数先做一次转换就好。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&mymac&/span& &span class=&o&&=&/span& &span class=&n&&hmac&/span&&span class=&o&&.&/span&&span class=&n&&new&/span&&span class=&p&&(&/span&&span class=&n&&ensure_binary&/span&&span class=&p&&(&/span&&span class=&s1&&'abc'&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&&h2&不同 Python 版本的 pickle 差异&/h2&&p&Instagram 的代码中大量使用了 pickle。比如用它序列化某个对象,然后将其存储在 memcache 中。如下面的代码所示:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&memcache_data&/span& &span class=&o&&=&/span& &span class=&n&&pickle&/span&&span class=&o&&.&/span&&span class=&n&&dumps&/span&&span class=&p&&(&/span&&span class=&n&&data&/span&&span class=&p&&,&/span& &span class=&n&&pickle&/span&&span class=&o&&.&/span&&span class=&n&&HIGHEST_PROTOCOL&/span&&span class=&p&&)&/span&
&span class=&n&&data&/span& &span class=&o&&=&/span& &span class=&n&&pickle&/span&&span class=&o&&.&/span&&span class=&n&&loads&/span&&span class=&p&&(&/span&&span class=&n&&memcache_data&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&问题在于,Python 2 与 Python 3 的 pickle 模块是有差别的。&/p&&p&如果上文的第一行代码,刚好是由 Python 3 运行的服务进行序列化后存入 memcache。而反序列化的过程却是由 Python 2 进行,那代码运行时就会出现下面的错误:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ValueError: unsupported pickle protocol: 4
&/code&&/pre&&/div&&p&这是由于在 Python 3 中,pickle.HIGHEST_PROTOCOL 的值为 4,而 Python 2 中的的 pickle 最高支持的版本号却是 2。那么如何解决这个问题呢?&/p&&p&Instagram 最终选择让 Python 2 和 Python 3 使用完全不同的 namespace 来访问 memcache。通过将二者的数据读写完全隔开来解决这个问题。&/p&&h2&迭代器&/h2&&p&在 Python 3 中,很多内置函数被修改成了只返成迭代器 Iterator:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&map()
dict.items()
&/code&&/pre&&/div&&p&迭代器有诸多好处,最大的好处就是,使用迭代器不需要一次性分配大量内存,所以它的内存效率比较高。&/p&&p&但是迭代器有一个天然的特点,当你对某个迭代器做了一次迭代,访问完它的内容后,就没法再次访问那些内容了。迭代器中的所有内容都只能被访问一次。&/p&&p&在 Instagram 的 Python 3 迁移过程中,就因为迭代器的这个特性被坑了一次,看看下面这段代码:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&CYTHON_SOURCES&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&n&&a&/span&&span class=&o&&.&/span&&span class=&n&&pyx&/span&&span class=&p&&,&/span& &span class=&n&&b&/span&&span class=&o&&.&/span&&span class=&n&&pyx&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&o&&.&/span&&span class=&n&&pyx&/span&&span class=&p&&]&/span&
&span class=&n&&builds&/span& &span class=&o&&=&/span& &span class=&nb&&map&/span&&span class=&p&&(&/span&&span class=&n&&BuildProcess&/span&&span class=&p&&,&/span& &span class=&n&&CYTHON_SOURCES&/span&&span class=&p&&)&/span&
&span class=&k&&while&/span& &span class=&nb&&any&/span&&span class=&p&&(&/span&&span class=&ow&&not&/span& &span class=&n&&build&/span&&span class=&o&&.&/span&&span class=&n&&done&/span&&span class=&p&&()&/span& &span class=&k&&for&/span& &span class=&n&&build&/span& &span class=&ow&&in&/span& &span class=&n&&builds&/span&&span class=&p&&):&/span&
&span class=&n&&pending&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&n&&build&/span& &span class=&k&&for&/span& &span class=&n&&build&/span& &span class=&ow&&in&/span& &span class=&n&&builds&/span& &span class=&k&&if&/span& &span class=&ow&&not&/span& &span class=&n&&build&/span&&span class=&o&&.&/span&&span class=&n&&started&/span&&span class=&p&&()]&/span&
&span class=&o&&&&/span&&span class=&n&&do&/span& &span class=&n&&some&/span& &span class=&n&&work&/span&&span class=&o&&&&/span&
&/code&&/pre&&/div&&p&这段代码的用处是挨个编译 Cython 源文件。当他们把运行环境切换到 Python 3 后,一个奇怪的问题出现了:CYTHON_SOURCES 中的第一个文件永远都被跳过了编译。为什么呢?&/p&&p&这都是迭代器的锅。在 Python 3 中,map() 函数不再返回整个 list,而是返回一个迭代器。&/p&&p&于是,当第二行代码生成 builds 这个迭代器后,第三行代码的 while 循环迭代了 builds,刚好取出了第一个元素。于是之后的 pending 对象便里面永远少了那第一个元素。&/p&&p&这个问题解决起来也挺简单的,你只要手动的吧 builds 转换成 list 就可以了:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&builds&/span& &span class=&o&&=&/span& &span class=&nb&&list&/span&&span class=&p&&(&/span&&span class=&nb&&map&/span&&span class=&p&&(&/span&&span class=&n&&BuildProcess&/span&&span class=&p&&,&/span& &span class=&n&&CYTHON_SOURCES&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&&p&但是这类 bug 非常难定位到。如果用户的 feeds 里面永远少了那最新的第一条,用户很少会注意到。&/p&&h2&字典的顺序&/h2&&p&看看下面这段代码:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&o&&&&&&/span& &span class=&n&&testdict&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&&span class=&s1&&'a'&/span&&span class=&p&&:&/span& &span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&s1&&'b'&/span&&span class=&p&&:&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&s1&&'c'&/span&&span class=&p&&:&/span& &span class=&mi&&3&/span&&span class=&p&&}&/span&
&span class=&o&&&&&&/span& &span class=&n&&json&/span&&span class=&o&&.&/span&&span class=&n&&dumps&/span&&span class=&p&&(&/span&&span class=&n&&testdict&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&它会输出什么结果呢?&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# Python2&/span&
&span class=&s1&&'{&a&: 1, &c&: 3, &b&: 2}'&/span&
&span class=&c1&&# Python 3.5.1&/span&
&span class=&s1&&'{&c&: 3, &b&: 2, &a&: 1}'&/span&
&span class=&c1&&# or&/span&
&span class=&s1&&'{&c&: 3, &a&: 1, &b&: 2}'&/span&
&span class=&c1&&# Python 3.6&/span&
&span class=&s1&&'{&a&: 1, &b&: 2, &c&: 3}'&/span&
&/code&&/pre&&/div&&p&在不同的 Python 版本下,这个 json dumps 的结果是完全不一样的。甚至在 3.5.1 中,它会完全随机的返回两个不同的结果。Instagram 有一段判断配置文件是否发生变动的模块,就是因为这个原因出了问题。&/p&&p&这个问题的解决办法是,在调用 json.dumps 传入 sort_keys=True 参数:&/p&&div class=&highlight&&&pre&&code class=&language-pytb&&&span&&/span&&span class=&x&&&&& json.dumps(testdict, sort_keys=True)&/span&
&span class=&x&&'{&a&: 1, &b&: 2, &c&: 3}'&/span&
&/code&&/pre&&/div&&h2&迁移到 Python 3.6 后的性能提升&/h2&&p&当 Instagram 解决了这些奇奇怪怪的版本差异问题后,还有一个巨大的谜题困扰着他们:性能问题。&/p&&p&在 Instagram,他们使用两个主要指标来衡量他们的服务性能:&/p&&ul&&li&每次请求产生的 CPU 指令数(越低越好)&/li&&li&每秒能够处理的请求数(越高越好)&/li&&/ul&&p&所以,当所有的迁移工作完成后,他们非常惊喜的发现:第一个性能指标,每次请求产生的 CPU 指令数居然足足下降了 12% !!!&/p&&p&但是,按理说第二个指标 - 每秒请求数也应该获得接近 12% 的提升。不过最后的变化却是 0%。究竟是出了什么问题呢?&/p&&p&他们最终定位到,是由于不同 Python 版本下的内存优化配置不同,导致 CPU 指令数下降带来的性能提升被抵消了。那为什么不同 Python 版本下的内存优化配置会不一样呢?&/p&&p&这是他们用来检查 uwsgi 配置的代码:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&if&/span& &span class=&n&&uwsgi&/span&&span class=&o&&.&/span&&span class=&n&&opt&/span&&span class=&o&&.&/span&&span class=&n&&get&/span&&span class=&p&&(&/span&&span class=&s1&&'optimize_mem'&/span&&span class=&p&&,&/span& &span class=&bp&&None&/span&&span class=&p&&)&/span& &span class=&o&&==&/span& &span class=&s1&&'True'&/span&&span class=&p&&:&/span&
&span class=&n&&optimize_mem&/span&&span class=&p&&()&/span&
&/code&&/pre&&/div&&p&注意到那段 ... ... == 'True' 了吗?在 Python 3 中,这个条件判断总是不会被满足。问题就在于 unicode。在将代码中的 'True' 换成 b'True'(也就是将文本类型换成二进制,这种判断在 Python 2 中完全不区分的)后,问题解决了。&/p&&p&所以,最终因为加上了一个小小的字母 'b',程序的整体性能提升了 12%。&/p&&h2&结论&/h2&&p&在今年二月份,Instagram 的后端代码的运行环境完全切换到了 Python 3 下:&/p&&img src=&/v2-4e18e07668e08ded569e511f083bada1_b.png& data-rawwidth=&500& data-rawheight=&279& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-4e18e07668e08ded569e511f083bada1_r.png&&&p&图:Instagram 版本迁移时间线&/p&&p&当所有的代码都都迁移到 Python 3 运行环境后:&/p&&ul&&li&节约了 12% 的整体 CPU 使用率(Django/uwsgi)&/li&&li&节约了 30% 的内存使用(celery)&/li&&/ul&&p&同时,在整个迁移期间,Instagram 的月活用户经历了从 4 亿到 6亿 的巨大增长。产品也发布了评论过滤、直播等非常多新功能。&/p&&p&那么,那几个最开始驱动他们迁移到 Python 3 的目的呢?&/p&&ul&&li&类型注解:Instagram 的整个 codebase 里已经有 2% 的代码添加上了类型注解,同时他们还开发了一些工具来辅助开发者添加类型提示&/li&&li&asyncio:他们在单个接口中利用 asynio 平行的去做多件事情,最终降低了 20-30% 的请求延迟。&/li&&li&社区:他们与 Intel 的工程师联合,帮助他们更好的对 CPU 利用率进行调优。同时还开发了很多新的工具,帮助他们进行性能调优&/li&&/ul&&h2&Instagram 带给我们的启示&/h2&&p&Instagram 的演讲视频时间不长,但是内容很丰富,在编写此文前,我完全没有想到最终的文章会这么长。&/p&&p&那么,Instagram 的视频可以给我们哪些启示呢?&/p&&ul&&li&Python + Django 的组合完全可以负载用户数以 10 亿记的服务,如果你正准备开始一个项目,放心使用 Python 吧!&/li&&li&完善的单元测试对于复杂项目是非常有必要的。如果没有那『成千上万的单元测试』。很难想象 Instagram 的迁移项目可以成功进行下去。&/li&&li&开发者和同事也是你的产品用户,利用好他们。用他们为你的新特性发布前多一道测试。&/li&&li&完全基于主分支的开发流程,可以给你更快的迭代速度。前提是拥有完善的单元测试和持续部署流程。&/li&&li&Python 3 是大势所趋,如果你正准备开始一个新项目,无需迟疑,拥抱 Python 3 吧!&/li&&/ul&&br&&p&好了,就到这儿吧。Happy Hacking!&/p&&br&&p&.&/p&&p&&i&其他文章及回答:&/i&&/p&&a href=&/p/& class=&internal&&喏,你们要的 PyCharm 快速上手指南 &/a&&br&&a href=&/p/& class=&internal&&给伸手党的福利:Python 新手入门引导&/a&&br&&a href=&/p/& class=&internal&&如何用100行Python代码做出魔性声控游戏“八分音符酱”&/a&&br&&a href=&/question//answer/& class=&internal&&学习编程的过程中可能会走哪些弯路,有哪些经验可以参考?&/a&&br&&a href=&/question//answer/& class=&internal&&你是如何自学 Python 的?&/a&&br&&h2&Crossin的编程教室&/h2&&p&微信公众号ID:crossincode&br&网站:&a href=&/?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&&i class=&icon-external&&&/i&&/a&&br&QQ群:&br&微信加群:crossin11&/p&&img src=&/5b58c0ecafdc5d85c857_b.jpg& data-rawwidth=&258& data-rawheight=&258& class=&content_image& width=&258&&
原文转自 Piglei 的博客文章:nstagram 最近搞了件大事情:作为一个重度依赖 Python 的系统,从 Python 2.7 + Django 1.3 全面升级到了 Python 3.6。然后在 PyCon 2017 上,他们分享了这一过程,以及相关的一些开发经…
&img src=&/v2-583dee7bda56b88a10de3d081e04209c_b.png& data-rawwidth=&600& data-rawheight=&218& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-583dee7bda56b88a10de3d081e04209c_r.png&&原问题出自:&a href=&/question//answer/& class=&internal&&pycharm 如何程序运行后,仍可查看变量值?(非Debug mode, 因为debug运行太慢)&/a&&p&因为觉得这个问题挺实用,且确实有很多人不了解,故将自己的回答搬运到专栏里。&/p&&p&我自己开发时候也经常遇到这样的需求:程序运行后,结果不正确,想要调试一下。但这时程序已经关闭,如果要调试,只能在代码里添加输出,重新跑。或者用 debug 模式加断点。虽说这也没毛病,但如果程序比较长,尤其像爬虫类的程序,总是反复重新跑也是蛮蛋疼的。&/p&&p&那有没有别的方法,比如像 python shell 那样,运行之后的变量仍然保持在内存中,可以继续操作?&/p&&p&答案是肯定的。PyCharm 就有这个功能。但不幸的是,这个功能的开启并不在 PyCharm 的 Preference 设置里,自然也就搜索不到,于是很多人并不知道。当时我看了问题下面的所有答案,没有一个提到。包括我自己,在之前某次偶然发现这个功能之后,后来又再次想找,也是在各项菜单、配置栏目里翻了半天才找到。&br&&/p&&p&正确的打开方式如下:&/p&&p&在菜单栏里,选择项目的下拉菜单里选择&b& Edit Configuration&/b&&/p&&br&&img src=&/v2-ee9b74091cbff19421dbbfed42d84081_b.png& data-rawwidth=&490& data-rawheight=&280& class=&origin_image zh-lightbox-thumb& width=&490& data-original=&/v2-ee9b74091cbff19421dbbfed42d84081_r.png&&&p&在对应项目的设置里勾选上 Show command line afterwards&/p&&img src=&/v2-fb9de67b301db068ab3c9b2ef9a56801_b.png& data-rawwidth=&664& data-rawheight=&304& class=&origin_image zh-lightbox-thumb& width=&664& data-original=&/v2-fb9de67b301db068ab3c9b2ef9a56801_r.png&&&p&就OK了。&/p&&p&程序执行后会保持在 python shell 的状态,可以对程序中的数据进行调试。&/p&&img src=&/v2-afa2c7f6dfb65c13898d41d_b.png& data-rawwidth=&1608& data-rawheight=&584& class=&origin_image zh-lightbox-thumb& width=&1608& data-original=&/v2-afa2c7f6dfb65c13898d41d_r.png&&&br&&p&关于 PyCharm,之前还写过一篇:&a href=&/p/& class=&internal&&喏,你们要的 PyCharm 快速上手指南 - 知乎专栏&/a&,转需。&/p&&p&其中,两个重要的配置:编码和 python 路径,开发前最好确认下。一个实用的功能:断点调试,用好了可以节省很多时间。&/p&&br&&p&.&/p&&p&&i&其他文章及回答:&/i&&/p&&a href=&/p/& class=&internal&&喏,你们要的 PyCharm 快速上手指南 &/a&&br&&a href=&/p/& class=&internal&&给伸手党的福利:Python 新手入门引导&/a&&br&&a href=&/p/& class=&internal&&如何用100行Python代码做出魔性声控游戏“八分音符酱”&/a&&br&&a href=&/question//answer/& class=&internal&&学习编程的过程中可能会走哪些弯路,有哪些经验可以参考?&/a&&br&&a href=&/question//answer/& class=&internal&&你是如何自学 Python 的?&/a&&br&&h2&Crossin的编程教室&/h2&&p&微信公众号ID:crossincode&br&网站:&a href=&/?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&&i class=&icon-external&&&/i&&/a&&br&QQ群:&br&微信加群:crossin11&/p&&img src=&/5b58c0ecafdc5d85c857_b.jpg& data-rawwidth=&258& data-rawheight=&258& class=&content_image& width=&258&&
原问题出自:因为觉得这个问题挺实用,且确实有很多人不了解,故将自己的回答搬运到专栏里。我自己开发时候也经常遇到这样的需求:程序运行后,结果不正确,想要调试一下。但…
&p&从0到1,是最艰难吃力的一步。&/p&&br&&p&我15年的时候,在其它论坛发过一篇帖子,也是零基础开始学Python的。阅读量挺高的。&/p&&p&希望对题主有帮助。&/p&&br&&p&原文地址是 &a href=&///?target=http%3A//cocode.cc/t/python-flask-sqlalchemy/1884& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python+flask+SQLAlchemy 半年自学~跳槽成功~&i class=&icon-external&&&/i&&/a& (排版比知乎好。&/p&&br&&p&&b&使用前说明:&/b&&/p&&p&
本人大学专业是CS,大学的时候编程很差,毕业后并没有做程序开发的工作,但是大学听课很认真(拿了奖学金和一些其他名誉),所以各种语言的语法基础还有其他CS必修课还是有点印象的。半年前才第一次接触python,然后打开了新世界的大门。&/p&&p&
前不久去找工作,很高兴拿到了几个offer ,已经选择了自己超超超超级喜欢的一个,刚吃完酸菜鱼,心情比较好,决定分享一下自己的学习经验和路线,希望对其他人也有所帮助。&/p&&p&
不过因为本人还比较菜,所以要为加入新公司做各种功课,以免自己开车太慢导致后面塞车。所以时间不多,这个帖子的内容会比较粗略梗概。如果大家有什么问题,我会尽量回答,但是不保证自己有空和有能力可以解答。仅供参考(对,这就是免责申明:D &/p&&p&&b&下面是正文:&/b&&/p&&p&总体路线:
Python+Pygame+Flask+SQLAlchemy
&/p&&p&主要书籍:&/p&&p&1.笨方法学Python (电子版)&/p&&p&2.Python 核心编程(电子版)&/p&&p&3. Python基础教程(纸质版)&/p&&p&4. FlaskWeb开发:基于Python的Web应用开发实战(电子版)
&/p&&p&主要的参考网站: &/p&&p&1. Assignments — Problem Solving with Algorithms and Data Structures
&a href=&///?target=http%3A//interactivepython.org/runestone/static/pythonds/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://interactivepython.org/runestone/static/pythonds/index.html666&i class=&icon-external&&&/i&&/a& &/p&&p&2. SQLite – Python | w3cschool菜鸟教程
&a href=&///?target=http%3A//www.w3cschool.cc/sqlite/sqlite-python.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://www.w3cschool.cc/sqlite/sqlite-python.html631&i class=&icon-external&&&/i&&/a& &/p&&p&3. Python / Python 编码风格指南中译版(Google SOC) | Elias的个人主页
&a href=&///?target=http%3A///Python/PythonStyleGuide%3Ffrom%3DDevelop.PythonStyleGuide%23toc32& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/Python/PythonStyleGuide?from=Develop.PythonStyleGuide#toc32321&i class=&icon-external&&&/i&&/a& &/p&&p&4.Python 的神奇方法指南 - 开源中国社区
&a href=&///?target=http%3A//www.oschina.net/question/412& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://www.oschina.net/question/412470&i class=&icon-external&&&/i&&/a& &/p&&p&4.用Python和Pygame写游戏-从入门到精通(目录) | 目光博客
&a href=&///?target=http%3A//eyehere.net/2011/python-pygame-novice-professional-index/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://eyehere.net/2011/python-pygame-novice-professional-index/414&i class=&icon-external&&&/i&&/a& &/p&&p&5.欢迎进入Flask大型教程项目! — flask mega-tutorial 1.0 documentation
&a href=&///?target=http%3A///flask-mega-tutorial/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/flask-mega-tutorial/724&i class=&icon-external&&&/i&&/a& &/p&&p&6.欢迎使用 Flask — Flask 0.10.1 documentation
&a href=&///?target=http%3A///flask/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/flask/372&i class=&icon-external&&&/i&&/a& &/p&&br&&p&7.扩展包来源:
&a href=&///?target=http%3A//www.lfd.uci.edu/%257Egohlke/pythonlibs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://www.lfd.uci.edu/~gohlke/pythonlibs/60&i class=&icon-external&&&/i&&/a& &a href=&///?target=http%3A///winpy_libs& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/winpy_libs43&i class=&icon-external&&&/i&&/a& &/p&&br&&p&8.其他:
25本免费的Python电子书 - 博客 - 伯乐在线
&a href=&///?target=http%3A///29281/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/&i class=&icon-external&&&/i&&/a& &/p&&p&9.9本免费的Python编程书 - 博客 - 伯乐在线
&a href=&///?target=http%3A///765/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/765/392&i class=&icon-external&&&/i&&/a& &/p&&p&本人的github: &a href=&///?target=https%3A///dodoru& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/dodoru&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&可以看到我的很多练习代码还有我fork 来学习的代码。 很多地方有瑕疵,大家看看了解我当时的学习进度和水平就好,(?﹏?),凭良心说,我的代码不是很好,所以并不是用来模仿学习的好对象。
&/p&&p&学习安排
&/p&&p&注:本人是业余时间,一般晚上8:00 - 12:00 和周末学习代码的,经常会有一些其他杂事,所以只能担保每天至少两小时,大家可按照自己的咸鱼时间加快速度。
&/p&&br&&p&&b&第一个月: 基础篇&/b&
(3.12 - 4.12)
&/p&&p&&a href=&///?target=https%3A///dodoru/learn_in_python& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/dodoru/learn_in_python1.1K&i class=&icon-external&&&/i&&/a& &/p&&p&第一周:安装python2.7 ,利用笨方法学python 练习基本语法
&/p&&p&第二周:被推荐使用pycharm,
超级好用,强烈推荐,本人在默认设置里把制表符Tab 改成了四个空格;然后训练写了堆栈
&/p&&p&第三周:训练基本的数据结构,自己写链表和队列
&/p&&p&第四周:继续把笨方法学python 差不多敲完&/p&&br&&p&&b&第二个月:加强篇&/b&
(4.12 - 5.12 )
&/p&&p&第一周:因为记忆力比较差的缘故,我又重写了一次基本的堆栈队列和链表。
&/p&&p&第二周:看python 核心编程《基础篇》。
&/p&&p&第三周:继续看python 核心编程《基础篇》,简单写斗兽棋的程序(失败)。
&/p&&p&第四周:继续看python 核心编程《基础篇》,继续修改斗兽棋(失败),掉头写五子棋,开始接触pygame。
&/p&&p&注:接下来5/6月,因为在岗工作(计算机相关工作,但不是编程开发)很忙,所以没有很多时间写代码,进度会偏慢.这期间学习的pygame 是为了锻炼基本的编程技能,还有培养自己对python 编程的乐趣。 如果你本省具有比较好的编程基础也对编程早早具有强烈的爱好,可以跳过两个月的pygame.
&/p&&p&&b&第三个月: Pygame A &/b&
(5.12 - 6.12)
&a href=&///?target=https%3A///dodoru/LearnPygame& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/dodoru/LearnPygame125&i class=&icon-external&&&/i&&/a& &/p&&p&第一周:继续写五子棋,然后开始用pygame 开始写打砖块 breakblock。
&/p&&p&第二周:继续写打砖块,为了存储游戏的数据信息,中途学了一点点json。
&/p&&p&第三周:写好打砖块,获得成就感。电力效果 MAX。
&/p&&p&第四周:抄别人的Pygame 音乐播放器,失败。因为别人的音乐播放器中 含有manage.py 暂时无法理解。所以跳过去了。
&/p&&p&&b&第四个月:Pygame B
Flask (初步)
(6.12-7.12)
&/p&&p&第一周: 抄别人的飞机大战,学会使用音乐各种创造游戏效果(然并卵,只能培养乐趣)。 学习一点点turtle 用来画图(&a href=&///?target=https%3A//docs.python.org/2/library/turtle.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&docs.python.org/2/libra&/span&&span class=&invisible&&ry/turtle.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&) (然并卵,只能培养乐趣)。
&/p&&p&第二周:还在抄别人的pygame 代码(然并卵,所以被朋友责骂了,毕竟我学习python的目标还是要出去找工作的,而不是用来自娱自乐的。不过这个时候,我已经开始对python 情根深种了)。
&/p&&p&第三周: 开始看Flask 的那本薄薄的书,第一天快速浏览书的目录结构,第二天开始往后看,然后到了模板引擎那里死掉了。
&/p&&p&第四周:又看了一次Flask 的书,还是到了第四章就死掉。跑去看python核心编程《高级篇》前半部,我得静静心,因为半个月毫无进展很挫败;
&/p&&p&注:至此,学习python
遇到了最大的挫败感,我看一本书,来去看,每个字都能看懂,但是盖了书,我还是什么都不懂。甚至对着书本抄代码,运行起来也不对,仅仅因为我没有理解
templates 这个默认路径辨别的 文件夹是什么意思。我简直要疯掉了!!!想死的心都有了。不过接下来的两个月超级充实。大家要有被艹( ▼-▼
)的心理准备。&/p&&p&第五个月:Flask
(7.12-8.12) &/p&&p&&a href=&///?target=https%3A///dodoru/learn_in_python& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/dodoru/learn_in_python1.1K&i class=&icon-external&&&/i&&/a& &/p&&p&第一周:对着FLask 中文学习网站从头到尾敲,不懂就看第三第四次查资料问人厚着脸皮求帮助。然后顺便学习了一点http 协议 和 get
post ,socket等基本网络编程知识。&/p&&p&第二周:突然开窍,继续对着Flask 的中文学习网站敲,一直敲到了能够用txt作为简单存储文件来设计网站。&/p&&p&第三周:把txt 改为 sqlite3, 熟悉SQL语句,初步学习SQLAlchemy&/p&&p&第四周:学习cookie 和 session 等&/p&&p&第六个月:Flask+SQLAlchemy (8.12-9.12)&/p&&p&第一周: 练习 SQLAlchemy (&a href=&///?target=https%3A///dodoru/flask_todo& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/dodoru/flask&/span&&span class=&invisible&&_todo&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&),开始修改原来用sqlite3 存储数据的demo网站;&/p&&p&第二周:利用flask-mail 增加发送用户密码的功能,网站功能基本OK,打包成Lilium(&a href=&///?target=https%3A///dodoru/Lilium& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/dodoru/Liliu&/span&&span class=&invisible&&m&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&),继续狂砍书,学会blueprint。&/p&&p&第三周:继续狂看书,然后抄他们的大型博客(修改未完成)。然后写简历。&/p&&p&第四周:找工作。
---over---
&/p&&p&&b&剧场时间:&/b&&/p&&p&9月1日开始找工作,挑了8家看着很喜欢的公司投递简历,拿到五个面试通知,刚好堆积在三天内,9月5日专门请假去面试(单程7个小时,自费,我本来以为会没人要我的,所以第一轮是试水),结果没想到,基本上都很顺利,同一天拿到了三个口头offer,虽然不是特别好(毕竟不是特别厉害),但是也是可以在一线城市勉强活下来了。&/p&&p&然后回来等email offer , 心里很开心也有一定的纠结 ,没等到,有点怕,又投了几个简历。
然后碰到了我超超超超级喜欢的一个创业公司,在电话面试和机试通过后让我过去,临去之前查看公司背景资料(现在还在后悔),被吓到了,结果就一直抖(到了现在还在抖),脑袋一片空白。也不知道自己回答了什么,所有的脑细胞都变成离散的颗粒,完全无法启动,所以很混乱。但是技术负责人超级nice
还是给了我一个offer ,(可以足够让我在那个城市里活下去了) ,
当天回家路上我发呆了三个小时后又哭又笑又失眠又早醒,简直要疯了,所以第二天早上矜持不到四个小时,就接受了。&/p&&p&下午又有收到一个电话offer :D 不过当场毫无负担地拒绝掉了,然后两天后,开始主动回复那些给我邮件offer 和口头offer
的公司,免得互相耽误,听说口头offer
如果不回复也可以,但是我总觉得如果不回复就流程变成僵尸进程,心理不舒服,回复完之后,直接结束进程特别舒爽。&/p&&p&之后到现在还是在做梦的状态,现在在学 js 和 jquery 还有 scrapy. :
&/p&&p&&b&最后&/b&
能够在半年内快速学习python+flask+SQLAlchemy 仅仅靠个人闭门造车是不可能的。
用脚趾头都能猜出我肯定有搜索各种资料和问题,潜水在几个技术群和博客里默默围观的。
为了避免被人肉,就不自爆技术群了。这是我在知乎的回答,是讲怎么向大牛们请教问题的:&/p&&p&&b&如何向领域内的大牛求助,有什么注意事项?&/b&
我觉得最重要是态度,动机,坦诚,水平。
求学的态度要好,厚脸皮,人家帮你是善良,不理你是正常,所以愿意指点就应该感恩了。
动机要纯良,不要恶意满满,不要故意挖坑给对方跳,不要利用小聪明或者咬文嚼字故意曲解对方的话语作为把柄。基本上,大牛门见多识广,大多会判定对方是有心向学还是故意找茬,偶尔发生误判也是为了自我保护。
坦诚大概是我身上为数不多的闪光点,自己是怎么想的,是不是真的懂,有没有学过,有没有接触过,做过哪些尝试和推论,前因后果,如果对方问,就坦诚地说。绝对不要不懂装懂。
水平就是问之前至少搜一搜看看有没有类似的问题,就我来说,大部分遇到的问题都不是我一个人的问题。所以问之前,先搜索看看别人怎么说的,如果不理解或者找不到合理的解释,就可以发问了。
&a href=&/question//answer/& class=&internal&&/question//answer/&/a&
祝我幸福快乐,早成小牛,请保佑我:D
the same to you.&/p&&p&——————————2015年9月————————————
&/p&&br&&br&&br&&br&&br&&br&&br&&p&有很长一段时间,我看到这篇文章,会很难受。&/p&&p&我当时对小牛的标准是很低的,那时候我在井底,觉得跳出去井口,就成为小牛。结果,当我跳出井口,发现世界没有我想象那么美好,我在这世界丛林中又太卑微。&/p&&p&现在,我没有幸福快乐。&/p&&p&但是,对过去感到自豪羞愧难受唯独不后悔。&/p&&p&—————————— 2017年6月 ————————————&/p&
从0到1,是最艰难吃力的一步。 我15年的时候,在其它论坛发过一篇帖子,也是零基础开始学Python的。阅读量挺高的。希望对题主有帮助。 原文地址是
(排版比知乎好。 使用前说明: 本人大学专业是CS,大学的时候…
&img src=&/v2-d0cf3bdb26abf2a7481b_b.png& data-rawwidth=&1204& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1204& data-original=&/v2-d0cf3bdb26abf2a7481b_r.png&&&p&本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库,后续会发布相应专题的文章)。&/p&
&ol&&li&首先,按顺序依次展示了以下内容的一系列思维导图:&b&基础知识,数据类型(数字,字符串,列表,元组,字典,集合),条件&循环,文件对象,错误&异常,函数,模块,面向对象编程&/b&;&/li&
&li&接着,结合这些思维导图主要参考的资料,分享一下我的学习体验,一方面可供初学者参考,另一方面,也便于大家结合思维导图深入学习、理解、思考;&/li&
&li&最后,提供几篇文章链接,方便希望从 Python 2.x 迁移到 3.x 的朋友理解。&/li&
&/ol&&p&&b&笔者虽为一枚医学生,正是从学习 Python 起步,开启了数据科学新世界的大门。编程是这样一件美妙的事情,如果你没有开始,你不知道会错过一种多么棒的体验。Just try it~和大家共勉!&/b&&/p&
&h2&注意事项&/h2&
&ul&&li&本篇笔记原先基于 Python 2.x,经历多次改版,目前最新版本基于 Python 3.x,由于参考资料多来源于 2.x,可能有部分知识没有完全更新,欢迎提出意见,笔者会定期汇总修改。&/li&
&li&如需基于 Python 2.x 版本的笔记,可移步博客:&a href=&/?target=https%3A//woaielf.github.io& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ZY | 数林觅风&i class=&icon-external&&&/i&&/a& (详见「总览」思维导图)。&/li&
&li&本文是笔者在个人学习过程中总结的学习笔记,难免有疏忽&错误之处,望大家提出宝贵意见。&/li&
&li&文末附 PDF 下载链接。&/li&
&/ul&&h2&思维导图&/h2&
&ul&&li&默认阅读顺序:&b&从右→左,顺时针方向&/b&。&/li&
&li&思维导图软件:&b&XMind&/b&&/li&
&/ul&&h3&总览&/h3&&h3&&img src=&/v2-832dee9808878bbe66d0b4_b.png& data-rawwidth=&1304& data-rawheight=&1169& class=&origin_image zh-lightbox-thumb& width=&1304& data-original=&/v2-832dee9808878bbe66d0b4_r.png&&&/h3&
&h3&14 张思维导图&/h3&
&h4&基础知识&/h4&&h4&&img src=&/v2-f373b0c8453a_b.png& data-rawwidth=&1886& data-rawheight=&1138& class=&origin_image zh-lightbox-thumb& width=&1886& data-original=&/v2-f373b0c8453a_r.png&&&img src=&/v2-f658b7e83e619dd60b5d_b.png& data-rawwidth=&1953& data-rawheight=&1360& class=&origin_image zh-lightbox-thumb& width=&1953& data-original=&/v2-f658b7e83e619dd60b5d_r.png&&&/h4&
&h4&数据类型&/h4&&h4&&img src=&/v2-9e6e077a2a71ce1cb629_b.png& data-rawwidth=&1711& data-rawheight=&1125& class=&origin_image zh-lightbox-thumb& width=&1711& data-original=&/v2-9e6e077a2a71ce1cb629_r.png&&&/h4&
&h4&序列&/h4&&h4&&img src=&/v2-8a990f2f0c306fc8cf09ce_b.png& data-rawwidth=&910& data-rawheight=&1217& class=&origin_image zh-lightbox-thumb& width=&910& data-original=&/v2-8a990f2f0c306fc8cf09ce_r.png&&&/h4&
&h4&字符串&/h4&&h4&&img src=&/v2-6fad5ebc962b47f0aab3f_b.png& data-rawwidth=&2268& data-rawheight=&1667& class=&origin_image zh-lightbox-thumb& width=&2268& data-original=&/v2-6fad5ebc962b47f0aab3f_r.png&&&/h4&
&h4&列表 & 元组&/h4&&h4&&img src=&/v2-51f4b2cbf0a2dfd3a1048_b.png& data-rawwidth=&1979& data-rawheight=&885& class=&origin_image zh-lightbox-thumb& width=&1979& data-original=&/v2-51f4b2cbf0a2dfd3a1048_r.png&&&/h4&
&h4&字典 & 集合&/h4&&h4&&img src=&/v2-27f04fe62049eaa2bd5f3d_b.png& data-rawwidth=&1705& data-rawheight=&1002& class=&origin_image zh-lightbox-thumb& width=&1705& data-original=&/v2-27f04fe62049eaa2bd5f3d_r.png&&&/h4&
&h4&条件 & 循环&/h4&&h4&&img src=&/v2-7ff6c3dcbe0ed2fe9adb4a53_b.png& data-rawwidth=&2066& data-rawheight=&1825& class=&origin_image zh-lightbox-thumb& width=&2066& data-original=&/v2-7ff6c3dcbe0ed2fe9adb4a53_r.png&&&/h4&
&h4&文件对象&/h4&&h4&&img src=&/v2-e439ae6cebff4ff045fd0dfe33191b26_b.png& data-rawwidth=&1132& data-rawheight=&1808& class=&origin_image zh-lightbox-thumb& width=&1132& data-original=&/v2-e439ae6cebff4ff045fd0dfe33191b26_r.png&&&/h4&
&h4&错误 & 异常&/h4&&h4&&img src=&/v2-e8da9faea90e39e2ec48f6d341ec5af7_b.png& data-rawwidth=&1898& data-rawheight=&1432& class=&origin_image zh-lightbox-thumb& width=&1898& data-original=&/v2-e8da9faea90e39e2ec48f6d341ec5af7_r.png&&&/h4&
&h4&函数&/h4&&h4&&img src=&/v2-7b32ded1dadfe1bb2774c77_b.png& data-rawwidth=&2189& data-rawheight=&1431& class=&origin_image zh-lightbox-thumb& width=&2189& data-original=&/v2-7b32ded1dadfe1bb2774c77_r.png&&&img src=&/v2-916c1e3dddad0a6a0c43ecba_b.png& data-rawwidth=&2091& data-rawheight=&1410& class=&origin_image zh-lightbox-thumb& width=&2091& data-original=&/v2-916c1e3dddad0a6a0c43ecba_r.png&&&/h4&
&h4&模块&/h4&&img src=&/v2-0dbdaef2a4d_b.png& data-rawwidth=&1708& data-rawheight=&1349& class=&origin_image zh-lightbox-thumb& width=&1708& data-original=&/v2-0dbdaef2a4d_r.png&&&h4&面向对象编程&/h4&&h4&&img src=&/v2-e934e928e2ae9f462f778e6bcf03e211_b.png& data-rawwidth=&2072& data-rawheight=&2163& class=&origin_image zh-lightbox-thumb& width=&2072& data-original=&/v2-e934e928e2ae9f462f778e6bcf03e211_r.png&&&/h4&
&h2&参考资料&/h2&
&blockquote&&p&&a href=&/?target=http%3A//Python%25E5%25BF%25AB%25E9%E6%E7%25A8%258B%Vamei%%25E5%258D%259A%25E5%25AE%25A2%25E5%259B%25AD& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Vamei 博客:Python 快速教程&i class=&icon-external&&&/i&&/a& &/p&
&/blockquote&
&p&基于 Python 2.x,极佳的入门材料,非常推荐,即使希望学习 3.x 的朋友仍值得一看,毕竟版本之间的转移比编程思想本身要容易的多(版本转移可以看「推荐阅读」)。作者还基于 Python 3.x 写了一本书。&/p&
&blockquote&&p&&a href=&/?target=http%3A//Python%E6%E7%25A8%258B& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&廖雪峰:Python 教程&i class=&icon-external&&&/i&&/a& &/p&
&/blockquote&
&p&廖大大的经典教程,我是配合上面的教程一起看,从不同的角度加深理解。&/p&
&blockquote&&p&视频教程: Python语言程序设计&/p&
&/blockquote&
&p&基于 Python 3.x,中国大学 Mocc 平台,网址是:&a href=&/?target=http%3A//www.icourse163.org/learn/BIT-Ftid%3D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python语言程序设计_中国大学MOOC(慕课)&i class=&icon-external&&&/i&&/a& ,老师还有另外一系列 Python 课程,也是适合入门。&/p&
&blockquote&&p&《Python 核心编程》第二版&/p&
&/blockquote&
&p&书籍有些偏老,中文印刷有明显的小错误,但内容较全面,从浅入深覆盖面较大,可以在有一定基础的情况下择需阅读。&/p&
&h2&推荐阅读&/h2&
&blockquote&&p&&a href=&/?target=http%3A//What%25E2%s%2520New%2520In%2520Python%25203.0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&What’s New In Python 3.0&i class=&icon-external&&&/i&&/a& &/p&
&/blockquote&
&p&&a href=&/?target=http%3A//The%2520key%2520differences%2520between%2520Python%25202.7.x%2520and%2520Python%25203.x%2520with%2520examples& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The key differences between Python 2.7.x and Python 3.x with examples&i class=&icon-external&&&/i&&/a& &/p&
&p&相应中文版:&a href=&/?target=http%3A//Python%25202.7.x%%25B8%258E%2520Python%25203.x%%259A%%25B8%25BB%25E8%25A6%%25B7%25AE%25E5%25BC%2582& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python 2.7.x 与 Python 3.x 的主要差异&i class=&icon-external&&&/i&&/a& &/p&
&h2&PDF 版下载&/h2&
&p&链接:&a href=&/?target=http%3A///s/1geBIbFP& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1geBIbF&/span&&span class=&invisible&&P&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:7gzl&/p&
&h2&作者简介&/h2&
&p&小越酱,某医学院研二小硕一枚,热爱思维导图及数据科学,梦想着毕业后能从事数据相关的工作。个人博客:&a href=&/?target=https%3A//woaielf.github.io& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ZY | 数林觅风&i class=&icon-external&&&/i&&/a& ,不定期分享思维导图笔记,待某一话题积累足够多的笔记后,便集结成文。(比如本文~)若有朋友欲先览为快,可到博客一游哦。成熟的思维导图会分享于 GitHub 项目中:&a href=&/?target=https%3A///woaielf/MindMap_ZY& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&woaielf/MindMap_ZY&i class=&icon-external&&&/i&&/a& ,欢迎 fork,顺手点个 star 就更棒啦~感谢~&/p&
本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库,后续会发布相应专题的文章)。
首先,按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典,集合),条件&循环,文件对象,错误&异常,函数…
已有帐号?
无法登录?
社交帐号登录
324 人关注
568 条内容
526 人关注
233 条内容
435 人关注
126 条内容
1426 人关注
935 条内容

我要回帖

更多关于 主机宝php版本升级 的文章

 

随机推荐