09函数-返回值、作用域、递归...

1. 函数的返回值

  • 返回值就是函数执行后返回的结果
  • 通过return来指定返回结果
  • return后面可以是任意类型的结果
#求任意个数的和
# def s(*b):
#     r = 0
#     for i in b:
#         r += i
#     print(r)
# s(1, 2, 3, 4, 5, 99) # 114
'''
return后面可以是任意类型的值,是什么函数就返回什么
'''
def fn():
    return 123
r=fn()
print(r)    # 123
print(fn)   # <function fn at 0x0000000002862598>
print(fn()) # 123

def fn1():
    print('执行fn1啦')
    def fn2():
        print('执行fn2啦')
    return fn2
    # return后的语句是永远不会执行的
    print('执行完return啦')
m = fn1()   # 执行fn1啦
print(m)    # <function fn1.<locals>.fn2 at 0x00000000028E2730>
m()         # 执行fn2啦
'''
break与return的区别
break是退出循环,函数中后面其他语句可以执行
return是退出函数,return后面函数中语句不能执行
return是用来结束函数的
'''
def fn3():
    for i in range(5):
        print(i)
        if i==3:
            # break
            # continue 仅跳过当次循环
            return
    print('循环执行完毕')
fn3()

# 求任意个数的和
def s(*b):
    r = 0
    for i in b:
        r += i
    # print(r)
    return r
n= s(1, 2, 3, 4, 5, 99) # 114
print(n+2)      # 116

# fn函数对象  fn()调用函数
def fn():
    # return 123
    print('python')
print(fn)       # <function fn at 0x00000000028A28C8>
print(fn())
# 结果是:
# python  # 打印语句执行
# None   # 没有返回值,是空
fn()            # python  直接调用函数,执行打印语句

2. 文档字符串

  • help()是python的内置函数
  • 通过help(函数对象)可以查询定义的函数对象的用法
  • 定义函数时在函数内部编写文档字符串,文档字符串是对函数的说明
'''
help()可以查询python中函数的用法
语法:help(函数对象)
help(print)
'''
# help(print)
def fn(a:int, b:str, c:bool)->int:
    '''
    这是一个文档字符串案例
    :param a:
    :param b:
    :param c:
    :return:
    '''
    return 123
help(fn)

3. 函数的作用域(scope)

  • 作用域指变量生效的区域
  • 分为全局作用域和函数作用域
  • 全局作用域在程序执行时创建,在程序执行结束时销毁
    。所有函数以外的区域都是全局作用域
    。所有在全局作用域定义的变量都是全局变量,可以从程序的任意位置访问调用全局变量
  • 函数作用域在函数调用时创建,在函数调用结束时销毁
    。函数每调用一次,产生一个新的函数作用域
    。在函数作用域中定义的变量是局部变量,只能在函数内部被访问
# 作用域scope
# 作用域指变量生效的区域
# 全局作用域b
# 函数作用域a
# b=20
# def fn():
#     a=2
#     print('函数内部:', 'a =', a)
#     print('函数内部:', 'b =', b)
#
# fn()
# # print('函数外部:', 'a =', a)  # NameError: name 'a' is not defined
# print('函数外部:', 'b =', b)

# 从函数内部可以访问外部的数据,从外部却不能访问里面的数据
def fn1():
    a=10
    def fn2():
        b=40
        print('fn2中的a', a)
        print('fn2中的b', b)
    fn2()
    print('fn1中的a', a)
    # print('fn1中的b', b)  # NameError: name 'b' is not defined
fn1()
# 在函数内部修改全局变量
a = 20
def fn3():
    global a
    a = 3
    print('函数内部:', 'a =', a)    # 函数内部: a = 3

fn3()

print('函数外部:', 'a =', a)    # 函数外部: a = 3

4. 命名空间

  • 命名空间实际上是一个专门存储变量的字典
  • locals()用来获取当前作用域的命名空间
  • 返回值是字典
# 命名空间是一个专门用来存储变量的字典
# locals()是用来获取当前作用域的命名空间,返回值时字典

a=20
b=30
scope=locals()

print(scope)
print(scope['a'])
print(scope['b'])
# 可以通过向字典添加k-v值向全局的命名空间增值,但不建议使用
# 而且在函数中这种添加方式会失败
scope['c']=99
print(scope['c'])
print(c)    # 99  添加成功
def fn():
    a = 33
    b = 22
    scope = locals()
    # scope['d'] = 55
    # print(scope)
    # print(scope['a'])
    # print(scope['b'])
    # print(scope['d'])
    # print(d)    # NameError: name 'd' is not defined

    # globals() 获取全局变量
    global_scope=globals()
    print(global_scope)     # ...'a': 20, 'b': 30, 'scope': {...}, 'c': 99, 'fn': <function fn at 0x0000000002892730>

