函数
函数就是代码抽象的方式.
调用函数:
- 想要调用函数需要函数的名称和参数.
在调用函数的时候传入的形参数量要和函数的参数数量一致. - 函数名称是也是一个对象,所以可以把函数赋值给一个变量.
定义函数:
- 使用def来定义函数.def后依次写出函数名,括号,括号中的参数,冒号(:).
def myfun(x): //colon behind is the statement block
if x>=0: //function body
return x //return x
else:
return -x
然后在缩进块中编写函数体(function body),函数返回值用return语句.
return语句具有跳出功能,当函数执行到return语句的时候就会跳出直接输出结果.
如果没有return语句,函数也会返回一个空值(None).
2. 定义空函数
如果想要定义什么事情不做的空函数,可以用pass函数.
def nofun():
pass //do nothing, when meet me jump out the function
pass语句代表什么都不做,可以让代码运行起来,在以后进行函数补充.
1. 参数检查
a)参数个数:Python Interpreter 可以对传入函数的参数个数进行检查.
b)参数类型:Python Interpreter 无法检查参数类型,所以我们要在函数中设置错误和异常处理.
2. 返回多个值
其实函数返回的还是单个值,只不过返回的是一个没有括号的tuple,然后和需要返回的变量进行一一对应.
函数的参数(Function’s parameter)
默认参数
有一个求x的平方
def power(x):
return x * x
如果我们现在想算x的立方怎么办?可以定义一个power(3) 但是如果计算的在幂更高呢?
def power(x, n=2):
inix = 1;
while n>0:
inix = inix * x
n = n - 1
return inix
默认参数可以简化函数调用.但是要注意以下几点
-
必选参数在前,默认参数在后,否则interpreter会报错.
如何设置默认参数:
- 当函数有多个参数的时候,把变化大的参数放前面,变化小的参数放后面.变化小的参数就可以作为默认参数.
- Excemple
def enroll(name,gender,age=6,city='shanghai'):
print 'name:', name
print 'gender:',gender
print 'age:', age
print 'city:', city
应用上面的默认参数,学生在注册的时候就不用提供城市和年龄,只提供name和gender两个参数就ok,除非与默认参数不一致.
注意:
- 对多个默认参数进行调用时要遵循参数顺序提供参数,当不按操作顺序提供默认参数时需要提供参数名称,比如city='shanghai'
.
- 定义默认参数,默认参数一定要指向不变对象!比如string,None,tuple.
可变参数
可变参数就是传入的参数个数是可变的,0~N任意个数.比如计算a[^2]
def chpat(numbers): //numbers is a list or tuple
sum = 0
for x in numbers:
sum = sum + x * x
return sum
在调用chpat函数时要先组装list或tuple,再传入函数.
>>>chpat([1,2,3])
>>>14
如果利用可变参数,在传入的时候可以这样:
>>>chpat(1,2,3)
不过我们要把公式做点小改变,让他可以接受可变参数.
def chpat(*numbers): #numbers is a list or tuple
sum = 0
for x in numbers:
sum = sum + x * x
return sum
在*numbers
前面添加了一个*
就可以接受可变参数.在函数内部number
接受的是一个tuple,tuple在这里可以视为一个参数,所以函数代码完全不变.
def chpat(*numbers):
print numbers
>>> chpat(1,2,3)
(1, 2, 3)
>>> chpat((1,2,3))
((1, 2, 3),)
>>> chpat([1,2,3])
([1, 2, 3],)
通过上面的函数可以看到chpat的输出结果将传入的list和tuple输出后面都加了一个逗号这说明list和tuple被视为单一的一个参数.
如果已经有一个list或tuple如何调用一个可变参数呢?
num = [1,2,3]
chpat(*num)
>>>14
直接在数组变量前面加*
号就可以了.
关键字参数
可变参数允许你传入0~n个参数,并自动打包成tuple.与可变参数类似,关键字参数将允许你传入0~n个带参数名的参数,并自动打包成dic.
def keyword(name,age,**anykey):
print 'name:',name
print 'age:',age
print 'anykey:',anykey
>>> keyword('song',20,renger='male')
name: song
age: 20
anykey: {'renger': 'male'}
>>> keyword('song',20,'male')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: keyword() takes exactly 2 arguments (3 given) #allow only input 2 arguments
>>>
通过上面的输出结果我们可以看到关键字变量的传入必须使用关键名='变量名'
的格式.
参数组合
将必选参数,默认参数,可变参数,关键字参数进行组合.组合的顺序为:必选>默认>可变>关键字.
递归函数
一个函数在内部调用函数自身就称为递归函数
递归:函数得下一步计算需要上一步的计算结果就叫做递归.
递归特点:
- 存在递归的终止条件
- 总结递归公式
- 通过上述两个条转化为代码执行.
比如阶乘n!
f(0)=f(1)=1;是递归终止条件
n*(n-1)! n>0 是递归公式
下面详细解释下递归
递归分为递推型递归和探索型递归 发现递归
- -对解决方案进行分析若发现总是需要反复执行相同的操作且后一步操作需要前一步操作的结果
递归的精髓- 只考虑当前一步,剩下的让下一步去做吧.
- 对大多数问题而言,当它的规模缩小至”特殊情况”时,都可以非常轻易的得出问题的解,因此我们不讨论”特殊情况”,只详细讨论递归关系的确定
- 寻找递归关系,最低标准是他能使问题的规模变小,且变小后的问题与原问题在本质上是一样的.当找到递归关系后,我们的递归函数只需要处理特殊情况与递归关系,不需要处理其他的信息—-至于下一步的事情,就让下一步去做吧.
#阶乘n!
def fac(n):
if n==1:
return 1
return n * fac(n-1)