首先两点建议:最好不要写太应用的程序练手,如果你发现你写程序的大部分时间都在查库手册(或者类似的事情),那就是大家所说的“搬砖”了;要思考什么更像是知识,什么只是经验,还是那句老话:要有造轮子的水平,和不造轮子的觉悟;老只会写写爬虫是造不出什么像样的轮子出来的

对于练手的程序,要注意简化和抽象,譬如某些可能会说“写一个小数据库、迷你操作系统”之类的,咋一听好像会很有收获,但是如果简化不得当的话,很容易看几篇教程就被懒得下手了,生活就是这样,你要知道什么只是冲动,什么才是实用。后面我会举例子说明如何简化项目

Python的练手项目以 计算机科学中有哪些典型的练手项目? - 知乎 为基础,然后再加上Python自己的特性。至于那些看似具有Python特色的语言特性,要么就是把常见的设计模式打包成了语法糖,发明了些关键字,譬如生成器、装饰器、描述器;或者就是整合其他古老语言的特点,譬如从SmallTalk那里来的元类、从Scheme那里来的闭包。

算法系列-排序与查找

Python写swap很方便,就一句话(a, b = b, a),于是写基于比较的排序能短小精悍。刚上手一门新语言练算法最合适不过了,还能顺便刷题,利于找工作。就算法本身而言的话,你还可以考虑写写一些常见的改进,譬如快排的stable实现、加栈的非递归实现,你甚至还可以试试快排的各种partition策略(Lomuto,Hoare),再自己改改轴值直观体验下不同轴值的区别,然后甚至可以自己试试简单的轴值选择优化,譬如三次取平均之类的。还有像折半查找的算法写100遍不为过。复杂的查找可以写二叉树、平衡二叉树、2-3树到红黑树(考虑如何在Python表示树?)不是老有人喜欢以自己能白板写红黑树为豪吗。简单的练习,让你受益无穷。

编译系列

首先的简化是不要指望一口气写一个完整的C编译器,即使只针对C一个很小的子集,还完全不做优化,没有中间代码,这样其实也够你折腾的。所以我们首先把整个后端全部省略,再把词法分析和语法分析简化到极致,写一个计算器的解释器是很好的开始,譬如解释(1+2)*3 这样一个简单的算式,其实已经包含了计算机的本质——计算,计算的本质其实就是解释。你可以先用Dijkstra的中缀转后缀表达式算法(Shunting-yard,我最喜欢的算法之一)来解释一个算式,进而研究下如何对算术表达式进行语法分析,试着用上下文无关文法来表示一个计算器的语法,然后构造抽象语法树来解释一个算式。

再进一步可以写一个极简语言的解释器,譬如brainfuck,写它的解释器比看懂它的hello world程序还要容易(其实还有许多这种类似的esoteric语言,譬如whitespace),用Python实现的代码量大概是50行左右, 之后你回头再看brainfuck的语法,会恍然大悟,图灵机的本质原来就是读写存储器和条件跳转!

如果你正在上或者将要上编译原理课的话,可以练习Thompson的算法把正则表达式构造成NFA,思路完全一样,只是对运算符的解释不同,然后可以再练练NFA转DFA子集构造法、或正则表达式直接直接构造DFA,然后顺便学学最小化DFA的算法。这是该课的经典作业之一,我们当年也都是用Python做的。对于正则表达式直接直接构造DFA的练习的话,可以自己实现一个flex,譬如,先把模式转成DFA,再把DFA们并联成一个NFA,再模拟这个NFA运行。

再进一步你可以扩展已有的计算器解释器,譬如加入声明、赋值与运算、循环、流程控制, 构成一个简单的LL(1)语法,然后递归下降分析,这就可以搞一个简易同时又图灵完备的玩具语言出来了。

另外你也可以写个简单的stack machine,体会一下这种虚拟机的解释执行和前面计算器的解释执行的联系与区别。具体请看这个加州理工的作业(很简单)。

CS 11: C track: assignment 8

