第九讲 函数中

1. 函数的返回值

返回值就是函数执行返回的结果。
通过return来指定函数的返回值。
return后面可以跟任意对象,返回值可以是一个函数。

# 函数的返回值可以是任意类型的对象
# 当你不写return语句和只写一个return的时候,返回的是None
def fun(*args):
    res = 0
    for i in args:
        res += i
    return 12 
 # return 'abc' #函数的返回值可以是任意类型的对象
 # return [1, 2, 3] #函数的返回值可以是任意类型的对象
res = fun()
print(res)

123

def fun(*args):
    def fun1():
        print(111)
    return fun1
res = fun()
print(res())# ()调用内部 print(111),没有执行结果返回值为None
111
None

# return后的代码都不会执行,return一旦执行,函数自动结束
def fun2():
    for i in range(5):  # range(0, 5, 1)  左闭右开型
        if i == 3:
            # break   用来退出当前循环
            # continue  用来跳过当次循环
            return
        print(i)
    print('循环执行完毕')
fun2()
0
1
2

#fun 是函数名(函数对象) 打印fun就是打印函数对象的地址
#fun() 是调用函数 打印fun()就是在打印fun()的返回值

2.文档字符串

  • help()是python中内置函数,通过help函数可以查询python中函数的用法,定义函数时可以在函数内部编写文档字符串对函数做进一步注释说明。
def fun(a, b, c):
    """#键入三个双引号回车
    这是一个文档字符串的示例
    这个函数是做什么用的。。。。

    :param a: 作用  类型  默认值
    :param b: 作用  类型  默认值
    :param c: 作用  类型  默认值
    :return:  需不需要返回值
    """
    return 123

help(fun) # 通过help查阅文档字符串。


3.函数的作用域

  • 作用域(scope),指的是变量生交效的区域。
  • 在python中一共有两个作用域
  • 全局作用域在程序执行时创建,在程序执行结束时销毁。
  • 所有函数以外的区域都是全局作用域。
  • 全局作用域中定义的变量都 是全局变量,全局变量可以在程序的任意位置进行访问。
  • 函数的作用域在函数调用时创建,在调用结束时销毁。
  • 函数每调用一次就会产生一个新的函数作用域。
  • 在函数作用域定义的变量,都是局部变量,它只能在函数的内部被访问。
# 函数内部的变量只能在函数内部访问,不能再函数外部访问
b = 456

def fun():
    global a  # 声明a是全局变量
    a = 123
    print('函数内部 a = ', a)
    print('函数内部 b = ', b)


    def fun1():
        print('函数fun1内部 a = ', a)
        print('函数fun1内部 b = ', b)

    fun1()

fun()

4.函数的命名空间

  • 命名空间实际上就是⼀个字典,是⼀个专⻔⽤来存储变量的字典
  • locals()⽤来获取当前作⽤域的命名空间
    如果在全局作⽤域中调⽤locals()则获取全局命名空间,如果在函数作⽤域中
    调⽤locals()则获取函数命名空间
    返回值是⼀个字典
b = 456

def fun():
    global a  # 声明a是全局变量
    a = 123
    print('函数内部 a = ', a)
    print('函数内部 b = ', b)


    def fun1():
        print('函数fun1内部 a = ', a)
        print('函数fun1内部 b = ', b)

    fun1()

fun()

print('函数外部 a = ', a)
print('函数外部 b = ', b)
函数内部 a =  123
函数内部 b =  456
函数fun1内部 a =  123
函数fun1内部 b =  456
函数外部 a =  123


函数外# locals()用来获取当前作用域的命名空间,返回一个字典

a = 123
b = 456
c = 789
space = locals()
space['d'] = 100
print(space)

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000021B1A12C400>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/benson.gu/PycharmProjects/pythonProject3/pythonlearn1/pythonlearning records/function2lesson.py', '__cached__': None, 'a': 123, 'b': 456, 'c': 789, 'space': {...}, 'd': 100}

def fun():
    a = 1
    b = 2
    c = 3
    space = locals()
    # space = globals()
    print(space)
    
{'c': 3, 'b': 2, 'a': 1}

