python之函数介绍(返回值、文档字符串、作用域、命名空间、递归函数)

1.函数的返回值return

1.1 基本定义

返回值return是将结果返回到调用的地方,并把程序的控制权一起返回(函数执行以后返回的结果)
程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return。(函数执行到return后,就不再执行后面)

'''
函数执行以后返回的结果
可返回多个值,用逗号隔开多个返回值,并以元组返回
函数里面可以有多个return语句
'''
def fn(x,y):
    z = x + y
    return x,y,z
result = fn(1,2)
print(result)  # 结果:  (1, 2, 3)
def fn(x,y):
    if x == y:
        return x,y
    else:
        return ('x != y')
fn(1,2)

1.2 用法

'''
在函数中 return后面的代码都不会执行,return一旦执行函数自动结束
return 可以返回多个不同类型的对象,如函数
'''
#在函数中 return后面的代码都不会执行,return一旦执行函数自动结束
def fn(x):
    return x
    print('hello')
fn(1) # 无输出 hello
#return 可以返回多个不同类型的对象,如函数
def fn():
    a = 30
    def f1():
        print('hello')
    return f1
a = fn()
print(a)  # 返回的是函数对象<function fn.<locals>.f1 at 0x000001721D2A91F8>

def fn():
    a = 30
    def f1():
        print('hello')
    return f1()
a = fn()
print(a)  # 返回的是调用函数 hello None
'''
定义函数fn,fn是指向对象,输出内存地址,fn()是调用函数
函数中无return,则print的返回值为None
如果仅仅写一个return,或者不写return,则相当于return None
'''
def fn():
    print('hello world!')
    return

print(fn)  # 结果为: <function fn at 0x000001BDB4EF4168>
print(fn())  # 结果为:hello world! \n None

def fn():
    return
result = fn()
print(result)  # None

1.3 print()和return差别

return和print都可以返回值,为什么要用return?
return返回的值可以传递保存计算

'''
return返回的值可以传递保存计算
print不可以传递保存计算
'''
print(fn())  # 98 98 ok
def fn(x):
    if x<0 :
        print(x)
    else:
        print('值不小于0')
a = fn(-2)
b = fn(-1)
print(a+b)  # 报错: TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'

def fn(x):
    if x<0 :
        return x
    else:
        print('值不小于0')
a = fn(-2)
b = fn(-1)
print(a+b)  # -3

如果你的函数只需打印语句,不需要传递值的时候可以使用print代替return
但绝大多数应用中仍需使用return打印值。

2.文档字符串

help()是Python中内置函数,通过__doc__方法、help()函数可以查询Python中函数的⽤法
在定义函数时,可以在函数内部编写⽂档字符串,⽂档字符串就是对函数的说明

'''
文档字符串(DocStrings):
用于解释文档程序,帮助你的程序文档更加简单易懂。
在函数体的第一行使用一对三个单引号 或者一对三个双引号来定义文档字符串。
文档字符串使用惯例:它的首行简述函数功能,第二行空行,第三行为函数的具体描述。
可以使用 __doc__(注意双下划线)\help()函数调用函数中的文档字符串属性。
'''

def fn(n=5):
    '''
    函数功能: 求0到n之间的和

    参数:
    n:设定求和范围,int,默认值为5

    '''
    result = 0
    for i in range(0,n+1):
        result += i
    return result

fn()
print(fn.__doc__)  #     函数功能: 求0到n之间的和   参数:   n:设定求和范围,int,默认值为5
help(fn())
def fn(a:bool,b:int,c:str)->int:
    '''
    这个函数式一个文档字符串的实例
    参数
        a:作用 类型 默认值......
        b:作用 类型 默认值......
        c:作用 类型 默认值......

    '''
    return 100

help(fn)
'''
结果为:
fn(a: bool, b: int, c: str) -> int
    这个函数式一个文档字符串的实例
    参数
        a:作用 类型 默认值......
        b:作用 类型 默认值......
        c:作用 类型 默认值......
'''

3. 函数的作用域

3.1 定义

  • 作用域指的是变量生效的区域

3.2 全局作用域与函数作用域区别

  • 全局作用域在程序执行时创建,在程序执行结束时销毁。所有函数以外的区域都是全局作⽤域
  • 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
  • 函数作用域函数作用域在函数调⽤时创建,在调结用束时销毁
  • 函数每调用⼀次就会产生⼀个新的函数作用域
  • 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
'''
- 全局作用域在程序执行时创建,在程序执行结束时销毁。所有函数以外的区域都是全局作⽤域
- 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
- 函数作用域函数作用域在函数调⽤时创建,在调结用束时销毁
- 函数每调用⼀次就会产生⼀个新的函数作用域
- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
'''

