函数
-
函数是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字,之后即可通过函数名执行。
-
定义函数:def 函数名(形式参数1,…,形式参数n):(换行缩进)语句块。
-
调用函数:函数名(实际参数1,…,实际参数n)。
-
缺省参数是指在定义形参时进行赋值,调用时如果未给出实参值,就是用缺省参数值。
-
有返回值的函数,用return进行返回最终值。函数遇到return语句就会终止当前函数的执行,return之后的语句都会被忽略。
-
局部变量只能在特定部分使用,全局变量整个程序都能使用。
-
如果局部变量与全局变量名称相同,在局部变量作用的范围内是局部变量在起作用。
-
如果想在函数内部对全局变量进行修改,需要使用global关键字。
-
函数优点:代码可重用,提高开发效率;代码更简洁,可读性好;编程更容易把握;封装和信息隐藏。
-
使用函数进行程序设计,被称为结构化程序设计方法。
-
函数练习:给定年和月份,获得当月第一天是周几(从1800年1月1号开始计算,当天是周三),代码如下:
def is_leap_year(year):
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
return True
else:
return False
def get_num_of_days_in_month(year, month):
if month in (1, 3, 5, 7, 8, 10, 12):
return 31
elif month in (4, 6, 9, 11):
return 30
elif is_leap_year(year):
return 29
else:
return 28
def get_total_num_of_day(year, month):
days = 0
for y in range(1800, year):
if is_leap_year(y):
days += 366
else:
days += 365
for m in range(1, month):
days += get_num_of_days_in_month(year, m)
return days
def get_start_day(year, month):
return (3 + get_total_num_of_day(year, month)) % 7
print(get_start_day(2033, 12))
递归函数
- 递归表现形式:在函数定义时有直接或者间接调用自身。
- 递归解决问题的基本思想:if问题足够简单则直接求解,else将问题分解成与原问题同构的一个或多个更小的问题逐个解决,将结果组合成为最终解返回。
- 汉诺塔问题解决思想:1、将前n-1个盘子通过c,从a移动到b;2、从a到c移动第n个盘子;3、将前n-1个盘子通过a,从b移动到c。定义函数hanoi(n,a,b,c)表示把a上的n个盘子移动到c上,其中可以遇到b,代码如下:
count = 0
def hanoi(n, a, b, c):
global count
if n == 1:
print('Move', n, 'from', a, 'to', c)
count += 1
else:
hanoi(n - 1, a, c, b)
print('Move', n, 'from', a, 'to', c)
count += 1
hanoi(n - 1, b, a, c)
print('')
hanoi(3, 'left', 'mid', 'right')
print('steps is', count)
- 递归方法的时间开销是比较大的,一般要比循环的方式慢得多。
- 递归优势:能使一个蕴含递归关系且结构复杂的程序简洁精炼,增加可读性;特别是在难于找到从边界到解的全过程的情况下,如果把问题推进一步,其结果仍维持原问题的关系。
- 递归劣势:嵌套层次深,函数调用开销大;重复计算。