sicp-py
第一章
在第一章中,我们专注于计算过程,以及程序设计中函数的作用。我们看到了如何使用原始
数据(数值)和原始操作(算术运算),如何通过组合和控制来形成复合函数,以及如何通
过给予过程名称来创建函数抽象。我们也看到了高阶函数通过操作通用计算方法来提升语言
的威力。这是编程的本质。
牛顿法求根
平方根
def square_root(a):
return find_root(lambda x: square(x) - a)
对数
def logarithm(a, base=2):
return find_root(lambda x: pow(base, x) - a)
迭代改进算法
def newton_update(f):
def update(x):
return x - f(x) / approx_derivative(f, x)
return update
函数的导数(斜率)
def approx_derivate(f, x, delta = 1e-5):
df = f(x + delta) - f(x)
return df/delta
main:
def find_root(f, initial_guess = 10):
f(x) = square(x) - 16
def test(x):
return approx_eq(f(x), 0)
return iter_improve(newton_update(f), test, initial_guess)
iter_improve
def iter_improve(newton_update(f), test, guess = initial_guess):
while not test(guess): #当 guess 不为0
guess = newton_update(guess)
return guess
测试相似性, 若相似返回 1
def approx_eq(x, y, tolerance = 1e-5):
return abs(x - y) < tolerance
1.6.8 函数装饰器
def trace1(fn):
def wrapped(x):
print('->', fb, '(', x, ')')
return fn(x)
return wrapped
>>> trace1
def triple(x):
return 3 * x
>>> triple(12)
-> <function triple at 0x102a39848> ( 12 )
36
像通常一样,函数 triple 被创建了,但是, triple 的名称并没有绑定到这个函数上,
而是绑定到了在新定义的函数 triple 上调用 trace1 的返回函数值上。在代码中,这
个装饰器等价于:
>>> def triple(x):
return 3 * x
>>> triple = trace1(triple)
第二章 使用对象构建抽象
(专注于数据)
2.2数据抽象
由于我们希望在程序中表达世界中的大量事物,我们发现它们的大多数都具有复合结构。日
期是年月日,地理位置是精度和纬度。为了表示位置,我们希望程序语言具有将精度和纬
度“粘合”为一对数据的能力 -- 也就是一个复合数据结构 -- 使我们的程序能够以一种方式操作
数据,将位置看做单个概念单元,它拥有两个部分。
复合数据的使用也让我们增加程序的模块性。如果我们可以直接将地理位置看做对象来操
作,我们就可以将程序的各个部分分离,它们根据这些值如何表示来从本质上处理这些值。
将某个部分从程序中分离的一般技巧是一种叫做数据抽象的强大的设计方法论。这个部分用
于处理数据表示,而程序用于操作数据。数据抽象使程序更易于设计、维护和修改。
数据抽象的特征类似于函数抽象。当我们创建函数抽象时,函数如何实现的细节被隐藏了,
而且特定的函数本身可以被任何具有相同行为的函数替换。换句话说,我们可以构造抽象来
使函数的使用方式和函数的实现细节分离。与之相似,数据抽象是一种方法论,使我们将复
合数据对象的使用细节与它的构造方式隔离。
数据抽象的基本概念是构造操作抽象数据的程序。也就是说,我们的程序应该以一种方式来
使用数据,对数据做出尽可能少的假设。同时,需要定义具体的数据表示,独立于使用数据
的程序。我们系统中这两部分的接口是一系列函数,叫做选择器和构造器,它们基于具体表
示实现了抽象数据。
sicp-py的更多相关文章
- Lisp和SICP
大概不少programmer都看过<黑客与画家>,作者用了整整一章的篇幅讨论Lisp的强大.我自然就会手痒痒. 几个月前,几天内攻城略地搞定了Python,用的方法便是 ...
- python调用py中rar的路径问题。
1.python调用py,在py中的os.getcwd()获取的不是py的路径,可以通过os.path.split(os.path.realpath(__file__))[0]来获取py的路径. 2. ...
- Python导入其他文件中的.py文件 即模块
import sys sys.path.append("路径") import .py文件
- import renumber.py in pymol
cp renumber.py /usr/local/lib/python2.7/dist-packages/pymol import renumber or run /path/to/renumber ...
- python gettitle.py
#!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...
- 解决 odoo.py: error: option --addons-path: The addons-path 'local-addons/' does not seem to a be a valid Addons Directory!
情况说明 odoo源文件路径-/odoo-dev/odoo/: 我的模块插件路径 ~/odoo-dev/local-addons/my-module 在my-module中创建了__init__.py ...
- caffe机器学习自带图片分类器classify.py实现输出预测结果的概率及caffe的web_demo例子运行实例
caffe机器学习环境搭建及python接口编译参见我的上一篇博客:机器学习caffe环境搭建--redhat7.1和caffe的python接口编译 1.运行caffe图片分类器python接口 还 ...
- 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...
- MySqlNDB使用自带的ndb_setup.py安装集群
在用Mysql做集群时,使用Mysql的NDB版本更易于集群的扩展,稳定和数据的实时性. 我们可以使用Mysql自带的工具进行集群安装与管理:ndb_setup.py.位于Mysql的安装目录bin下 ...
- 将做好的py文件打包成模块,供别人安装调用
现在要将写完的3个py文件,打包. 步骤: 1.新建一个文件夹setup(名字随便取),在setup文件夹下,再新建一个文件夹financeapi. 2.将上面4个py文件拷贝至financeapi文 ...
随机推荐
- Linux 多线程可重入函数
Reentrant和Thread-safe 在单线程程序中,整个程序都是顺序执行的,一个函数在同一时刻只能被一个函数调用,但在多线程中,由于并发性,一个函数可能同时被多个函数调用,此时这个函数就成了临 ...
- 原生js与jquery操作iframe
1 原生js获取iframe的window对象 //方法1 document.getElementById('iframeId').contentWindow; //方法2 window.frame ...
- Jackson将json字符串转换成泛型List
Jackson,我感觉是在Java与Json之间相互转换的最快速的框架,当然Google的Gson也很不错,但是参照网上有人的性能测试,看起来还是Jackson比较快一点 Jackson处理一般的Ja ...
- openstack云5天资料
在网上看到有个人的博客,写了个openstack云5天学习资料.对于英文不怎么好的童鞋来说,感觉还可以.可以对openstack有所了解和认识,对后续openstack更加深入的学习有很大的帮组. ...
- [bootsrap]模态框使用例
<a href="#modal1" role="button" class="btn btn-primary btn-sm" data ...
- EF6 Create Different DataContext on runtime(运行时改变连接字符串)
引言 在使用EF时,有时我们需要在程序运行过程中动态更改EF的连接字符串,但不幸的时EF是否对 ConfigurationManager.RefreshSection("xxx" ...
- HDU 4622 Reincarnation (查询一段字符串的不同子串个数,后缀自动机)
Reincarnation Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- CSS实现进度条和订单进度条
最近半个月为了期末考试,可要了学渣我半瓶血啊!今天本该好好复习的,可是状态不好,就随便找点乐子玩一玩,于是乎就想起之前面试时面试官给的一道题(见标题),那就弄点简单的小玩意给自己洗洗脑咯. 简单地效果 ...
- flex align-content中的描述的“多根轴线的对齐方式”中的“多根轴线”到底是什么
flex 有两条轴线,根据flex-flow 设置的来判断的,水平为主轴的话,那么值为row,垂直为主轴的话那么为column: 其中设置align-items 和 align-content都是来设 ...
- css设置select高度(IE,FF,Chrome)[转]
大家都知道select是无法设置高度和边框颜色等等的在ie67下面,其他的都是可以的,所以有时候为了在所有的浏览器下显示都一致,就使用了 js的模拟,这个是大家经常碰到的,js不光要模拟外观还有模拟事 ...