a = 1 # a 是全局变量
def fn():
    b = 10
    print('函数外部的a:',a)   # 全局变量可以在程序的任意位置进行访问
    print('函数内部的b:', b)  # 局部变量,只能在函数内部被访问

print('函数外部的a:',a) # 函数外部的a是全局变量,可以在程序的任意位置进行访问
print('函数内部的b:'b) # 函数内部的b是局部变量,无法从外部访问 报错: SyntaxError: invalid syntax

3.3 局部变量声明为全局变量

'''
局部变量改为全局变量 ,通过global
'''

a = 10
def fn():
    a = 5
    print('函数内部的a',a)

fn()  # 函数内部的a 5
print('函数外部的a',a)  # 函数外部的a 10

a = 10
def fn():
   global a # 声明a为全局变量
   a = 15
   print('函数内部的a',a)

fn()  # 函数内部的a 15
print('函数外部的a',a)  # 函数外部的a 15

4.命名空间

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

a = 10
def fn():
    b = 10

s = locals()
print(s)
'''
输出结果为:
{'__name__': '__main__',
 '__doc__': '\n- 命名空间实际上就是⼀个字典,是⼀个专⻔⽤来存储变量的字典
 \n- locals()⽤来获取当前作⽤域的命名空间
 \n- 如果在全局作⽤域中调⽤locals()则获取全局命名空间,如果在函数作⽤域中
 \n调⽤locals()则获取函数命名空间\n-返回值是⼀个字典\n', 
 '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020D593D2308>, 
 '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 
 '__file__': 'F:/教材/python学习/python练习/25/demo4.py', 
 '__cached__': None, 'a': 10, 'fn': <function fn at 0x0000020D594A4168>, 's': {...}}

'''

a = 10
def fn():
    b = 10
    s = locals()
    print(s)

fn()  # 结果为 {'b': 10}

5.递归函数

5.1 基本介绍

'''
递归函数
# 从前有座山,山里有座庙,庙里有个老和尚在给一个小和尚讲故事,讲什么故事呢?
# 从前有座山,山里有座庙,庙里有个老和尚在给一个小和尚讲故事,讲什么故事呢?...
# 递归简单理解就是自己去引用自己
# 递归式函数,在函数中自己调用自己
# 无穷递归 类似于死循环
'''
def fn():
    fn()
fn()  # 报错: 陷入死循环  RecursionError: maximum recursion depth exceeded

5.2 用法

  • 递归是一个解决问题的方式
  • 它的整体思想,是将一个大的问题分解为一个一个的小问题,直到问题无法分解时,再去解决问题
  • 递归式的函数有2个条件
    1.基线条件:问题可以被分解为最小的问题,当满足基线条件时,递归就不在执行了
    2.递归条件:将问题可以继续分解的条件

5.2.1 阶乘实现


# 阶乘实现
# 4! = 4*3*2*1
# 3! = 3*2*1
# 2! = 2*1
# 1! = 1

def fn(n):
    # 1.基线条件
    if n == 1:
        return n
    # 2.递归条件
    if n > 1 :
        return n * fn(n-1)

result = fn(4)
print(result)

5.2.3 幂运算

# 使用递归函数来创建一个函数来为任意数字做任意幂运算
# 10**6 = 10 * 10**5
# 10**5(fn(5)) = 10 * 10**4(fn(4))
# 10**4(fn(4)) = 10 * 10**3(fn(3))
# 10**3(fn(3)) = 10 * 10**2(fn(2))
# 10**2(fn(2)) = 10 * 10**1(fn(1))
# 10**1(fn(1)) = 10

def fn(n):
    # 1.基线条件
    if n == 1:
        return 10**n
    else:
        return (10*fn(n-1))

result = fn(4)
print(result)  # 10000

5.2.4 判断回文符

# 定义一个函数用来检测一个任意字符是否是回文字符如果是返回True,如果不是返回False
# 回文字符串,字符串从前往后念和从后往前念是一样的
# 例如 abcba
# abcdefgfedcba
# 先检查第一个字符和在最后一个字符是否一致,如果不一致一定不是回文字符串
# 如果一致就要检查剩余的部分是不是回文字符串
# bcdefgfedcb 是不是回文
# cdefgfedc
# defgfed
# efgfe
# fgf
# g
# 重复s[0] == s[-1]检查
def fn(s):
    # 1.基线条件
    if len(s)<2:
        return True
    elif s[0] != s[-1]:
        return  False
    # 2.递归条件
    return fn(s[1:-1])  # -1时取到的是索引为-2的值

result = fn('bcdefgfedcb')
print(result)  # True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值