函数的返回值
- 返回值就是函数执行以后返回的结果
- 通过return来指定函数的返回值
- return后面可以跟 任意对象 ,返回值甚至可以是一个函数
此时函数只在内部运算,如果函数没有print,就没有任何返回值。此处需要用到return:
- return的另一个性质:
1.无return
2.有return
对比之下,发现‘运算结束’的提示没有了,这就是return的另一个性质,return之后的所有运算不再执行。
文档字符串
- 在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明
def sun(a): #文档字符串,起到给函数解释的作用
"""
:param a:
:return:
"""
- help()是Python中内置函数,通过help()函数可以查询Python中函数的用法
- 另外,Ctrl键+鼠标左键点击函数名,也可进入函数解释;Ctrl键+B+鼠标放置在函数名上,亦可进入函数解释。
函数的作用域
- 作用域(scope)
- 作用域指的是变量生效的区域
- 在Python中一共有两种作用域
全局作用域
全局作用域在程序执行时创建,在程序执行结束时销毁
所有函数以外的区域都是全局作用域
在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
函数作用域
函数作用域在函数调用时创建,在调用结束时销毁
函数每调用一次就会产生一个新的函数作用域
在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问 - 以下运算中,a为全局作用域,函数内也可调用,b是局部作用域,函数内可调用,函数外不可调用:
命名空间
- 命名空间实际上就是一个字典,是一个专门用来存储变量的字典
- locals()用来获取当前作用域的命名空间
- 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间
- 返回值是一个字典
- 在局部作用域中调用globals()可以获取全局命名空间
递归函数
- 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题
- 递归式函数有2个条件
- 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
- 递归条件 可以将问题继续分解的条件
# 1-10的阶乘
# 10!=1*2*3*4*5*6*7*8*9*10
# 10!=10*9!
# 9!=9*8!
#...2!=2*1!
#1!=1
n = 10
for i in range(1,10): #1.遍历
n *=i
print(n)
def jc(n):
for i in range(1,n): #2.封装为函数
n *=i
return n
print(jc(10))
def jc1(n):
if n == 1: #基线条件
return 1 #结束返回
return n*jc1(n-1) #内部调用
print(jc1(10))
运行结果:
# 使用函数求前20个斐波那契数列斐波那契数列:1,1,2,3,5,8,13,21...即: 起始两项均为1,此后的项分别为前两项之和
# 基线条件
# 1+0=1
# 递归条件
# f20=f19+f18
# f19=f18+f17
# ...
# f2=f1+0=1
# f1=1
def fbnq(n):
if n<=2: #基线条件,因为需要返回2个1,所以第1个数和第2个数都为1
return 1
return fbnq(n-1)+fbnq(n-2) #递归条件
for i in range(1,21): #1-20的遍历
print(fbnq(i),end='\t')
运行结果:
# m的n次幂
# m1 = m
# m2 = m*m1
# ...
# m^n=m*m(n-1)
def ncm(m,n):
if n == 1: #基线条件
return m #返回结束
return m*ncm(m,n-1) #递归条件
print(ncm(10,2))
print(ncm(10,5))
运行结果:
#判断是否为回文字符串
# abcdefgfedcba
# bcdefgfedcb
# ...
# fgf
# g
# 基线条件 前后相等的情况下有最后有一个字符或0个字符
# 递归条件 首位和末位相同
def hwzf(n):
if len(n) <= 1:
return True
elif n[0] != n[-1]:
return False
return hwzf(n[1:-1])
print(hwzf('abcdeedcba'))
print(hwzf('123221'))
运行结果:
作业
- 用函数实现一个判断用户输入的年份是否是闰年的程序
1.能被400整除的年份
2.能被4整除,但是不能被100整除的年份
以上2种方法满足一种即为闰年
def leapyear(n):
while not n.isdigit() or int(n) <= 0:
n = input('输入有误,请重新输入:')
else:
if int(n) % 400 == 0:
print('此年份为闰年')
elif int(n) % 4 == 0:
print('此年份为闰年')
else:
print('此年份不是闰年')
year = input('请输入年份:')
leapyear(year)
运行结果:
def leapyear(n):
while not n.isdigit() or int(n) <= 0:
n = input('输入有误,请重新输入:')
else:
if int(n) % 400 == 0:
return n,'是闰年'
elif int(n) % 4 == 0:
return n,'是闰年'
else:
return n,'不是闰年'
year = input('请输入年份:')
leap = leapyear(year)
print(leap)
- 猴子吃桃问题(递归):
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
# d1 = n/2-1 第一天剩余总数除以2减一个
# d2 = d1/2-1 第二天剩余第一天剩余数除以2减一个
# d3 = d2/2-1
# ...
# d9 = d8/2-1=1 第九天剩余第八天剩余数除以2减一个 等于1
# dn = 1 问题其实是n天需要多少桃子
# 反过来想
# d1 = n
# d2 = (n+1)*2
# d3 = (d2+1)*2
# dn = ((dn-1)+1)*2
def peach(n):
if n == 1: #基线条件
return 1
return (peach(n-1)+1)*2 #递归条件
num = peach(10)
print(num)
运行结果: