Python全栈工程师(递归函数、闭包)

简介: ParisGabriel          每天坚持手写  一天一篇  决定坚持几年 全栈工程师                         Python人工智能从入门到精通 函数式编程:   是指用一系列函数解决问题   每...
ParisGabriel
 
         每天坚持手写  一天一篇  决定坚持几年 全栈工程师
 
   

                      Python人工智能从入门到精通

 

函数式编程:
  是指用一系列函数解决问题
  每一个函数完成细小的功能,一系列函数的任意组合可以完成
  大问题
  函数仅接受输入并产生输入,不包含任何影响输出的内部 状态
函数的可重用性
  如果一个函数的输入参数一定,则返回结果必须一定
  的函数称为可重用函数

  可重入和不可重入就是访问除局部变量以外的变量
函数式编程要求:
  def 创建函数最好不要访问局部作用域以外的变量,这样可以保证
  结果的唯一性(可重入性)
高阶函数 high order function:
  满足下列条件之一的就是高阶函数
  1.函数接受一个或多个函数作用参数传入
  1.函数返回一个函数
内建高阶函数:
  map,filter,sorted

map(func, *iterables):
  用函数和对可迭代对象中的每一个元素作为参数计算出新的可迭代对象,
  当最短的一个可迭代对象不再提供数据时此可迭代对象生成结束

filter(function, iterable):
  筛选可迭代对象iterable中的数据,返回一个可迭代器对象,此可迭代对象
  将对iterable进行筛选.函数function 将对iterable中的每个元素进行求值,
  返回False则将此数据丢弃,返回True,则保留此数据
sorted(iterable, key=None, reverse=False):
  将原可迭代对象的数据进行排序,生成排序后的列表iterable 可迭代对象
  key 函数是用来提供一个值,这个值将作为排序的依据reverse 标志用来设
  置是否降序排序
返回可迭代对象:
  range()
  map()
  filter()
  reverse()
递归函数;
  函数直接调用或间接的调用自身
  直接调用自己:
    def f():
        f()
  间接调用自己:
    def fa():
        fb()
    def fb():
        fa()

 

  递归一定要控制递归的层数,当符合条件时要终止递归
  几乎所有的递归都能用while循环来代替
递归特点:
  优点:
    递归吧问题简单化,让思路更清晰,代码更简洁
  缺点:
    递归因系统环境影响大,当递归深时,可能会得到不可预知的结果
递推阶段:
  从原问题出发,按递归公式递推从未知到已知,最终打到递归的终止条件
  回归阶段
  按递归终止条件求出结果,逆向逐步代入递归公式
  回归到原问题求解
闭包 closure:
  闭包是引用了此函数外部的变量函数
  说明:
    本质上,闭包是将内部嵌套和函数外部的执行环境绑定在一起的对象
  条件:
    1.必须有一个内嵌函数
    2.内嵌函数必须引用外部函数中的变量
    3.处部函数返回值必须是内嵌函数

 

 

 

 

函数式编程就是把一些小功能封装成函数 提高代码的可重用性 可读性 可维护性 而且可以重复变量 

 

可重用函数就是自身内部完成一系列的功能不与外界干扰的函数

为了保证函数的可重用性  虽然可以用外界变量 但是尽量不要用

高阶函数

就是形参和返回值只要有一个是函数的函数

 

递归: 

这个要好好说一下了 说实话 对于初中没念完的我学的全部都是高数  真的是难

但那有什么办法呢 只能是慢慢来 不过我要非常感谢一个小姐姐就是刘笑笑( 0^0 不知道你看不看 嘻嘻)  

不厌其烦的给我讲了好几个小时我才绕过来  我个人感觉这个东西挺绕的

 

就拿5的阶乘来说吧 5 * 4 * 3 * 2 * 1

递归就是从5的阶乘  五的阶乘不知道 是个未知数  但是5到1是知道的54321嘛对吧

1的阶乘也是知道的等于1 2

5的阶乘就等于5 * 5 - 1 * 5-2 * 5-3 * 5 - 4

用一个递归函数来实现就是 

def fact(n):              第一次执行函数  n = 5                     |       第二次执行这里n就变成了4                | 第三次执行这里n就变成了3

  if n == 1:                 n != 1    不执行

     return 1                                                          |       n != 1    不执行                        | n != 1    不执行

  return n * fact(n - 1)   执行这一步 其实这里有个else  

                             省略了 可以省略  这里n = 5                |       条件不成立 继续执行fact函数 让函数的形参| 条件不成立 继续执行fact函数 让函数的形参

                             5 * 函数fact(n - 1) 这里代表上面if

                             条件不成立 继续执行fact函数 让函数的形参  |       继续减1后继续执行                       | 继续减1后继续执行

                             减1后继续执行

print(fact(5))

 

 