如果觉得简单的stack machine不够过瘾的话,可以写个简单的JVM,支持些最基本的字节码。这有个SJSU的练习:

A Java Implementation of the Java Virtual Machine (JVM)

在学过了理论计算机基础以后,你甚至还可以写个下推自动机和图灵机的解释器(模拟器),类似于这个:

Tools

如果你在课上还顺便了解了lambda calculus,你甚至还可以再写个lambda calculus的解释器。在这个基础上,如果你再进一步,你甚至还可以继续写个scheme的简易解释器,Peter Norvig有教程:

(How to Write a (Lisp) Interpreter (in Python))

当然你还可以稍微加点专业的内容,譬如解释器的一种常用实现方式叫threaded interpreting,大致思路就是把switch case改写一个哈希表,从操作码直接跳转到对应实现函数,从而避免用switch case跳来跳去处理每一个操作码。但是用Python这种类型安全的语言无法直接实现threaded interpreting,可能需要用某些变种。

当然这些你都得写成你的Python版本。

分布式系统/计网系列

首先可以写一个简单的HTTP客户端了,原因很简单,因为HTTP大概是最简单的应用层协议了。Python又自带socket库,更简单了,zeromq也有Python版。这个客户端的任务就是和服务器建立TCP连接,然后把该发的东西打包成HTTP格式,什么第二行是空行啊什么的,然后发出去。再支持下所有请求方法,这样可以逼着你去读RFC2616。

然后可以考虑实现一个基本的ssh,你大概每天都会用ssh,难道不想做一个自己的简易版本吗?加密的那一部分可以模仿TLS那样,服务器先发公钥,客户端用这个公钥加密一个对称密钥发回去,然后以后都用对称密钥通信,客户端输入的内容直接发给服务器,服务器操作以后的结果再发给客户端,这就是一个简单的ssh了,你甚至还可以加入对X11 Forwarding的支持。

然后可以考虑分布式系统课上的经典作业,譬如写一个简单的RPC。在写RPC之前你最好先用用,了解用法以后再去写。可以参考Java的RPC原理以及Google的RPC框架(有Python版)。再譬如写一个P2P分享系统,没有多台电脑可以用多个虚拟机(网络编程里经常需要这样),虚拟机管理系统推荐:Vagrant。

操作系统系列

内存管理部分没什么可练手的,尤其还是用Python这种非系统编程语言;进程管理的话可以写个多层次的round robin调度算法,你不需要去调度真正的进程,模拟一下进程就行;同步的话可以试试用Python自带的Mutex,Semaphore写常见的并发模型,哲学家吃饭、生产消费之类的。你甚至还可以用实例感受一下CPython被大家诟病的加了解释器全局锁的鸡肋的多线程(Concurrent但不Parallell),譬如写一个复杂的算式分成几个独立的部分分给各线程然后在你的多核的机器上跑,看看跟单线程有何区别,你还可以想想CPython中在什么情况下线程可以真正Parallel起来?

并发的部分可以写写几个经典的并发场景(重点推荐),把互斥锁、cv、semaphore等最常见的几个锁模型都用用,譬如生产者消费者模型,用用Python的thread模块,同时了解下Global Interpreter Lock以及它导致了什么问题。经典的多线程编程是学习新语言很好的练习方式,能让你动脑子。

存储管理的话可以写一个简单的文件系统,这个稍微复杂一点。第一步的简化就是用一个大的空文件作为磁盘,就不用专门找个真磁盘或者U盘了,把对磁盘的读写抽象成对这个文件的读写。基本就是实现下inode,然后包装成一个shell,支持下最基本的命令,新建、追加、读写、删除之类的操作。这个练习最有趣也最有意义的地方在于多级索引的实现,有一个VSFS的教程,C++写起来大概1600行,Python更少:

http://pages.cs.wisc.edu/~remzi/OSTEP/file-implementation.pdf

周边系列

你也可以试试Jython,IronPython之类的,看看和CPython比如何。然后再试试Pypy,Numba和Cython,感受下性能提升。

