Python基础之进一步了解函数

1. 函数的返回值

  • 返回值就是函数执行以后返回的结果
  • 通过return来指定函数的返回值
  • return后面可以跟任意对象,返回值甚至可以是一个函数
def fn(x):
    return x + 5
print('结果为', fn(5)) # 打印输出:结果为 10

2. 文档字符串

  • help()是Python中内置函数,通过help()函数可以查询Python中函数的用法
  • 在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明
def fn():
    '''
    这个函数式一个文档字符串的实例
    参数
        a:作用 类型 默认值......
        b:作用 类型 默认值......
        c:作用 类型 默认值......
    '''
    return 100
help(fn)

3. 函数的作用域

  • 作用域(scope)
  • 作用域指的是变量生效的区域
  • 在Python中一共有两种作用域
  • 全局作用域
    • 全局作用域在程序执行时创建,在程序执行结束时销毁
    • 所有函数以外的区域都是全局作用域
    • 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
a = 20
def fn():
    # 如果希望在函数内部修改全局变量,则使用global关键字,来声明变量
    # 声明在函数内部使用的变量a是全局变量,则此时在去修改a时,就是在修改全局变量
    global a
    a = 50
    print('函数内部:','a =',a)
fn()
print('函数外部:','a =',a)
  • 函数作用域
    • 函数作用域在函数调用时创建,在调用结束时销毁
    • 函数每调用一次就会产生一个新的函数作用域
    • 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
b = 50
def fn():
    # a定义在了函数的内部,所以它的作用域就是函数内部,函数外部是无法访问的
    a = 10
    print('函数内部:','a = ',a)
    print('函数内部:', 'b = ', b)
fn()
# print('函数外部:','a = ',a) #NameError: name 'a' is not defined
print('函数外部:','b = ',b)

def fn():
    a = 10
    print('函数内部:','a =',a)
fn()
print('函数外部','a = ',a)
a = 20
def fn2():
    a = 30
    def fn3():
        a = 40
        print('fn3中','a = ',a)
    fn3()
fn2()

4. 命名空间

  • 命名空间实际上就是一个字典,是一个专门用来存储变量的字典
  • locals()用来获取当前作用域的命名空间
  • 返回值是一个字典
  • 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间
def fn(a):
    b = 55
    # a = 55
    print(locals())
fn(50)

5. 递归函数

  • 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题
  • 递归式函数有2个条件
    1. 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
    2. 递归条件 可以将问题继续分解的条件
# 用递归的方式求任意数的阶乘
# 10!= 10 * 9!
# 9! = 9 * 8!
# 8! = 8 * 7!
# ....
# 1! = 1

def fn2(n):
    # 参数 n要求阶乘的数字
    # 1.基线条件
    if n == 1:
        # 1的阶乘就是1 直接返回结果
        return 1
    # 2.递归条件
    return n * fn2(n-1)
print(fn2(10))

思考

问题

汉诺塔游戏,现在有A,B,C三个圆柱,
要求:将A柱所有的圆盘放到C柱。在移动的过程中可以借助B柱。并且规定大圆盘不能放小圆盘上面,每次只能移动一个盘子。用递归的方式来解决汉诺塔问题。

思路

  1. 现在A柱子上从下到上叠放着n个从小到大的圆盘
  2. 大盘子不能在小盘子上
  3. 要把所有盘子移动到柱子C上
  4. 每次只能移动一次
  5. 现设A柱为初始位,B为过渡位,C位为目标位,s为圆盘数

解答

def fn(s, a, b, c):  
    # 基线条件
    if s == 1:
        print(a, '→', c)
    else:
        fn(s-1, a, c, b)
        print(a, '→', c)
    # 递归条件
        fn(s-1, b, a, c)  
fn(4, 'A', 'B', 'C')  ##圆盘数量为4

当圆盘数为4时
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值