0) 引论
函数是实现代码复用的主要途径之一,而且函数的使用也可以使得程序更加容易理解,更加规范化。程序很多时候并不是给计算机的,而是给人看的。这里总结一下Python中的函数的应用
1) 函数
首先Python中的函数的格式是怎样的。
def 函数名(形参):
函数体
下面是一个计算fibonacci数列的函数的定义:
def fibs(num):
result=[0,1]
for i in range(num-2):
result.append(result[-2]+result[-1])
return result
在函数中也可以加入一些说明文字,这里可以不需要利用‘#’注释,而直接在函数中加上字符串表示说明。
def fibs(num):
'calculate Fibonacci numbers'
result=[0,1]
for i in range(num-2):
result.append(result[-2]+result[-1])
return result
如果需要查看字符串说明,则可以用下面的命令
函数名.__doc__(注意是双下划线)
>>> fibs.__doc__
'calculate Fibonacci numbers'
2) 函数的形参与实参
形参和实参是什么意思就不介绍了,没多大意思,主要是看几个例子。
>>> def try_to_change(n):
n='Arsharm'
>>> m = 'Bob'
>>> try_to_change(m)
>>> m
'Bob'
这里我们可以看到n是形参,m是实参,当把m送入到函数中时,并不能改变实参的值。这是因为在这个过程中,它们有个作用域的改变,当将m送入到函数中时,相当于在一个新的作用域内重新创建了一个m。不同作用域中的相同的变量并不是一个变量,只不过它们的名字是一样的罢了。
那么如果我们一定要改变实参m的值呢? 这里可以用列表。相应的函数也要做一些改变
>>> def try_to_change(n):
n[0]='Arsharm'
>>> m=['Bob']
>>> try_to_change(m)
>>> m
['Arsharm']
可以看到把变量换成列表的形式就可以了。这个和C语言中的规则是一样的。变量和C语言中的变量的规则一样,列表对应着C语言中的数组和指针。
3) 不确定数目参数的处理
函数中参数的变化还是很多的,例如我们可以给函数提供一些默认的参数
>>> def hello(greeting='Hello',name='World'):
print(greeting+' '+name+'!')
>>> hello()
Hello World!
>>> hello('hey','Judd')
hey Judd!
>>> hello(greeting='hey')
hey World!
可以看出利用上面的方式提供参数,有若干个好处,一是能够提示参数的顺序以及使参数的意义更加明晰,二是可以在不输入参数的情况下,输出一个默认的参数,不至于出错。三是可以输入部分参数,默认部分参数,提高效率。
4) ‘*’和‘**’符号的作用
‘*’可以把所有的参数放到一个元组里
>>> def print_para(*para):
print(para)
>>> print_para(1,2,3)
(1, 2, 3)
>>> print_para('hello')
('hello',)
“**”可以把所有的参数放到一个字典里
>>> def print_para(**para):
print(para)
>>> print_para(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3}
既然是字典,那么必然要有键和值,如上所示。
“*”与“**”这两个符号可以用在不知道有几个参数的情况下,这种情况很常见。
>>> def print_para(*param,**para):
print(para)
print(param)
>>> print_para(1,2,3,x=1,y=4)
{'y': 4, 'x': 1}
(1, 2, 3)
同时“*”与“**”这两个符号还可以反转使用,即把元组和字典转换回来变为值
>>> para = (1,2)
>>> add(*para)
3
>>> para = {'y': 4, 'x': 1}
>>> def add(x=1,y=2):
return x+y
>>> add(**para)
5
5) 全局变量
全局变量比较简单,在变量前面加上global就可以了。但是一般还是不要用了吧,容易出错,而且关键是还不容易找到错误在哪里。
>>> m=15
>>> def try_to_change():
global m
m -= 3
>>> m
15
>>> try_to_change()
>>> m
12
6) 写一个二分查找的函数程序
sequence=[3,2,5,8,10,9,79]
def bin_search(sequence,number,upper,lower):
sequence.sort()
middle = (upper+lower)//2
if sequence[middle]==number:
print('Find it!')
elif upper-lower==0:
print('Not Find!')
elif sequence[middle]<number:
bin_search(sequence,number,upper,middle+1)
elif sequence[middle]>number:
bin_search(sequence,number,middle,lower)
bin_search(sequence,11,7,0)