欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python核心编程09-----函数返回值,作用域

程序员文章站 2022-03-15 09:25:09
...

目录

1.函数的返回值

2.文档字符串

3.函数的作用域 

4.命名空间

5.递归函数


1.函数的返回值

  • 就是返回函数执行的结果
  • 通过return来指定函数的返回值
  • return后面可以跟任意的对象,甚至可以是一个函数,return后的函数不用加()
  • 在函数中return后的代码都不会执行,一旦return执行,函数自动结束
def fn():
    print('aaaa')
    return
    print('bbbb')
print(fn())
输出:
aaaa
None
  • break和return的区别
def fn():
    for i in range(5):
        if i == 3:
            break   #用来退出当前循环
        print(i)
    print('循环执行完毕')
fn() 输出:0  1  2  循环执行完毕

def fn():
    for i in range(5):
        if i == 3:
            return  #函数结束
        print(i)
    print('循环执行完毕')
fn() 输出:0  1  2
continue用来跳过档次循环
  • fn是函数对象   打印fn就是在打印函数对象
  • fn()调用函数   打印fn()就是在打印fn()的返回值

2.文档字符串

  • help()内置函数   可以查询Python中函数的用法
  • 语法:help(函数对象) 如:help(print)
  • 在定义函数的时候,可以在函数内部编写文档字符串,文档字符串就是函数的说明
  • 当我们编写了文档字符串是,就可以通过help()函数来查看函数的说明Python核心编程09-----函数返回值,作用域

3.函数的作用域 

  • 作用域(scope)指的是变量生效的区域
  • 在python当中有两种作用域
  • 全局作用域:
    • 在程序执行的时候创建,执行结束的时候销毁
    • 所有函数以外的区域都认为是全局作用域
    • 在全局作用域当中定义的变量,都是全局变量
    • 全局变量可以在程序的任意位置进行访问
  • 函数作用域:
    • 在函数调用的时候创建,函数结束时销毁
    • 函数每调用一次就会产生一个新的函数作用域
    • 在函数作用域中定义的变量,都是局部变量,他只能在函数内部被访问
b = 20
def fn():
    a = 10
    print('函数内部:a =',a) 输出:函数内部:a = 10
    print('函数内部:b =',b) 输出:函数内部:b = 20

fn()
print('函数外部:a =',a)     输出:报错:NameError: name 'a' is not defined
print('函数外部:b =',b)     输出:函数外部:b = 20
因为a是函数内变量,属于局部变量,所以在函数外部无法被访问,所以报错
  • 内部可以调用外部变量  如:
def fn2():
    a = 30
    def fn3():
        print('fn3中:a =',a)
    fn3()
fn2() fn3中:a = 30
  • global()关键字 :在局部修改全局的变量
a = 456
def fn3():
    #在函数内部修改全局变量,需要使用global关键字,来声明局部变量
    global a #声明在函数内部使用的a是全局变量,此时修改a就是在修改全局的a
    a = 123
    print('函数内部a = ',a)
fn3()
print('函数外部a = ',a)

4.命名空间

  • 命名空间就是一个字典
  • 是一个专门用来保存变量的字典
  • locals()用来获取当前作用域的命名空间
  • 返回值是一个字典
在函数外部调用locals()
a = 123
b = 456
scope = locals()
print(a)               输出:123
print(scope['a'])      输出:123
#向scope里面添加了一个key-value
scope['c'] = 789
print(c)               输出:789
  • locals()在函数内部调用
def fn():
    a = 1
    scope = locals()
    print(scope) 输出:{'a': 1}
fn()
  •  globals()函数可以用来获取全局的命名空间
a = 123
b = 456
def fn():
    a = 1
    scope = locals()
    print(scope)
    global_scope = globals()
    print(global_scope)
输出:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001C989116550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/py_Project/基础/09/命名空间.py', '__cached__': None, 'a': 123, 'b': 456, 'fn': <function fn at 0x000001C9890CC378>}

fn()

5.递归函数

  • 递归式的函数
  • 从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事,讲的是:从前有座山,山里................
  • 递归简单理解就是自己调用自己
  • 递归式的函数,在函数中自己调用自己
  • 1.基线条件
    • 问题可以被分解为最小的问题,当满足基线条件时,递归就不再执行
  • 2.递归条件
    • 将问题继续分解的条件
  • 用递归的思想解决任意数的阶乘
def fn(n):
    #1.基线条件
    if n==1:
        return 1
    #2.递归条件
    return  n*fn(n-1)
print(fn(10)) 输出:3628800
  • 例子1
#定义一个函数,为任意数字做任意的幂运算
#3**4 = 3*3
#3**4 = 3*3**3
#3**3 = 3*3**2
#3**2 = 3*3**1
#3**1 = 3
def fn(x,y):
    #参数x代表任意数字,y代表任意幂次方

    #1.基线条件
    if y==1:
        return x
    #2.递归条件
    return x*fn(x,y-1)
print(fn(2,3)) 输出:8
  • 例子2
#定义一个函数,用来检测任意的一个字符串是否是回文字符串,如果是返回True,不是返回False
#回文字符串  字符串从前往后念和从后往前念是一样的 例如 abcba
#abcdefgfedcba
#如果第一个字符和最后一个字符不一致,则该字符串一定不是回文字符串
#abcdefgfedcba
# bcdefgfedcb
# cdefgfedc
# 。。。。。
# g
def fn2(s):
    # 参数s标识要检查的字符串
    # 1.基线条件
    if len(s) < 2:
        return True
    elif s[0] != s[-1]:
        return False
    # 2.递归条件
    return fn2(s[1:-1])
print(fn2('ababcbaba')) 输出True