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

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

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练手经典100例项目-Python 的练手项目有哪些值得推荐?相关推荐

  1. python练手经典100例-【Python精华】100个Python练手小程序

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...

  2. python练手经典100例微盘_Python练手项目实例汇总(附源码下载)

    1 #_*_ coding:utf-8 _*_ 2 from tkinter import * 3 importrandom4 importtime5 importtkinter.messagebox ...

  3. python练手经典100例-Python 的练手项目有哪些值得推荐?

    首先两点建议:最好不要写太应用的程序练手,如果你发现你写程序的大部分时间都在查库手册(或者类似的事情),那就是大家所说的"搬砖"了:要思考什么更像是知识,什么只是经验,还是那句老话 ...

  4. python练手经典100例-10 个最值得 Python 新人练手的有趣项目

    原标题:10 个最值得 Python 新人练手的有趣项目 作者 | Claire D. Costa 编译 | Wendy 有很多 Python 新手留言问:"Python 入门很久了,但项目 ...

  5. python练手经典100例-推荐几个适合新手练手的Python项目《python入门例子》

    python 为什么实例对象可以调用类方法? 实例是什么例是类定义的实.那么,类中所定义的属方只要没有被屏蔽,在它的实体中就同样是可访问的. 至于说没有run()没有参数self,而是参数cls,为什 ...

  6. 新手python的100个实战项目,python练手经典100例项目

    Python 的练手项目有哪些值得推荐? 基础和爬虫.Python由荷兰数学和计算机科学研究学会的Guido van Rossum于1990 年代初设计,作为一门叫做ABC语言的替代品. Python ...

  7. python练手经典100例项目-推荐 10 个有趣的 Python 练手项目

    想成为一个优秀的Python程序员,没有捷径可走,势必要花费大量时间在键盘后. 而不断地进行各种小项目开发,可以为之后的大开发项目积攒经验,做好准备. 但不少人都在为开发什么项目而苦恼. 因此,我为大 ...

  8. python练手经典100例-python零基础练手项目100+

    文章目录 Python3 100例 实例001:数字组合 实例002:"个税计算" 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契数列 ...

  9. python练手经典100例项目-Python入门练手100例

    [Python练习实例001] 有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? [Python练习实例002] 企业发放的奖金根据利润提成.利润(I)低于或等于10万 ...

  10. python练手经典100例微盘_20个Python练手经典案例,能全做对的人确实很少!

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. 如果你感觉学不会?莫慌,小编推荐大家加入群, 前面548中间3 ...

最新文章

  1. java类加载器_类加载器ClassLoader
  2. java高并发(十)线程不安全类与写法
  3. chrome浏览器net::ERR_TOO_MANY_REDIRECTS
  4. vant显示日期格式_Vue+Vant ui实现日期时间选择
  5. 网站运行java_定制化Azure站点Java运行环境(5)
  6. 宝贝,我帮你清了购物车哦!
  7. 计算概论(A)/基础编程练习1(8题)/3:晶晶赴约会
  8. Ubuntu下添加打印机---之寻找设备lpinfo
  9. css3文档手册chm_你还在使用CHM帮助文档吗?赶快试试Baklib吧
  10. JetBrains:webstrom无法识别就require方法
  11. (HDU)1089 --A+B for Input-Output Practice (I)(输入输出练习(I))
  12. html模板自动保存在哪个文件夹,wps的备份文件夹在哪里 wps崩溃自动保存文件在哪里...
  13. idea中中文字体设置
  14. ABP官方文档翻译 8.1 通知系统
  15. 关于Android Handler同步屏障那些事
  16. 流媒体(视频)开发常用调试工具
  17. php开发中常用字符串函数总结
  18. 使用VSLinux插件开发和调试
  19. 国内芯片60个细分领域知名代表企业
  20. 聊聊什么是探索式测试

热门文章

  1. 2022年农产品行业研究报告
  2. UGUI源代码之Image-Sliced模式
  3. 黄金比例编程python_python实现黄金分割法
  4. 写给冬天里开放的那些花儿
  5. 五步教你如何利用python爬虫制作一个中国慕课视频下载器
  6. 69 MyBatis和Spring整合
  7. 物联网安全与安全分析
  8. 数显之家快讯:【SHIO世硕心语】小聪明毁大前程,所有人都应该深思!
  9. 西电软工oop面向对象程序设计实验四上机报告
  10. 微信营销如何做对o2o商业模式心灰意冷了吗?O2O到底要怎么做?