《think in python》学习-6
think in python
有返回函数
我们使用过的内置函数中,有一部分会返回结果,比如 math的
返回值
我们写一个有返回值的函数,计算给定半径的圆的面积,例如这个:
def area(raduis):
temp = math.pi * radius*2
return temp
当然可以简化这个版本
def area(raduis):
return math.pi * radius * 2 #省去temp变量这个步骤
有时候会有不同分支,根据不同分支返回不同的结果:
def absoulte_value(x):
if x<0:
return -x
else:
return x
增量开发
每次只增加和测试一小部分代码,来避免长时间的调试过程
一个增量开发的示例(查找2点之间的距离,给定坐标 x1,y1 和 x2,y2):
# 第一步可以点定义函数形参以及返回值
def distance(x1,y1,x2,y2):
return 0.0
#第二步 可以开始计算2个点之间距离差了
def distance(x1,y1,x2,y2):
dx = x2-x1
dy = y2-y2
print dx
print dy
return 0.0
#第三步 计算dx dy的平方
def distance(x1,y1,x2,y2):
dx = x2-x1
dy = y2-y2
dsquared = dx**2+dy**2
print dsquared
return 0.0
#第四步 可以返回结果了
def distance(x1,y1,x2,y2):
dx = x2-x1
dy = y2-y2
dsquared = dx**2+dy**2
result = math.sqrt( dsquared)
return result
这种开发过程的关键点是:
- 以一个可以正确运行的程序开始,每次只做小的增量修改,如果在任意时刻发现错误,你都应当知道错误在哪里
- 使用临时变量保存计算的中间结果,这样你可以显示和检查他们
- 一旦整个程序完成,你可能会想要删除掉某些脚手架代码或者把多个语句综合到一个复杂表达式中,但只在不会增加代码阅读的难度时才应该那么做
组合
在函数中可以调用其他函数。这个能力被称为组合
我们写个函数,接收2个点,圆心和圆周上的一点,计算圆的面积, 这里用到组合以前的函数。
def distance(x1,y1,x2,y2):
dx = x2-x1
dy = y2-y2
dsquared = dx**2+dy**2
result = math.sqrt( dsquared)
return result
def area(raduis):
return math.pi * radius * 2
def circle_area(xc,yc,xp,yp):
radius = distance(sx,yc,xp,yp)
return area(radius)
布尔函数
返回布尔值
def is_divisible(x,y):
if x%y==0:
return True
else :
return False
递归
阶乘函数可以通过return
值和递归自己 来完成任务。
def factorial(n):
if n==0:
return 1
else:
recurse = factorial(n-1)
result = n*recurse
return result
另一个是 斐波那契数列:
def fibonacci(n):
if n==0:
return 0
elif n==1:
return 1
else:
return fibonacci(n-1)+fibonacci(n-2)
检查类型
如果不检查传入参数的类型,很多时候会让程序报错
如果我们给factorial(1.5)
这样执行,那么会报错。
我们有2个方法:
- 泛化函数,使之能正确处理浮点数
- 检查阐述类型,类型不匹配的返回
None
def factorial2(n):
if not isinstance(n,int):
print "非整数"
return None
elif n<0:
print "不能为负数"
return None
elif n==0:
return 1
else:
return n*factorial2(n-1)
调试
给函数添加print 往往能帮我们调试很多问题
例子:
def debug_factorial(n):
space = ' '*(4*n)
print space, "factorial",n
if n==0:
print space, "returning 1"
return 1
else:
recurse = debug_factorial(n-1)
result = n*recurse
print space, "returning",result
return result
练习
- 写一个
compare
函数,如果x>y
返回1,如果x==y
返回0 ,如果x<y
返回-1def compare(x,y):
if x>y:
return 1
elif x==y:
return 0
else:
return -1 - 使用增量开发来编写一个
hypotenuse
给定直角三角形的两个直角边的长度时,它返回斜边的长度。def hypotenuse(x,y):
return math.sqrt(x**2+y**2)
- 写一个函数
is_between
当x<=y<=z
返回True 其他返回Falsedef is_between(x,y,z):
if x<=y<=z:
return True
else:
return False
- 写个回文函数,
noon
或者asdf
可以通过该函数判断是否回文。def check_hui(w):
def first(word):
return word[0]
def last(word):
return word[-1]
def middle(word):
return word[1:-1]
if len(w)<=1:
return True
if first(w) != last(w):
return False
return check_hui(middle(w))
- 我们说一个数a是b的乘方,如果a可以被b整除 并且a/b也是b的城防。编写一个函数
is_power
接受形参a和b 当a是b的乘方时返回True.def is_power(a,b):
if a%b==0 and (a/b)%b==0:
return True
else:
return False
- 求a和b的最大公约数(GCD)
def gcd(a, b):
if a < b:
a, b = b, a
while b != 0:
temp = a % b
a = b
b = temp
return a
术语表(新手建议阅读并尝试理解):
- 临时变量(temporary variable):在复杂计算中用于保存中间值的变量
- 无效代码(dead code):程序中的一些代码,永远可能执行不到。常常是写在return语句之后的代码。
- None:函数返回的一种特殊值,当没有返回语句时,或者返回语句不带参数时,返回这个值
- 增量开发(incremental development):一个程序开发计划,每次通过只增加少量代码并加以测试的步骤,来减少调试
- 脚手架代码(scaffolding):在开发过程中使用的,但在最终版本中不需要的代码
- 守卫(guardian):一个编程模式,使用条件语句来检查并处理可能产生的错误
《think in python》学习-6的更多相关文章
- 学习C++ Primer 的个人理解(一)
<C++ Primer>这本书可以说是公认的学习C++最好的书,但我觉得不是特别适合作为教材,书中内容的顺序让人有些蛋疼.我个人认为初学此书是不能跳着看的.如果急于上手的话,我更推荐< ...
- 学习C++ Primer 的个人理解(九)
这一章介绍顺序容器,在之前的第三章中,了解到的vector就属于顺序容器的一种. 一个容器就是一些特定类型对象的集合. 除了vector,还有哪些顺序容器? vector: 大小可变,随机访问的速度很 ...
- 学习C++ Primer 的个人理解(三)
第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vec ...
- 学习C++ Primer 的个人理解(二)
本身就一定基础的读者我想变量常量这些概念应该已经不是问题了.但是本章还是有几个重点,需要特别留意一下的: 1.初始化和赋值是不同的操作 2.任何非0值都是true 3.使用新标准列表初始化,在有丢失精 ...
- 学习C++.Primer.Plus 11 使用类
1.操作符重载 重载操作符的几个限制: a) 重载的至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载操作符. b) 不能违反操作符原有来的句法规则. c) ...
- 学习C++.Primer.Plus 10 对象和类
1.类的声明和定义 类的声明和定义. 类声明的格式如下: class className { private://private 是类对象的默认访问控制,因此,可以省略 data member del ...
- 学习C++.Primer.Plus 8 函数探幽
1. 内联函数 普通函数调用: 存储调用指令的地址->将函数参数复制到堆栈->跳到函数地址执行代码(返回值放到寄存器)->跳回调用指令处 2. 当代码执行时间很短,且会被大量调用的 ...
- 学习C++.Primer.Plus 7 函数
C++的返回值类型不能是数组 函数原型中的变量名相当于点位符,因此不要求提供变量名. void cheers(int); C++中不指定参数列表时就使用活力号: void saybye(...); 通 ...
- 学习C++.Primer.Plus 6 分支语句和逻辑操作符
||. &&操作符是一个顺序点 < 操作符从左向右结合 ; < age < )//17<age为true, = 1,肯定 < 27.所以为整个条件为tru ...
- 学习C++.Primer.Plus 5 循环和关系表达式
C++将赋值表达式的值定义为左侧成员的值 赋值操作符是自右向左结合的 cout.setf(ios:: boolalpha);//调用设置标记,命令cout输出true或false,而非1或0. 任何表 ...
随机推荐
- HDU 4122 Alice's mooncake shop
单调队列,裸的!!坑死了,说好的“All the orders are sorted by the time in increasing order. 呢,我就当成严格上升的序列了,于是就各种错.测试 ...
- Sonar入门(二): Maven集成Sonar
Sonar对maven提供了简单可配的支持,要做的事情很简单——在maven/conf下settings.xml <profiles></profiles>标签之间添加如下内容 ...
- Android SDK目录结构和工具介绍
Android SDK目录结构和工具介绍是本文要介绍的内容,主要是来了解并学习Android SDK的内容,具体关于Android SDK内容的详解来看本文. AD: Android SDK目录结构和 ...
- Linux系统安装VM-Tools
安装 vmware-tools的安装包有两个,一个是rpm包,一个是tar包,下面分别是用了这两种方法安装: 一.rpm包安装 1.在启动LINUX 虚拟机之后,在WMWare 的菜单栏中点击&quo ...
- 聚类算法初探(六)OPTICS
最近由于工作需要,对聚类算法做了一些相关的调研.现将搜集到的资料和自己对算法的一些理解整理如下,供大家参考. 另外在算法代码方面,我也做了一些实现(包括串行和并行),欢迎感兴趣的朋友探讨和交流. 第一 ...
- [代码]Java后台推送消息到IOS前端
PayLoad payLoad = new PayLoad(); payLoad.addAlert("test"); //手机端的提示消息 payLoad.addBadge( ...
- UVA 10305 Ordering Tasks
题意: 给出n和m,n代表总共有几个箱子.接下来m行,每行有a,b,表示b在a之后.输出一个合理的序列. 分析: 简单的拓扑排序: 代码: #include <iostream>#incl ...
- asp.net session的原理
session,会话,指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间. A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连 ...
- 出现No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here异常
问题描述: public void save(BaseEntity baseEntity) { Session session = null; try { session = currentSessi ...
- php汉字转Unicode编码函数
/** * $str 原始字符串 * $encoding 原始字符串的编码,默认GBK * $prefix 编码后的前缀,默认"&#" * $postfix 编码后的后缀, ...