fn()

5. 递归函数

  • 递归是将一个大问题分解为一个一个小问题,直到无法再分解为止
  • 递归函数有两个条件
    。基线——大问题可以被分解为的最小问题,满足基线条件时,递归不再执行
    。递归条件——将问题继续分解的条件(此处就像剥洋葱,直到无法再剥)
# 求10!,10的阶乘
# 1!=1
# 2!=2*1
# 3!=3*2*1
# .....
# 10!=10*9*8*7*6*5*4*3*2*1
# r = 10
# for i in range(1,10):
#     r*=i
# print(r)
# print(10*9*8*7*6*5*4*3*2*1)

# 定义一个函数来求任意数num的阶乘num!

# def factorial_num(num):
#     '''
#
#     :param num: int,
#     :return: int
#     '''
#     for i in range(1,num):
#         num*=i
#     return num
#
# r = factorial_num(10)
# print(r)

# 递归是一种解决问题的方式
# 简单来说递归就是自己引用自己,递归函数就是在函数中调用自己
# 递归的两个条件:
#   1.基线条件——问题可被分解为的最小条件,当满足次条件时递归不再执行
#   2.递归条件——将问题继续分解的条件
# 如果缺少递归中的条件基线,则为无穷递归,类似死循环
# def factorial_some():
#     基线条件
#         return
#     递归条件
#     factorial_some()
# factorial_some()

# 用递归的解决方案来实现任意数的阶乘
# 10!=10*9!
# 9!=9*8!
# ...
# 1!=1
def factorial_num(num):

    # 基线条件——最小为1阶乘为1(这里我们没有考虑0!=1)
    if num == 1:
        return 1

    # 递归条件——继续分解条件
    return num*factorial_num(num-1)

r = factorial_num(5)
print(r)
  • 递归练习:
# 练习一 定义一个函数:计算任意数的任意次幂
# caculate_num(num,p)

# 循环的方式:
# def caculate_num(num, p):
#     res = 1
#     for i in range(1, p+1):
#         res *= num
#
#     return res
# r = caculate_num(1, 4)
# print(r)

# 递归的方式:
# 参数 num 的 p 次幂
# def caculate_num(num, p):
#
#     # 条件一:基线条件 分解的最小事件
#     if p == 1:
#         return num
#
#     # 条件二:递归条件 继续分解的条件
#     return num*caculate_num(num, p-1)
# res = caculate_num(3, 5)
# print(res)

# 练习二 : 创建函数检查一个字符串是否是回文,是返回True,不是返回False
# check_Palindrome(s)
# 把字符串存入列表中处理 获取字符串长度len()

# 循环方式:

# s = list(input('输入字符串:'))
# m = len(s)
# print(m)
# for i in range(m):
#
#     if s[i] == s[m-i-1]:
#         if i == m//2:
#             print(s[i])
#             print('True')
#     else:
#         print('False')
#         break

# 循环放入函数中
# s = list(input('输入字符串:'))
# def check_palindrome(s):
#     m = len(s)
#     for i in range(m):
#
#         if s[i] == s[m - i - 1]:
#             if i == m // 2:
#                 print(s[i])
#                 return 'True'
#         else:
#             return 'False'
# print(check_palindrome(s))

# 递归方式:
# 是不是考虑类似剥洋葱的思想,剥掉一层还一层
# 比较 abcdefgfedcba 第一个和最后一个是否一致
# 比较 bcdefgfedcb 第一个和最后一个是否一致
# 比较 cdefgfedc 第一个和最后一个是否一致
# 比较 defgfed 第一个和最后一个是否一致
# 比较 efgfe 第一个和最后一个是否一致
# ...
# 比较 fgf 第一个和最后一个是否一致
# g 字符串长度小于2时,一定为回文
# 字符串第一个和最后一个不一致时,一定不是回文
s = list(input('输入字符串:'))
def check_palindrome(s):
    print(s[1:-1])
    # 条件一:基线
    if len(s)<2:
        return True
    elif s[0]!=s[-1]:
        return False
    # 条件二:循环
    return check_palindrome(s[1:-1])    # 相当于s1=s[1:-1],s2=s1[1:-1]...

print(check_palindrome(s))

# 递归另一种写法
def another_check(s):
    if len(s) < 2:
        return True
    return s[0] == s[-1] and another_check(s[1:-1])

print(another_check(s))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的体育馆管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此体育馆管理系统利用当下成熟完善的SpringBoot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、场地管理、场地订单管理、字典管理、赛事管理、赛事收藏管理、赛事评价管理、赛事订单管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。体育馆管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:体育馆管理系统;SpringBoot框架;Mysql;自动化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值