直到 n = 1的时候   n == 1  那么条件成立

条件成立 然后开始return(这里是关键 return是什么呢? 

return就是让函数结束执行并且返回一个值  说白了就是让函数变成值 变成数据  

之前的函数直接消失不再执行 并且返回的值 只会返回到调用它的函数的位置(函数变量))

当一次return 的时候 fact(n)此时n是等于1的 对吧 此时n == 1 条件成立 返回1 结束释放 函数fact(1)(最底层函数释放)

返回1 就是等于 fact(n - 1) (这里这个函数直接变成了值:1) 上面的fact(n)n = 1 的时候 1哪来的  就是 fact(n - 1)来的

return n * fact(n - 1) 这里的n 是相等的 那么 2 * 1 然后利用这里的return继续返回 就等于 fact(n)这个函数 这时n = 2 (但是这个函数的返回值是2 * 1)

fact(n)这个函数释放 返回到调用他的函数 return n * fact(n - 1)这里  2怎么来的  n - 1 = 2  同样的道理 这里的两个n都等于3

3 * fact(3 - 1)但是呢这里的 fact(3 - 1)函数已经被释放了并return返回值  那么fact(3 - 1)等同于 2 * 1 这里就是 3 * 2 *1 然后利用这里的return返回

然后这样依次类推 回到最开始调用的地方 并return返回产生结果  得到的就是  5 * 4 * 3 * 2 * 1  系统会自动计算  这就是我们想要的结果了

 

其实递归是两个过程  就是先递后归 先下楼在上楼 把所有的东西都推理出来以后再依次归递运算  就去楼下搬东西 每层都有  你要先去1楼看一下

有多少东西 能不能一次搬完  路过的几层你不可能带到一楼再带上去吧  

其实这些东西 用for也好还是while也好都是分分钟的事  但是递归的方式逻辑和思维更加清晰 (噗 反正我觉得不怎么好但是感觉比较好修改和维护)

还有就是递归一定要设置返回条件 不然就是死循环  (成语接龙:为所欲为,为所欲为,为所欲为,为你妈逼,逼上梁山, 山穷水尽, 尽力而为, 为所欲为, 为所欲为...... )

计算机能接受的最大递归层次也就1000左右 取决于你的电脑配置 

 

其实闭包就比较简单了 就是 函数内部变量引用你外部的变量 

这里的外部指的是两个函数之间 当外函数释放时候 内函数的变量不被释放 保持原绑定值

 

额 这个NB 吹的有点长了.........还有好多题没做  又要加班到一天了  每天要敲16小时以上的键盘  0_0 

 

 

练习:

  names = ['Tom', 'Jerry', 'Spike', 'Tyke']

  排序的依据为字符串的反序:

           'moT'   yrreJ    ekipS    ekyT

  结果:

    ['Spike', 'Tyke', 'Tom', 'Jerry']

答案:

names = ['Tom', 'Jerry', 'Spike', 'Tyke']
def name(s):
    return s[::-1] 
print(sorted(names, key=name))

 

# 练习:

#   1. 已知五位朋友在一起

#     第五位朋友比第四位朋友大2岁

#     第四位朋友比第三位朋友大2岁

#     第三位朋友比第二位朋友大2岁

#     第二位朋友比第一位朋友大2岁

#     第一位朋友说它10岁

#     写程序打印出第五位朋友 和第三位朋友 的年龄

 

答案:

def myage(n):
    if n == 1:
        return 10
    return 2 + myage(n - 1)
print(myage(5))
print(myage(3))

 

 

 


4 实现带有界面的学生信息管理系统
程序启动时先弹出操作菜单:
+-------------------------+
| 1) 添加学生信息 |
| 2) 显示学生信息 |
| 3) 删除学生信息 |
| 4) 修改学生成绩 |
| q) 退出 |
+-------------------------+
请选择: 1
要求 :
每个选择都要有一个函数来实现

# 创建输出函数:student完成    临时菜单封装
def student():
    for a in range(1, 8, 2):
        x = "*" * a
        print(x.center(9), x.center(10), x.center(10), x.center(9))
    else:
        for y in range(1, 4 + 1):
            c = "*"
            if 4 >= 10:
                c = "***"
            print(c.center(9), c.center(10), c.center(10), c.center(9))
    print("^^^^^^^^^^^^^ System menu ^^^^^^^^^^^^^")
    print("---------------------------------------")
    print("    1):    Add Student information     ")
    print("---------------------------------------")
    print("    2):    print Student information   ")
    print("---------------------------------------")
    print("    3):    delete Student information  ")
    print("---------------------------------------")
    print("    4):    revamp Student information  ")
    print("---------------------------------------")
    print("     please input number 1~4 select    ")
    print("---------------------------------------")
    print("        input :(Q)Exit procedure       ")
    print("---------------------------------------")
