Python编程 深入浅出递归

一、初识递归

递归(Recursion)是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。

递归为我们提供了一种对复杂问题的优雅解决方案,精妙的递归算法常会出奇简单,令人赞叹。

给定一个列表,返回所有数的和,列表中数字的个数不定,需要一个循环和一个累加变量来迭代求和,那现在既不能用 for 循坏,也不能用 while 循环,我们可以用递归的方法来解决问题!

思路:

  • 数列求和问题首先具备了基本结束条件:当列表长度为 1 的时候,直接输出所包含的唯一数。
  • 数列求和处理的数据对象是一个列表,而基本结束条件是长度为 1 的列表,那递归算法就要改变列表并向长度为 1 的状态演进,代码实现时具体做法是将列表长度减少1。
  • 调用自身:实际上可以理解为"问题分解成了规模更小的相同问题",在数列求和算法中就是"更短数列的求和问题"。

递归实现数列求和如下:

def sum_n(lst):
     return lst[0] if len(lst) <=1 else lst[0] + sum_n(lst[1:])

print(sum_n([1, 3, 5, 7, 9]))

递归算法三定律:

  • 递归算法必须要有结束条件(最小规模问题的直接解决)
  • 递归算法必须能改变状态向基本结束条件演进(减小问题规模)
  • 递归算法必须调用自身(解决减小了规模的相同问题)

递归调用的实现:

  • 当一个函数被调用的时候,系统会把调用时的现场数据压入到系统调用栈。每次调用,压入栈的现场数据称为栈帧,当函数返回时,要从调用栈的栈顶取得返回地址,恢复现场,弹出栈帧,按地址返回。
  • 在调试递归算法程序的时候经常会碰到这样的错误:RecursionError: maximum recursion depth exceeded in comparison,原因递归的层数太多,但系统调用栈容量是有限的。

爆栈是非常危险的操作,在实际开发写递归算法时应尽力避免。Python内置的 sys 模块可以获取和调整最大递归深度,操作如下:

二、进制转换

  • 十进制有十个不同符号:dec_str=“0123456789”,比 10 小的整数,转换成十进制,直接查表就可以得到:dec_str[n],把比 10 大的整数,拆成一系列比十小的整数,逐个查表,比如七百六十九,拆成七、六、九,查表就可以得到769。
  • 所以,在递归三定律里,我们找到了 “基本结束条件”,就是小于 10 的整数拆解整数的过程就是向“基本结束条件”演进的过程”。
  • 我们用整数除,和求余数两个计算来将整数一步步拆开,除以 “进制基base”(//base) 对 “进制基” 求余数(%base)

递归实现如下:

def dec_conversion_n(n, base):
    str_list = "0123456789ABCDEF"
    if n < base:
        return str_list[n]  # 到了最小规模  查表
    else:   # 减小规模  调用自身
        return dec_conversion_n(n // base, base) + str_list[n % base]

print(dec_conversion_n(233, 8))

结果如下:


还可以写得更优雅一些:

def dec_conversion_n(n, base):
    str_list = "0123456789ABCDEF"
    return str_list[n] if n < base else dec_conversion_n(n // base, base) + str_list[n % base]

print(dec_conversion_n(233, 8))

余数总小于"进制基base",整数商小于进制基时,达到递归结束条件,可直接进行查表转换,整数商成为 “更小规模” 问题,通过递归调用自身解决。

三、递归可视化

通过可视化来展现递归调用。

import turtle

t = turtle.Turtle()
def draw_spiral(line_len):
    if line_len > 0:
        t.forward(line_len)
        t.right(90)
        draw_spiral(line_len - 5)

draw_spiral(160)
turtle.done()


用分形树更形象地展现递归调用。分形是在不同尺度上都具有相似性的事物,分形树特征:子图结构与自身相似,很容易想到递归。

python中的 turtle 的使用,可以很方便地画出分形树,画分形树的思想也可以用到二叉树的遍历中,实现如下:

def draw_tree(branch_len):
    if branch_len > 5:
        t.forward(branch_len)
        t.right(20)
        draw_tree(branch_len - 15)
        t.left(40)
        draw_tree(branch_len - 15)
        t.right(20)
        t.backward(branch_len)


t = turtle.Turtle()
t.left(90)
t.penup()
t.backward(100)
t.pendown()
t.pencolor('red')
t.pensize(2)
draw_tree(75)
t.hideturtle()
turtle.done()

效果如下:


把树分解为三个部分:树干、左边的小树、右边的小树分解后,正好符合递归的定义:对自身的调用。

谢尔宾斯基三角形(英语:Sierpinski triangle)也是一种分形,由波兰数学家谢尔宾斯基在 1915 年提出,它是自相似集的例子。根据自相似特性,谢尔宾斯基三角形是由 3 个尺寸减半的谢尔宾斯基三角形按照品字形拼叠而成,由于我们无法真正做出谢尔宾斯基三角形(degree趋于无穷),只能做 degree 有限的近似图形。

在 degree 有限的情况下,degree=n的三角形,是由 3 个 degree=n-1 的三角形,按照品字形拼叠而成。同时,这 3 个 degree=n-1 的三角形边长均为degree=n的三角形的一半(规模减小)。当degree=0,则就是一个等边三角形,这是递归基本结束条件。作图如下:

# -*- coding: UTF-8 -*-
"""
@Author  :叶庭云
@公众号  :修炼Python
@CSDN    :https://yetingyun.blog.csdn.net/
"""
import turtle


def drawTriangle(points, color, my_turtle):   # 绘制等边三角形
    my_turtle.fillcolor(color)
    my_turtle.up()
    my_turtle.goto(points[0][0], points[0][1])
    my_turtle.down()
    my_turtle.begin_fill()
    my_turtle.goto(points[1][0], points[1][1])
    my_turtle.goto(points[2][0], points[2][1])
    my_turtle.goto(points[0][0], points[0][1])
    my_turtle.end_fill()


def getMid(p1, p2):       # 取两个点的中心
    return (p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2


def sierpinski(points, degree, my_turtle):
    colormap = ['blue', 'red', 'green', 'white',
                'yellow', 'violet', 'orange']
    drawTriangle(points, colormap[degree], my_turtle)
    if degree > 0:
        sierpinski([points[0],
                    getMid(points[0], points[1]),
                    getMid(points[0], points[2])],
                   degree - 1, my_turtle)
        sierpinski([points[1],
                    getMid(points[0], points[1]),
                    getMid(points[1], points[2])],
                   degree - 1, my_turtle)
        sierpinski([points[2],
                    getMid(points[2], points[1]),
                    getMid(points[0], points[2])],
                   degree - 1, my_turtle)


def main():
    myTurtle = turtle.Turtle()
    myWin = turtle.Screen()
    myPoints = [[-100, -50], [0, 100], [100, -50]]   # 外轮廓三个顶点
    sierpinski(myPoints, 4, myTurtle)   # 画degree=5的三角形
    myWin.exitonclick()


main()


效果如下:

四、汉诺塔问题求解

问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着 64 片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘,只能移动在最顶端的圆盘。有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。恩,当然这个传说并不可信,如今汉诺塔更多的是作为一个玩具存在。

推荐一个可以在线玩汉诺塔小游戏的网站:
http://www.htmleaf.com/Demo/201508272485.html

移 3 个盘子演示如下:


思路:

  • 将盘片塔从开始柱,经由中间柱,移动到目标柱:首先将上层N-1个盘片的盘片塔,从开始柱,经由目标柱,移动到中间柱;然后将第N个(最大的)盘片,从开始柱,移动到目标柱;
  • 最后将放置在中间柱的 N-1 个盘片的盘片塔,经由开始柱,移动到目标柱。基本结束条件,也就是最小规模问题变为:1个盘片的移动问题

Python代码递归实现如下:

def move_tower(height, start_pole, mid_pole, target_pole):
    if height >= 1:
        # 开始柱  目标柱  中间柱
        move_tower(height - 1, start_pole, target_pole, mid_pole)
        # 记录移动
        move_disk(height, start_pole, target_pole)
        # 中间柱  开始柱  目标柱
        move_tower(height - 1, mid_pole, start_pole, target_pole)

def move_disk(disk, start_pole, target_pole):
    print(f"将 {disk} 号盘子从 {start_pole}号柱 移到 {target_pole}号柱")

move_tower(3, "1", "2", "3")    # 2^n - 1次
print("Complete!")

结果如下:


和动图里我们玩游戏的操作步骤一致!

五、总结

递归是解决某些具有自相似性的复杂问题的有效技术

递归算法三定律:

  • 递归算法必须要有结束条件(最小规模问题的直接解决)
  • 递归算法必须能改变状态向基本结束条件演进(减小问题规模)
  • 递归算法必须调用自身(解决减小了规模的相同问题)

注意:

  • 某些情况下,递归可以代替迭代循环,递归算法通常能够跟问题的表达自然契合。
  • 递归不总是最合适的算法,有时候递归算法会引发巨量的重复计算,"记忆化/函数值缓存"可以通过附加存储空间记录中间计算结果来有效减少重复计算。
  • 如果一个问题最优解包括规模更小相同问题的最优解,这时我们可以用动态规划来解决。
打赏
文章很值,打赏犒劳作者一下
<p>尹成Python27天从入门到实战项目!全课665节讲解详细易操作,助力实战项目能力成长,轻松、简单、易懂!</p> <p><img src="https://img-bss.csdnimg.cn/202012050840001652.png" alt="" /></p> <p>day1  python入门与学习方法<br />精确思维与用到才能记忆深刻<br />课程简介<br />课前介绍<br />计算机简介与硬盘概念<br />内存作用<br />计算机小结<br />编程语言简介<br />操作系统简介<br />python版本简介<br />切换python版本修改环境变量<br />交互式编程两种风格<br />python3代码保存必须是utf-8<br />使用IDE了解注释<br />段落打印三引号<br />注释多行三个单引号<br />python代码要严格对齐<br />中文输入字符错误<br />简单数学表达式<br />代码风格<br />三种错误风格<br />系统执行指令<br />运行结果乱码<br />交互式编程绘图<br />绘制线段与圆形改变颜色<br />绘制奥运五环<br />小结<br />习题<br /><br />day1plus python  常量变量数据类型 <br />常量与变量区别<br />标识符<br />关键字<br />输入输出<br />id求地址type求类型<br />python变量是地址赋值可以改变类型<br />python主要数据类型<br />复数数据类型<br />自适应变长整数int<br />del作用<br />连续赋值<br />交互对称赋值<br />字符串转化与输入输出编程wmv<br />多行拆分<br />多行归并成一行<br />规范用的常量<br />算术运算符<br />科学计数法与数字越界<br />优先级结合性<br />赋值运算符<br />数据类型转换<br />四舍五入<br />数据提取<br />时间处理<br />作业<br /><br />day2   python字符串与绘图<br />复习<br />变量None<br />变量参与运算没有赋值的情况不会改变<br />绘制立方体<br />绘制五角星<br />时间计算强化<br />实现贷款计算<br />连续输入多个<br />字符串加法与绘图<br />实现显示线段长度<br />数据函数使用<br />快速查阅函数帮助<br />字符串三种风格<br />字符与编号<br />中文字符编号问题<br />字符编号用途<br />统一码<br />转义字符意义<br />转义字符用于字符串<br />print高级用法<br />字符串加法与转换<br />字符串小结<br />python中所有的数据都是对象<br />字符串格式化<br />了解进制<br />图形绘制<br />重点作业以及学习认知方法<br /><br />day3   python运算符与ifelse逻辑语句<br />第一天上午回顾<br />第二天下午回顾1<br />第二天回顾<br />2.7习题解答<br />2.11习题解答<br />2.26作业<br />KaliLinux简介<br />3.4实现五边形面积计算<br />3.7随机字符生成<br />3.8实数误差与四舍五入<br />3.18解答与特殊字符<br />if简介与空格的作用<br />if处理的是逻辑表达式<br />关系运算符针对数值<br />字符串的关系运算符<br />if自动转化Bool类型<br />随机数<br />if缺点<br />且运算符<br />或运算符<br />取反运算符<br />短路效应<br />身份运算符<br />运算符优先级结合性概览<br />pass语句<br />潜台词翻译系统<br />None用途<br />指令翻译系统<br />嵌套<br />嵌套与elif对比以及注意细节<br />习题解答<br />绘图<br />作业与重点<br /><br />day4  语音合成与逻辑循环<br />回顾<br />语音合成<br />简单理解while<br />控制次数<br />WhileElse<br />WhileElse实战<br />whileFloat<br />回顾与ifelse表达式<br />赌博概率<br />分类设计方法-一元二次方程<br />嵌套求有序3个数<br />闰年计算<br />矩形区域<br />随机数ifelse<br />回文数判断<br />10进制转化16进制<br />16进制转十进制<br />暴力穷举<br />无限循环指令<br />循环同步异步<br />黑科技读写内存<br />读写内存无限循环监测<br />重点与作业<br /><br />day5  复杂逻辑循环<br />while与whileelse编程风格<br />循环控制图形绘制<br />while猜数字<br />输入输出重定向<br />while习题分析<br />可以退出的命令系统<br />for初步简介<br />跑分<br />流程结合<br />for循环<br />小结<br />forfor嵌套<br />forfor分析<br />break中断循环<br />contiune结束本次循环<br />双层循环的break与continue分析<br />break与contiue小结<br />一闪一闪亮晶晶<br />循环控制大小与位置<br />对角线<br />绘制圆形<br />口顺时针运动<br />循环等价<br />作业与小结<br /><br />day6  函数实战<br />回顾.<br />算学费<br />输入数据求最大<br />精确划分思维解决最大次大<br />交换数据<br />实现按行显示<br />围棋棋盘绘制<br />国际象棋绘制<br />为什么要用函数<br />函数的四种类型<br />函数的一般形式<br />必须用函数的理由-哥德巴赫<br />函数的本质就是地址<br />函数变量意义<br />函数变量用途<br />装饰器设计模式包含模式<br />函数概念<br />None函数<br />默认参数与返回值作为参数<br />名称参数与位置参数<br />参数副本机制<br />副本练习<br />多个返回值<br />全局变量与局部变量<br />函数内部引用全局变量<br />函数可以嵌套<br />nolocal处理函数嵌套变量<br />函数nonlocal<br />nonlocal<br />总结<br />开房数据查询<br /><br />day7      函数实战与常用数据结构<br />函数的两种类型<br />函数的本质再分析<br />函数地址切换切换功能<br />ifelse配合地址筛选<br />函数收费<br />函数调用过程<br />函数基本小结<br />return小结<br />位置参数与默认参数<br />混合参数填充<br />混合填充错误情况<br />lambda匿名函数<br />可变长函数<br />字符串常识普及<br />字符串特点<br />字符串不可以修改内部字符<br />list列表<br />list用途<br />tuple简介<br />集合运算<br />字典概念<br />in与notin运算符<br />构造表达式<br />转换数据类型<br />系统小结<br />拓展查询<br />作业<br /><br />day8   字符串实战<br />简单回顾<br />eval与exec简介<br />字符串的简单规范<br />字符串的截取<br />字符串赋值规范<br />字符串转义字符<br />字符串常见运算符<br />字符串格式化<br />字符串格式化强化<br />字符串编码简介<br />dir与help查看str<br />字符串函数第一个大写以及字符串居中显示打印金字塔<br />count统计字符串出现个数<br />字符串编码注意事项<br />解码失败<br />判断字符串以什么为结束<br />tab键转换<br />find函数与rfind函数<br /><br />day9   字符串高级<br />简单回顾..<br />eval与exec简介<br />字符串的简单规范<br />字符串的截取<br />字符串赋值规范<br />字符串转义字符<br />字符串常见运算符<br />字符串格式化<br />字符串格式化强化<br />字符串编码简介<br />dir与help查看str<br />字符串函数第一个大写以及字符串居中显示打印金字塔<br />count统计字符串出现个数<br />字符串编码注意事项<br />解码失败<br />判断字符串以什么为结束<br />tab键转换<br />find函数与rfind函数<br />index函数与rindex函数<br />字符串判断<br />字符串间隔求长度以及左右填充<br />字符串大小写<br />取出最大最小字符<br />替换<br />去除空格<br />简单切割<br />换行切割<br />判断开头<br />大小写切换以及填充0<br />翻译表.<br />字符串模板<br />小结<br /><br />day10  字符串集合与语音识别实战<br />回顾l<br />set初始化风格<br />set增加与去重<br />set删除元素<br />遍历set<br />类型转化<br />set无法操作单个元素的赋值<br />set常见方法<br />set常见运算符<br />set关系运算符判断包含<br />set集合判断<br />frozenset<br />字典的基本定义循环<br />字典判断在不在实现插入与更新<br />字典删除<br />字典详解<br />字典与set无法嵌套<br />迭代器<br />列表生成式<br />生成器<br />生成器节省内存用于循环<br />生成器yield作用<br />生成器简介<br />测试<br />游戏简介<br />游戏初级修改<br />键盘模拟<br />语音控制游戏实现<br />鼠标模拟<br />代码规范函数简化重用<br />列表与元组小结<br />作业<br /><br />day11  阶段综合练习<br />昨日回顾.<br />堆栈<br />函数模块引用<br />系统模块引用与错误<br />列表生成式的若干方法<br />生成矩阵<br />str与repr<br />python把输入输出设备当作文件处理<br />写入中文写入英文<br />读取中文读取英文<br />读取错误<br />写入错误处理<br />文件缓存区<br />文件读取若干种方式<br />for循环按行读取数据<br />文件指针seektell<br />数据结构与文件的交互<br />数据查询并保存结果<br />数据查询<br />小结与数据<br /><br />day12downwithoutdata  数据处理开发<br />大数据指令<br />数据清洗的概念<br />初级数据清洗<br />密码排序<br />次数统计<br />QQ密码概率分布<br />QQ号码分类器.<br />开房数据清洗..<br />区域划分<br />省份划分<br />年龄<br />月份划分<br />日划分<br /><br />day12up  数据实战<br />简单回顾12<br />系统默认编码中文编码常见错误<br />字符串切割<br />抓取邮箱<br />抓取用户名与密码<br />排序密码文件<br />统计次数排序.<br />统计文件密码次数<br />密码次数排序<br /><br />day13withoutdata  数据分类与list深入<br />地区分类详解<br />字典分类器<br />数据简单归并<br />数据如何切割<br />数据加密<br />数据解密<br />指令执行判断<br />文件夹编程小结<br />列表归并-删除<br />列表归并-下标<br />小结与作业<br /><br />day14down   面向对象编程与深浅拷贝<br />面向对象与过程的差异<br />self用途<br />动态绑定增加属性方法<br />重载运算符的概念<br />有名对象与匿名对象<br />重载运算符的返回值<br />重载运算符多个类型<br />类的拷贝是浅复制<br />深浅拷贝<br />函数调用参数副本原理<br />函数调用可以改变list的元素不可以改变list指向<br />对象当作参数的细节<br />私有变量<br />私有变量用于设计权限<br />私有方法用于设计权限<br />私有变量本质<br />用类的方式读取文件行数<br />密码次数归并<br />数据处理方法简介<br />今日小结<br />作业wmv<br /><br />day14up  暴力穷举与类<br />回顾....<br />排列<br />组合<br />暴力生成穷举密码<br />密码破解必破生成器<br />密码破解小结<br />为啥使用类-代码重用<br />类的一般形式<br />详解self<br />构造函数与析构函数<br />构造函数初始化类的属性<br />最简洁的UI<br />设定窗体的位置以及大小<br />类的实际用途<br /><br />day15down  面向对象数据搜索实战<br />输入处理<br />文本编辑器<br />表格数据<br />树状显示<br />数据搜索可视化第一步实现查询窗体<br />数据搜索可视化第二步实现搜索数据<br />数据搜索可视化第三步实现显示窗体<br />数据可视化第四步显示与搜索串联<br />数据可视化终结<br />作业<br />小结<br /><br />day15up  面向对象设计与图像界面上<br />设计一个类<br />发短信<br />类的方法设计一下短信<br />发送邮件<br />类的设计-设计发邮件<br />类的多文件引用<br />腾讯营销类的设计<br />消息循环<br />消息回掉函数机制<br />lambda按下按钮<br />标签显示文本<br />文本输入框<br />list<br />combobox选择列表<br /><br />day16up  面向对象与图形界面开发下<br />设计一个类<br />发短信<br />类的方法设计一下短信<br />发送邮件<br />类的设计-设计发邮件<br />类的多文件引用<br />腾讯营销类的设计<br />消息循环<br />消息回掉函数机制<br />lambda按下按钮<br />标签显示文本<br />文本输入框<br />list<br />combobox选择列表<br /><br />day17  面向对象继承实战<br />昨日小结.,.<br />继承的概念<br />多继承的概念<br />多继承的覆盖<br />私有变量不可以被继承<br />Object类<br />类的常见属性<br />super解决父类重复初始化<br />isinstance<br />多态<br />静态方法<br />类方法<br />数据工具1类的继承<br />数据工具实现<br />小结<br /><br />day18down  正则表达式<br />正则表达式bB<br />贪婪与非贪婪<br />标签.<br />标签解决提取<br />标签名称<br />提取QQ生成邮箱列表工具<br />简单正则表达式编写<br />常见的正则表达式<br />复杂正则表达式编写<br />复杂表达式代码验证<br />作业与小结<br /><br />day18up 正则表达式实践<br />为什么使用正则表达式<br />正则表达式匹配.<br />预编译的概念<br />搜索技能<br />搜索用在找出第一个<br />邮箱手机提取findall<br />字符串切割<br />筛选正则表达式<br />正则表达式替换<br />单个字符判断<br />中括号选择一个字符<br />正则表达式次数<br />正则开头结尾<br />括号与选择<br />正则表达式特殊符号<br /><br />day19down 递归与爬虫实战<br />函数递归模拟<br />文件树<br />文件树事件<br />读取网页<br />抓取邮箱<br />抓取QQ<br />提取http<br />抓取邮箱简单程序框架实现<br />抓取邮箱的框架核心两个函数完成<br />广度遍历<br />深度遍历<br />作.业<br /><br />day19up 深度遍历与广度遍历<br />正则表达式小结<br />最简单递归<br />递归顺序<br />递归求和<br />递归腾讯台阶面试题<br />文件夹的函数<br />遍历文件夹<br />遍历文件夹有层次感<br />栈模拟递归<br />栈模拟递归遍历文件夹<br />栈模拟递归遍历文件夹层次感<br />普及网站提取概念<br />栈修改的逻辑错误<br />广度遍历<br /> <br />day20 正则 爬虫实战<br />行情简介<br />提取页面信息<br />提取股票代码<br />提取股票代码<br />下载功能<br />下载股票<br />批量下载股票<br />抓取1页的股票数据<br />抓取多个页面的股票<br />抓取基金信息<br />作业<br /><br />day21  网络编程与信息安全<br />网络概念<br />UDP协议<br />UDP通信<br />UDP远程控制<br />TCP通信<br />TCP控制<br />测试网站后台<br />网站密码破解<br />作业<br /> <br />day22down  线程通信<br />线程通信<br />线程通信强化<br />线程condition<br />高级线程调度<br />生产者消费者<br />线程池<br />延时线程<br />with作用<br />前台进程后台进程<br />TLS线程独立存储<br />作业<br /><br />day22up  多线程实战<br />多线程核心目标并发<br />主线程与小弟线程<br />多线程解决加速<br />多线程的加速<br />线程冲突<br />基于类实现多线程<br />基于类实现多线程的顺序与乱序<br />互斥锁解决线程冲突<br />死锁-使用锁要注意<br />Rlock解决一个线程反复加锁单线程死锁<br />创建线程的三种风格<br />信号量限制线程数量<br />限定线程数量<br /><br />day23  多进程实战<br />多线程回顾<br />多进程拷贝代码<br />多进程拷贝全局变量<br />获取进程编号<br />subprocess执行LinuxShell<br />信号<br />Linux进程小结<br />__name__<br />进程mutiprocessing创建过程<br />join作用<br />进程不可以用全局变量共享数据<br />进程同步<br />进程pipe发送接收数据<br />进程队列<br />进程队列传输数据<br />进程共享数据<br />进程之间共享数组<br />进程共享字典与list<br />简单小结<br /><br />day23down  多进程多线程综合实战<br />读取CSV<br />写入csv<br />单线程统计行数<br />多线程统计行数<br />多进程统计行数<br />多线程检索数据第一步<br />多线程检索赵琳<br />多线程检索找到通知其他人退出<br />多线程检索开放数据并保存同一个文件<br />作业<br /><br />day24up  多进程多线程综合实战<br />多进程检索第一步<br />多进程检索开房数据<br />求平均市值<br />多线程解决平均市值<br />多进程统计平均市值<br />单线程BFS抓取邮箱<br />多线程并行抓取邮箱<br />多线程采集邮箱并保存<br />csv归并<br />多线程归并文件<br /><br />day25down 文件格式处理<br />doc处理<br />系统处理doc与docx<br />文件处理的小结<br />读取并写入xls与xlsx<br />读取网络pdf<br />中文pdf<br />telnet简介<br />登陆Linux<br />登陆Windows<br />小结<br /><br />day25up  时间编程与单元测试<br />时间的简单风格<br />时间格式化<br />抓取年月日计算时间差<br />时间函数<br />计算时间差<br />date小结<br />python2与3的差异<br />内置函数筛选<br />内置函数map<br />内置的函数sorted<br />新浪数据抓取实时<br />文档测试<br />单元测试函数<br />单元测试一个类<br /><br />day26  综合实战<br />播放音乐<br />设置背景<br />鬼程序<br />协程简介<br />协程传递数据wmv<br />协程编号<br />协程生产者消费者模式<br />office自动化操作word<br />office办公自动化操作excel<br />office办公自动化操作outlook<br />office办公自动化<br />access开发环境配置<br />访问mdb格式<br />访问accdb格式<br />实现CGI程序显示页面<br />环境变量<br />cgi处理前后端<br /><br />day26down  破解wifi实战<br />扫描wifi<br />扫描网卡<br />区分链接成功或者失败<br />wifi密码爆破工具设计<br />Linux破解简介<br /><br />day27down  飞机大战实战<br />命令行下脱裤<br />创建一个pygame窗体<br />窗体加载背景图片<br />处理消息<br />飞机移动<br />实现基本框架<br />飞机框架<br />飞机销毁<br />双机对战<br />双机对战加载子弹<br />双机与敌机出现发射子弹<br /><br />day27up  数据库实战<br />jython的安装<br />MySQL简介<br />数据库的一般操作<br />MySQL数据类型<br />数据表的创建于删除<br />数据的查询<br />数据的插入<br />数据的删除<br />数据的更新<br />联合查询字段一致<br />数据查询排序<br />排序与分组<br />join与null<br />mysql用python编程查询数据<br />python数据库增删查改<br />项目简介<br /><br />other  异常与错误综合练习<br />异常与错误的概念<br />作业<br />tryexcept解决异常不出错继续执行<br />密码破解工具<br />进攻数据库<br />爆破mysql<br />异常else<br />异常处理的标准公式<br />弹出异常<br />withas<br />类中使用异常<br />继承<br />自定义异常<br />断言<br />密码工具设计三个独立的类<br />密码工具2类链接3类<br />密码工具1类链接3类<br />密码工具分析<br />作业<br /><br />speech   语音识别问题解决<br />语音识别解决None</p>
相关推荐
<p style="text-align:left;"> <span> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-family:"color:#E53333;font-size:14px;background-color:#FFFFFF;line-height:24px;"><span style="line-height:24px;">限时福利1:</span></span><span style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;">购课进答疑群专享柳峰(刘运强)老师答疑服务。</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <strong><span style="color:#337FE5;font-size:14px;">为什么说每一个程序员都应该学习MySQL?</span></strong> </p> <p class="ql-long-24357476"> <span style="font-size:14px;">根据《2019-2020年中国开发者调查报告》显示,超83%的开发者都在使用MySQL数据库。</span> </p> <p class="ql-long-24357476"> <img src="https://img-bss.csdn.net/202003301212574051.png" alt="" /> </p> <p class="ql-long-24357476"> <span style="font-size:14px;">使用量大同时,掌握MySQL早已是运维、DBA的必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入的了解和掌握。</span><br /> <br /> <span style="font-size:14px;">学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺的技能!</span> </p> <span></span> <p> <br /> </p> <p> <span> </span> </p> <h3 class="ql-long-26664262"> <p style="font-size:12pt;"> <strong class="ql-author-26664262 ql-size-14"><span style="font-size:14px;color:#337FE5;">【课程设计】</span></strong> </p> <p style="font-size:12pt;"> <span style="color:#494949;font-weight:normal;"><br /> </span> </p> <p style="font-size:12pt;"> <span style="color:#494949;font-weight:normal;font-size:14px;">在本课程中,刘运强老师会结合自己十多年来对MySQL的心得体会,通过课程给你分享一条高效的MySQL入门捷径,让学员少走弯路,彻底搞懂MySQL。</span> </p> <p style="font-size:12pt;"> <span style="color:#494949;font-weight:normal;"><br /> </span> </p> <p style="font-size:12pt;"> <span style="font-weight:normal;font-size:14px;">本课程包含3大模块:</span><span style="font-weight:normal;font-size:14px;"> </span> </p> </h3> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <strong class="ql-author-26664262"><span style="font-size:14px;">一、基础篇:</span></strong> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <span class="ql-author-26664262" style="font-size:14px;">主要以最新的MySQL8.0安装为例帮助学员解决安装与配置MySQL的问题,并对MySQL8.0的新特性做一定介绍,为后续的课程展开做好环境部署。</span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <span class="ql-author-26664262" style="font-size:14px;"><br /> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <strong class="ql-author-26664262"><span style="font-size:14px;">二、SQL语言篇</span></strong><span class="ql-author-26664262" style="font-size:14px;">:</span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <span class="ql-author-26664262" style="font-size:14px;">本篇主要讲解SQL语言的四大部分数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL,</span><span style="font-size:14px;">学会熟练对库表进行增删改查等必备技能。</span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <strong class="ql-author-26664262"><span style="font-size:14px;">三、MySQL进阶篇</span></strong><span style="font-size:14px;">:</span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">本篇可以帮助学员更加高效的管理线上的MySQL数据库;具备MySQL的日常运维能力,语句调优、备份恢复等思路。</span> </p> <span><span> <p style="font-size:11pt;color:#494949;"> <span style="font-size:14px;"> </span><img src="https://img-bss.csdn.net/202004220208351273.png" alt="" /> </p> </span></span>
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页

打赏

叶庭云

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付 39.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值