5.递归函数

  • 递归是解决问题的⼀种⽅式,它的整体思想,是将⼀个⼤问题分解为⼀个个
    的⼩问题,直到问题⽆法分解时,在去解决问题
    递归式函数有2个条件
  1. 基线条件 问题可以被分解为最⼩问题,当满⾜基线条件时,递归就不
    执⾏结束。
  2. 递归条件 可以将问题继续分解的条件公式。
求10的阶乘
1!= 1
2!= 2*1
3!= 3*2*1
10!= 10*9*8*7*6*5*4*3*2*1
print(10*9*8*7*6*5*4*3*2*1)

3628800

# for 循环
res = 1
for i in range(1, 11):
    res *= i

print(res)
3628800

# 普通函数

def fun(n):
    res = 1
    for i in range(1, n+1):
        res *= i
    return res
res = fun(10)
print(res)
3628800
递归函数的两个条件
1. 基线条件  问题可以被分解为最小的问题,当满足基线条件的时候,再去解决问题  (设定的最大递归深度)
2. 递归条件  将问题继续分解的条件#
10!            n!          fun(n)   是求n的阶乘的函数
10! = 10 * 9!  n*(n-1)!    n * fun(n-1)   求n-1的阶乘的函数
9! = 9 * 8!
.....
2! = 2*1!
1! = 1
n * fun(n-1) 递归条件

def fun(n):  # fun求n的阶乘
    # 基线条件
    if n == 1:
        return 1

    # 递归条件
    return n * fun(n-1)


res = fun(10)  # res = 10*fun(9)/10*9*fun(8)/
print(res)

3628800

#当10传递进函数时,会返回10*fn(9)
r接收了结果即r = 10*fn(9)
然后fn(9)继续执⾏返回 9*fn(8)
这个时候r= 10*9*fn(8)
再接着执⾏fn(8)返回8*fn(7)
r = 10*9*8*fn(7)
以此类推,最后当n=1时,返回 

# 求任意数的任意次幂运算
# n ** m   10 ** 5
# 10 * 10 ** 4
# 。。。。。
# 10 ** 1

def fun(n, m):   # fun是求n的m次幂的结果
    if m == 1:
        return n
    return n * fun(n, m-1)

res = fun(10, 5)
print(res)

# 定义一个函数, 用来检验一个字符串是不是一个回文字符串,如果是返回True,不是返货False
#abcdefghgfedcba

def fun1(s):# fun1 判断是否是回文字

    if len(s) < 2:# 如果字符长度小于2 
        return True
    elif s[0] != s[-1]: #判断最一个数值与最后数值是否相等,字符串切片
        return False
    return fun1(s[1:-1])#判断第二个数值与倒数第二数值是否相等,字符串切片


print(fun1('abcdefggfedcba'))

Homework

  1. ⽤函数实现⼀个判断⽤户输⼊的年份是否是闰年的程序
    1.能被400整除的年份
    2.能被4整除,但是不能被100整除的年份
    以上2种⽅法满⾜⼀种即为闰年
def leapyear(year):
    if year %400==0:
        print("this is a leap year")
    elif year%4==0 and year%100!=0:
        print("this is a leap year")
    else:
        print("this is not  a leap year")
year=int(input("plese input a year"))
leapyear(year)

  1. 猴⼦吃桃问题(递归):
    猴⼦第⼀天摘下若⼲个桃⼦,当即吃了⼀半,还不瘾,⼜多吃了⼀个。第
    ⼆天早上⼜将剩下的桃⼦吃掉⼀半,⼜多吃了⼀个。以后每天早上都吃了前
    ⼀天剩的⼀半零⼀个。到第10天早上想再吃时,⻅只剩下⼀个桃⼦了,求第
    ⼀天共摘了多少桃⼦?
def monkey(n):  # n天前一共摘了多少桃子
    if n == 1: #基线
        return 1
    return (monkey(n-1) + 1) * 2 # n的前一天为递归日,第n天一共摘的桃子是(n-1)天的的剩余数量+1个)*2


num = monkey(int(input('please input a num')))
print(num)

please input a num10
1534
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值