python函数

python内置函数文档:
(https://docs.python.org/3/library/functions.html)

1、定义函数使用def ,函数体写在缩进块中,函数的返回值用return语句返回,函数执行完毕也没有return语句时,自动return None

2、如果想定义一个什么事也不做的空函数,可以用pass语句
小栗子:def nop(): pass
3、pass可以用来作为占位符,如果没想好怎么写,可以先写一个pass函数,让代码运行起来

4、参数检查:
参数个数:调用函数时,python解释器会自动检查出来
参数类型:
eg:
def my_abs(x): if not isinstance(x, (int, float)): raise TypeError('bad operand type') if x >= 0: return x else: return -x
其中isinstance()可以实现对数据类型的检查
5、返回多个值
函数可以同时返回多个值,但实质上是一个tuple

6、函数的参数:
1>位置参数
2>默认参数:默认参数降低了函数调用的难度,而一旦需要更复杂的调用时,又可以传递更多的参数来实现。无论是简单调用还是复杂调用,函数只需要定义一个。
默认参数必须指向不变对象
3>可变参数:传入的参数个数是可变的,可变参数在函数调用时自动组装为一个tuple
在参数前面加一个
python函数_第1张图片
4>关键字参数:
允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict,可以扩展函数的功能
5>命名关键字参数:
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查,特殊分隔符
后面的参数被视为命名关键字参数。
6>参数组合:
参数定义的顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
python函数_第2张图片
通过一个tuple和dict也可调用

args = (1, 2, 3, 4)
kw = {‘d’: 99, ‘x’: ‘#’}
f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {‘d’: 99, ‘x’: ‘#’}

args = (1, 2, 3)
kw = {‘d’: 88, ‘x’: ‘#’}
f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {‘x’: ‘#’}

小结:
1、默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误
2、注:*args是可变参数,args接收的是一个tuple;**kw是关键字参数,kw接收的是一个dict
3、使用args和kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
4、定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符
,否则定义的将是位置参数。

7、递归函数:
函数在内部调用自身本身,这个函数就是递归函数
小栗子:计算阶乘n! = 1 x 2 x 3 x … x n
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
使用递归函数要注意防止栈溢出 ,函数调用是通过栈(stack)数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
那么如何解决栈溢出??
尾递归优化:在函数返回的时候,调用自身本身,return语句不能包含表达式 ----->递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
def fact(n):
return fact_iter(n, 1)

def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)
fact(5)对应的fact_iter(5, 1)的调用如下:

===> fact_iter(5, 1)
===> fact_iter(4, 5)
===> fact_iter(3, 20)
===> fact_iter(2, 60)
===> fact_iter(1, 120)
===> 120

经典例题:汉诺塔的移动:
move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法
def move(n,a,b,c):
if n == 1:
print(a, ‘–>’, c)
else:
move(n-1,a,c,b) #step1:借助c,将a的(n-1)个盘子移动到b
move(1,a,b,c) #step2:执行最大盘子移动到c
move(n-1,b,a,c) #step3:将盘子n-1从b移动到c

你可能感兴趣的:(python学习笔记)