函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
包括:内置函数 和 自定义函数。
定义:
def 函数名([参数]):
代码块
[return 表达式]
调用
函数名([参数])
根据是否有参数和是否有返回值,函数分为4种类型:
1、无参,无返回值
2、有参,无返回值
3、无参,有返回值
4、有参,有返回值
而参数可以分为以下五种:
1、可变和不可变参数
①不可变类型:
类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
②可变类型:
类似 c++ 的引用传递,如 列表,字典。如 fun(ls),则是将ls 真正的传过去,修改后fun外部的ls也会受影响。
2、必选参数
必选参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
3、默认参数
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
4、可变参数
①在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。参数组装成一个tutple。
②变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
5、关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查。
注意:如果要限制关键字参数的名字,就可以用命名关键字参数。
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。
但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数。
变量作用域
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域有:全局变量 和 局部变量。
1、局部变量
①局部变量,就是在函数内部定义的变量。
②不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响。
③局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用。
④如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量。
2、全局变量
①如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量。
②如果要再函数中修改全局变量,使用global声明。
小结:
在函数外边定义的变量叫做全局变量。
全局变量能够在所以的函数中进行访问。
如果在函数中修改全局变量,那么就需要使用global进行声明。
如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的。
递归函数
如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
满足递归的条件:
1、有循环的内容
2、有跳出的条件
3、递归默认是有递归深度要求的。
>>> import sys
>>> sys.getrecursionlimit()
1000
当递归深度超过这个值的时候,就会引发这样的一个异常。
解决的方式是手工设置递归调用深度,方式为
import sys
sys.setrecursionlimit(1000000) #例如这里设置为一百万
例子:
斐波那契数列 迭代求法
1 1 2 3 5 8 13 21 34 55
def fun(n):
n1=1
n2=1
n3=1
if n<1:
print('输入错误!')
return -1
while (n-2)>0:
n3=n1+n2
n1=n2
n2=n3
n-=1
return n3
num=int(input('请输入第几个数'))
a=fun(num)
print('第%d个数字为:%d'%(num,a))
总结:
使用递归要注意的有两点:
1、递归就是在过程或函数里面调用自身。
2、在使用递归时,必须有一个明确的递归结束条件,称为递归出口。
递归分为两个阶段:
1、递推:把复杂的问题的求解推到比原问题简单一些的问题的求解
2、回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.
迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B。
递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换。能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出,使用的时候要慎重。
匿名函数
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
一般,执行一次,或者作为参数传递。省的定义再调用。直接定义加调用。
lambda函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
注意:
Lambda函数能接收任何数量的参数但只能返回一个表达式的值。