python基础学习(九):函数(中)

在这里插入图片描述

1. 函数的返回值

  • 返回值就是函数执行以后返回的结果
  • 通过return来指定函数的返回值
def fn():
    return 123
r = fn()
print(r)
123
  • return后面可以跟任意对象,甚至是一个函数
def fn():
    def fn2():
        print('hahaha')
    return fn2
r = fn()
print(r)
r()
<function fn.<locals>.fn2 at 0x102a5a670>
hahaha
  • 函数里面仅仅写return,或者不写,返回值都为None
def fn3():
    a = 123
    # return
r = fn3()
print(r)
None
  • 在函数中,return后面的代码都不会执行,return一旦执行函数自动结束
def fn4():
    print('hahaha')
    return
    print('123')
r = fn4()
print(r)
hahaha
None
def fn5():
    for i in range(5):
        if i == 3:
            return
        print(i)
    print('循环执行完毕!!!')
fn5()
0
1
2

2. 文档字符串

  • help()是Python内置函数,通过help()函数可以查询Python中函数的用法
    • 语法:help(函数对象)
help(print)
  • 文档字符串是一个重要工具,用于解释文档程序,帮助你的程序文档更加简单易懂;我们可以在函数体的第一行使用一对三个单引号 ‘’’ 或者一对三个双引号 “”" 来定义文档字符串
  • 在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明
def fn(a,b,c):
    '''
    这是一个文档字符串的案例

    参数的作用
    :param a: 作用... 类型... 默认值...
    :param b: 作用... 类型... 默认值...
    :param c: 作用... 类型... 默认值...
    :return:
    '''
    return 123

help(fn)

3. 函数的作用域

  • 含义:作用域(spoce)指的是变量生效的区域
  • 在Python中一共有两种作用域:
  • 全局作用域:
    • 全局作用域在程序执行时创建,在程序执行结束时销毁
    • 所有函数以外的区域都是全局作用域
    • 在全局作用域中定义的变量——全局变量,全局变量可以在程序的任意位置进行访问
b = 20
def fn():
    a = 10
    print('函数内部:','a =',a)
    print('函数内部:','b =',b)

fn()
print('函数外部:','b =',b) 
函数内部: a = 10
函数内部: b = 20
函数外部: b = 20
  • 函数作用域:
    • 函数作用域在函数调用时创建,在调用结束后销毁
    • 函数每调用一次就会产生一个新的函数作用域
    • 在函数作用域中定义的变量——局部变量,它只能在函数内部被访问
def fn():
    # a定义在函数内部,它的作用域就是函数内部,函数外部访问不到
    a = 10
    print('函数内部:','a =',a)

fn() # 函数内部: a = 10
print('函数外部:','a =',a) # NameError: name 'a' is not defined
  • 如果需要在函数内部修改全局变量——global
a = 20
def fn4():
    global a
    a = 50
    print('函数内部:','a =',a)

fn4()
print('函数外部:','a =',a) 
函数内部: a = 50
函数外部: a = 50

4. 命名空间

  • 含义:Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个字典,专门用来存储变量的字典,它的键就是变量名,它的值就是那些变量的值
    • 每个函数都有自己的命名空间——局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量
    • 每个模块都有自己的命名空间——全局命名空间,记录模块的变量,包括函数、类、其他导入的模块、模块级的变量和常量
  • locals()用来获取当前作用域的命名空间,返回值是一个字典
    • 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用则获取函数命名空间
# 全局命名空间
a = 20
b = 30
scope = locals()
print(scope)
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x1021813a0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/y/Desktop/python_test/命名空间.py', '__cached__': None, 'a': 20, 'b': 30, 'scope': {...}}
# 局部命名空间
def fn():
    a = 20
    scope = locals()
    print(scope)

fn()
{'a': 20}
# globals() 可以在任意位置获取全局命名空间
a = 'abc'
b = 80
def fn2():
    global_scope = globals()  
    print(global_scope)

fn2()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10ed123a0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/y/Desktop/python_test/命名空间.py', '__cached__': None, 'a': 'abc', 'b': 80, 'fn': <function fn at 0x10e8a1160>}

5. 递归函数

  • 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个小问题,直到问题无法分解时,再去解决问题
  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数
  • 递归函数有两个条件:
    • 基线条件:问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
    • 递归条件:可以将问题继续分解的条件
# 用递归的解决方案来实现任意数的阶乘
def fn2(n):
    # 参数n,要求阶乘的数字
    # 基线条件:判断n为1的时候,不递归
    if n == 1:
        # 1的阶乘就是它本身
        return n
    # 递归条件
    return n * fn2(n - 1)
print(fn2(10))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值