# 创建输出函数:perform完成


# 创建输入函数:input_student开始     封装信息输入


def input_student():
    L = []
    print("--------Student information enty--------")
    while True:
        name = input("please input name:")
        if name == "":
            q = input("operation succeed! return y / n :")
            if q == "y":
                break
            else:
                input_student()
        age = input("please input age:")
        score = input("please input score:")
        d = {}
        d = {"name": name, "age": age, "score": score}
        print("+---------------+----------+----------+")
        name = d["name"].center(15)
        age = d["age"].center(10)
        score = d["score"].center(10)
        print('''|%s|%s|%s|''' % (name, age, score))
        print("+---------------+----------+----------+")
        print("-----Not input Enter be no revamp!-----")
        L.append(d)
    return L
# 创建输入函数:input_student完成

# 创建输出函数:output_student开始   封装列表打印


def output_student(lst):
    print("-------Student information sheet-------")
    print("+---------------+----------+----------+")
    print("|      Name     |    Age   |   Score  |")
    print("+---------------+----------+----------+")
    for d in lst:
        name = d["name"].center(15)
        age = d["age"].center(10)
        score = d["score"].center(10)
        print('''|%s|%s|%s|''' % (name, age, score))
        print("+---------------+----------+----------+")
    q = input("operation succeed! return y / n :")
    if q == "y":
        pass
    else:
        output_student()
# 创建输出函数:output_student完成

# 创建输出函数:delete_student开始  封装删除信息


def delete_student(lst):
    name = input("please input name delete:")
    for x in lst:
        if x["name"] == name:
            print("+---------------+----------+----------+")
            name = x["name"].center(15)
            age = x["age"].center(10)
            score = x["score"].center(10)
            print('''|%s|%s|%s|''' % (name, age, score))
            print("+---------------+----------+----------+")
            delet = input("whether delete (y:yes/y:no):")
            if delet == "y":
                lst.remove(x)
    q = input("operation succeed! return y / n :")
    if q == "y":
        pass
    else:
        delete_student()
# 创建输出函数:delete_student完成

# 创建输出函数:revamp_student()开始   封装更改信息


def revamp_student(lst):
    name = input("please input name revamp:")
    for x in lst:
        if x["name"] == name:
            print("+---------------+----------+----------+")
            name = x["name"].center(15)
            age = x["age"].center(10)
            score = x["score"].center(10)
            print('''|%s|%s|%s|''' % (name, age, score))
            print("+---------------+----------+----------+")
            print("-----not input Enter be no revamp!-----")
            rage = input("please input age revamp:")
            rscore = input("please input score revamp:")
            if rage != "":
                x["age"] = rage
            if rscore != "":
                x["score"] = rscore
            print("+---------------+----------+----------+")
            name = x["name"].center(15)
            age = x["age"].center(10)
            score = x["score"].center(10)
            print('''|%s|%s|%s|''' % (name, age, score))
            print("+---------------+----------+----------+")
            print("-----------revamp perform!------------")
        else:
            print("None Error")
    q = input("operation succeed! return y / n :")
    if q == "y":
        pass
    else:
        revamp_student()
# 创建输出函数:revamp_student()完成

# 创建输出函数:System_menu()开始    临时封装系统


def System_menu():
    L = [] 
    while True:
        student()
        select = input("            please input:")
        if select == '1':
            L += input_student()
        elif select == '2':
            output_student(L)
        elif select == '3':
            delete_student(L)
        elif select == '4':
            revamp_student(L)
        elif select == 'q':
            break
# 创建输出函数:System_menu()完成    临时封装系统


# 运行
System_menu()

 

 

 

相关文章
|
1天前
|
开发者 Python
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
|
1天前
|
缓存 算法 数据处理
Python入门:9.递归函数和高阶函数
在 Python 编程中,函数是核心组成部分之一。递归函数和高阶函数是 Python 中两个非常重要的特性。递归函数帮助我们以更直观的方式处理重复性问题,而高阶函数通过函数作为参数或返回值,为代码增添了极大的灵活性和优雅性。无论是实现复杂的算法还是处理数据流,这些工具都在开发者的工具箱中扮演着重要角色。本文将从概念入手,逐步带你掌握递归函数、匿名函数(lambda)以及高阶函数的核心要领和应用技巧。
Python入门:9.递归函数和高阶函数
|
3月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
155 67
|
1月前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
32 3
|
1月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
45 2
|
1月前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
16 0
|
2月前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
64 18
|
2月前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
87 8
|
2月前
|
Python
Python中的函数
Python中的函数
62 8
|
2月前
|
Python
闭包(Closure)是**Python中的一种高级特性
闭包(Closure)是**Python中的一种高级特性
61 8

热门文章

最新文章

推荐镜像

更多