第9讲 函数(中)

函数的返回值

  • 返回值就是函数执行以后返回的结果
  • 通过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. 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
    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. 用函数实现一个判断用户输入的年份是否是闰年的程序
    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)

在这里插入图片描述

  1. 猴子吃桃问题(递归):
    猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第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)

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值