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文 ...
随机推荐
- python线程池实现
python 的线程池主要有threadpool,不过它并不是内置的库,每次使用都需要安装,而且使用起来也不是那么好用,所以自己写了一个线程池实现,每次需要使用直接import即可.其中还可以根据传入 ...
- Docker 1.12 集群
环境介绍 虚拟机两台,vmware ,网络为NAT node139:192.168.190.139 Node140: 192.168.190.140 设置hostname 以139为例 ...
- <<一种基于δ函数的图象边缘检测算法>>一文算法的实现。
原始论文下载: 一种基于δ函数的图象边缘检测算法. 这篇论文读起来感觉不像现在的很多论文,废话一大堆,而是直入主题,反倒使人觉得文章的前后跳跃有点大,不过算法的原理已经讲的清晰了. 一.原理 ...
- Leetcode: word search
July 6, 2015 Problem statement: Word Search Given a 2D board and a word, find if the word exists in ...
- 最小生成树 kruskal算法 codevs 1638 修复公路
1638 修复公路 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description A地区在地震过后,连接所有村庄的公 ...
- [No000068]document.body.clientHeight 和 document.documentElement.clientHeight 的区别
document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.docume ...
- C语言基础(一)
7744问题(输出所有形如aabb的4位完全平方数) 方法1: #include<stdio.h> #include<math.h> int main (){ ;a<=; ...
- jmeter(六)元件的作用域与执行顺序
jmeter是一个开源的性能测试工具,它可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的父子关系,那么随着它们的顺序和所在的域不同,它们在执行的时候,也会有很多不同. jmeter的test pla ...
- 为什么Java不支持多继承?
没想过面试的时候,会遇到语言设计上的问题.现场答得并不好因为一直没思考过,经过了点搜索,渐渐有点思路. 1. 避免“钻石型”多继承问题:有两个类B和C继承自A.假设B和C都继承了A的方法并且进行了覆盖 ...
- Win10 UWP开发实现Bing翻译
微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...