python基础学习笔记(七)
2013-04-24 00:16 虫师 阅读( ... ) 评论( ... ) 编辑 收藏
本章介绍如何将语句组织成函数,这样,可以告诉计算机如何做事。
下面编写一小段代码计算婓波那契数列(前两个数的和是第三个数)
fibs = [0,1]
#
定义一个列表,初始内容是0,1
for
i
in
range(8):
#
循环8次
fibs.append(fibs[-2]+fibs[-1])
#
append在末尾追加一个数,这个是它前面两个数的和
#
输入
>>>
fibs
#
输出
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
因为赋完值 fibs 已经有两个数了( 0 , 1 ),所以循环 8 次之后,列表有 10 个数,两个数相加等于第 3 个数。
是不是觉得应该由我们输入来控制打印多少个数?只用把程序小变一下就行了。
fibs = [0,1
]
num
= input(
'
How many fibonacci numbers do you want?
'
)
for
i
in
range(num-2
):
fibs.append(fibs[
-2]+fibs[-1
])
print
fibs
#
输入
>>>
How many fibonacci numbers do you want?
12
#
输出
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
抽象
抽象有可以节省很多工作,它使得计算机程序可以让人读懂的关键。计算机喜欢处理精确和具体的指令,但人不同,我们更喜欢丢进去一个东西,计算机就能反馈给我们想要的结果,而不是由我们一步一步的告诉它怎么做。因此,上面的代码抽象一点,应该是这样的:
num = input(
'
How many fibonacci numbers do you want?
'
)
print
fibs
那计算机怎么知道要怎么做?我们可以把处理的过程封装成函数,在我们每次用到时只用调用这个函数就可以了。
创建函数
函数是可以调用的,它执行某种行为并且返回一个值。内建的 callable 函数可以用来判断函数是否可调用:
>>>
import
math
>>> x = 1
>>> y =
math.sqrt
>>>
callable(x)
False
>>>
callable(y)
True
备注: callable 在 python3.0 中不再可用。
那如何定义一个函数呢?使用 def 语句即可:
>>>
def
hello(name):
return
'
hello.
'
+name+
'
!
'
#
我们定义了一个hello函数,它会将输入的内容前面加“hello.”后面加“!”,并返回给用
#
户
>>>
print
hello(
'
world
'
)
hello.world!
>>>
print
hello(
'
zhangsan
'
)
hello.zhangsan!
不错吧!再回过头去想想怎样把返回婓波那契数列定义成一个函数。如下:
#
定义fibs函数,用于婓波那契数列
>>>
def
fibs(num):
result
= [0,1
]
for
i
in
range(num-2
):
result.append(result[
-2]+result[-1
])
return
result
#
直接调用fibs函数
>>> fibs(10
)
[0,
1, 1, 2, 3, 5, 8, 13, 21, 34
]
>>> fibs(15
)
[0,
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
局部变量
当函数定义生命变量的时候,函数内所生命的变理只在其函数内有效,与函数外具有相同名称的其他变量没有任何关系
#
局部变量
def
func(x):
print
'
x is
'
,x
x
=2
#
x=2只在func函数内其作用
print
'
Changed local x to
'
,x
x
= 50
func(x)
#
func函数并没有返回数据过来。
print
'
x is still
'
,x
#
输出
>>>
x
is
50
Changed local x to
2
x
is
still 50
global 语句
如果想把一个变量声名为 全局的,则可以使用 global 语句。
def
func():
global
x
print
'
x is
'
,x
x
= 2
print
'
Changed local x to
'
,x
x
=50
func()
print
'
Value of x is
'
,x
#
输出
x
is
50
Changed local x to
2
Value of x
is
2
global 语句被用来生命 x 是全局,因此在执行完 func 函数后, x 的值已经发生了改变,并且作用于整个程序,因此最后的输入结果为 2
默认参数
对于一些参数,我们希望它的一些参数是可选的,如果用户不想要为这些参数提供值的话,这些参数就使用默认值。
def
say(message,times=1
):
print
message*
times
say(
'
Hello
'
)
say(
'
World
'
,5
)
#
输出
>>>
Hello
WorldWorldWorldWorldWorld
定义的 say 函数的第两个参数就是可选的,默认为 times=1 ;也就是将两个参数相乘输出。
注意:只有在形参表末尾的那些参数可以有默认参数,如 def func(a=5,b) 是无效的。
关键参数
如果某个函数有许多参数,而我们只想指定其中的一部分,那么可以使用名字(关键字)而不是位置来给函数指定实参。 ---- 这被称作 关键参数
def
func(a,b=5,c=10
):
print
'
a is
'
,a,
'
and b is
'
,b,
'
and c is
'
,c
func(
3,7
)
func(
24,c=32
)
func(c
=23,a=14
)
#
输出
>>>
a
is
3
and
b
is
7
and
c
is
10
a
is
24
and
b
is
5
and
c
is
32
a
is
14
and
b
is
5
and
c
is
23
这样做,我就不必担心参数的顺序,使用函数变得更加简单。假设其它函数都有默认值,我们可以只给自己想要的参数赋值。
递归:
有用的递归函数 ... 等等,什么是无用的递归?先来看一个函数的定义:
def
recursion()
return
recursion()
显然,它什么也干不了,程序的执行不断申请内存,直接内存耗尽,程序崩溃。
接着,有用的递归函数包含以下几个部分:
- 当函数直接返回值时有基本实例(最小可能性问题)
- 递归实例,包括一个或者多个问题最小部分的递归调用。
下面通过递归函数来计算一个 n 的阶, n*(n-1)*(n-2)*....*1
def
f(n):
if
n == 1
:
return
1
else
:
return
n*f(n-1)