做实验的话用IPython把Python函数当命令跑很方便。

这些例子每一个都不复杂,大部分我自己当年都写过,最多几百行,从头到尾写下来,你会发现你不仅熟练了Python,算法、操作系统、计网、编译原理的基础也顺便复习了。一箭无数雕。

python项目-Python 的练手项目有哪些值得推荐?相关推荐

  1. python新手项目-推荐:一个适合于Python新手的入门练手项目

    原标题:推荐:一个适合于Python新手的入门练手项目 随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人 ...

  2. 一个适合于Python 初学者的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

  3. 推荐 Python 十大经典练手项目,让你的 Python 技能点全亮!

    前言:如果有人问:"Python还火吗?""当然,很火.""哪能火多久呢?""不知道." 技术发展到现在衍生出许多种编程 ...

  4. python新手小项目-推荐:一个适合于Python新手的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

  5. python适合做什么生意_适合Python的5大练手项目,你练了么?

    在练手项目的选择上,还存在疑问?不知道要从哪种项目先下手? 首先有两点建议: 最好不要写太应用的程序练手,要思考什么更像是知识,老只会写写爬虫是无用的,但是完全不写也不行. 对于练手的程序,要注意简化 ...

  6. python新手程序_推荐:一个适合于Python新手的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

  7. python新手入门项目推荐_推荐:一个适合于Python新手的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

  8. python做些什么项目_Python 的练手项目有哪些值得推荐

    1 Web方向的练手项目 这个其实是肯定不用多少的了.Python的练手项目就是可以做一个网站了.我们可以做一个属于自己的博客.在做博客的时候,我们可以巩固的知识点是 Html+CSS+JS的基础知识 ...

  9. 适合新手入门的8个python项目_推荐:一个适合于Python新手的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

  10. 一个适合于Python初学者的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

最新文章

  1. 美多商城之商品(商品列表页)
  2. win7 + vs2013 + zlib 编译
  3. 边缘链接 matlab,matlab-“简单”边缘-线-检测
  4. 认识 linux sysfs文件系统
  5. 超详细:常用的设计模式汇总
  6. 直击面试现场:神级程序员仅100秒,60行代码写出俄罗斯方块,成为全公司焦点!...
  7. cf修改游戏客户端是什么意思_微信codm什么意思 微信codm 小飞机 落!什么意思[多图]-游戏攻略...
  8. OpenShift 4 Tekton (4) - 使用Workspaces为包含Maven Build的Pipeline提速
  9. win7 vmware虚拟机 中 mac系统无法上网
  10. 一个容易失误的字符串转字符问题
  11. 峰值信噪比公式_图像峰值信噪比的计算
  12. 2012-7-07可樂词汇积累#9314;
  13. 安卓如何调出软键盘_Android软键盘显示模式及打开和关闭方式(推荐)
  14. 做数据分析必看的书有哪些?
  15. SAP PS常用事务代码T-CODE
  16. 7-1 约瑟夫环问题-hebust (10 分)
  17. jquery日期控件使用,起止时间
  18. 大数据之Linux篇(一)
  19. 时区缩写 UTC, CST, GMT, CEST 以及转换
  20. rock64搭建superset(适用于其他linux服务器)

热门文章

  1. 【Python 爬虫系列非专业教学】(3)手把手教你获取猫眼电影 Top 100 榜单
  2. 计算机图形学基础知识-光照材质
  3. 已知函数func的C语言代码框架,第三章习题-ddg
  4. mysql只有frm_MySQL只有.frm和.ibd文件如何批量恢复InnoDB表-爱可生
  5. Java基础篇--IO
  6. 阿里云迁移工具推荐最佳实践:KVM虚拟化迁移到阿里云
  7. 51nod - 1378 - 夹克老爷的愤怒
  8. 2015校园O2O商业模式解析——从物流切入
  9. 绑定变量窥视 oracle,Oracle bind peeking(绑定变量窥视)
  10. 如何打断制图中的CAD图形?