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文 ...
随机推荐
- vs与qt配置
1.error: these Qt version are inaccessible;Qt5.4.0 in D:\qt5.4.0\5.4\msvc2013Make sure that you have ...
- linux mysql-5.6.26 安装
下载地址 ftp://mirror.switch.ch/mirror/mysql/Downloads/MySQL-5.6/mysql-5.6.26-linux-glibc2.5-x86_64.tar. ...
- Counting Bits -leetcode
introduction: Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num ...
- HDU1890 Robotic Sort[splay 序列]
Robotic Sort Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- php中header函数参数的Cache-control:private,no-cache,must-revalidate,max-age是使用方法!
由于我做的是登录,也就是用户登录每次登陆时都要来访问服务器,不需要在客户机做缓存,于是在网上找了找,发下一下文章不错于是传了上来.网页的缓存是由HTTP消息头中的“Cache-control”来控制的 ...
- UITabBarController的创建与自定义TarBar---学习笔记三
代码如下: #import <UIKit/UIKit.h> @interface BSJTabBarViewController : UITabBarController @end #im ...
- c# 传递Null的string值导致的调用C++的dll报错 Attempted to read or write protected memory.
c# 调用C++的dll报错 Attempted to read or write protected memory: 原因是:c# 传递Null的string值导致的,将Null改为string ...
- Membership 重置密码
public ActionResult ChongZhiMiMa() { Membership.GetUser("admin").UnlockU ...
- javascript正则表达式:匹配所有html标签
此正则表达式收集于网络,但那个网站连复制一下都需要注册会员,鄙视之,所以不提他了.而且,原作者也不可能是那个网站. html标签有<h1></h1>这种成对的,也有<br ...
- 攻克Spring
http://www.cnblogs.com/dream-to-pku/p/5655247.html