“递归三要素”寻踪(浅析递归“经典”框架,领略递归优雅秀气;看到有“递归算法优化”的操作,余试剖之)

news2025/1/13 10:18:31

浅析递归“经典”框架,领略递归优雅秀气。看到有“递归算法优化”的操作,余试剖之。


【学习的细节是欢悦的历程】

  • Python 官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
    地址:https://lqpybook.readthedocs.io/


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室
等风来,不如追风去……

【学习的细节是欢悦的历程】

  • Python 官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……

    地址:https://lqpybook.readthedocs.io/


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室
等风来,不如追风去……


浅析递归“经典”框架,领略递归优雅秀气
“递归三要素”寻踪
(看到有“递归算法优化”的操作,余试剖之。)


本文质量分:

91
本文地址: https://blog.csdn.net/m0_57158496/article/details/130371068

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ “递归三要素”寻踪
    • 1、“递归要素”概念
      • 1.1 百科词条中的“递归要素”
      • 1.2 题目中的“递归要素”
      • 1.3 博文中的“递归要素”
      • 1.4 “递归已死”? 递归没有死!!
    • 2、递归的“经典”案例
      • 2.1 阶乘
        • 2.1.1 阶乘概念
        • 2.1.2 递归代码
        • 2.1.3 炼码
      • 2.2 裴波拉契数列
        • 2.2.1 概念
        • 2.2.2 递归代码
        • 2.2.3 炼码
      • 2.3 1~n 的自然数序列求和
        • 2.3.1 求和代码
        • 2.3.2 炼码
    • 3、递归的“优化”
      • 3.1 “算法优化”
      • 3.2 “代码优化”
      • 3.3 循环改写递归
      • 3.4 递归“优化”感悟
    • 4、完整源码


◆ “递归三要素”寻踪


1、“递归要素”概念


1.1 百科词条中的“递归要素”

递归百科词条描述:

  “递归”是程序调用自身的编程技巧。
  程序调用自身的编程技巧称为递归( recursion )。递归作为一种算法在程序设计语言中广泛应用。
  一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
  递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

  一般来说,递归需要有边界条件递归前进段递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

(点击递归蓝色文字跳转百科词条,了解更多)



回页目录

1.2 题目中的“递归要素”


  • 一、选择题

递归三要素包括 (   )
 A. 递归前进段  B. 递归中间段
 C. 递归出口   D. 递归返回段

答案:A、C、D

  • 二、填空题

  递归的要素:________ 是递归的重要组成部分,________ ,她保证递归能在 ________ 的计算后得出结果,而不会产生 ________ 的情况。


【解析】 本题考查递归思想。
程序调用自身的编程技巧称为递归(recursion)。递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。递推关系是递归的重要组成部分,边界条件,她保证递归能在有限的计算后得出结果,而不会产生无限循环的情况。

解答:递推关系、边界条件、有限、无限循环

----=== 以上题目来自“夸克搜题” ===----


回页目录

1.3 博文中的“递归要素”


1、确定递归函数的参数和返回值
  确定递归过程中需要处理的参数,明确每次递归的返回值,进而确定递归函数的返回类型。

2、确定递归终止条件(即函数 return 的出口)
  终止条件写的不对,操作系统的内存栈一定会溢出,毕竟递归深度也是有限制的( Python 3.11 的递归深度限制默认是 1000 ,可以在程序中用指令重置)

3、确定单层递归的逻辑
  明确每次递归要进行什么操作。

博文地址:https://blog.csdn.net/weixin_44484715/article/details/113461398

第一要素:明确函数作用

第二要素:递归结束条件

第三要素:函数等价关系

博文地址:https://blog.csdn.net/feng8403000/article/details/121797194

第一要素:明确你这个函数想要干什么
  这个不言而喻,要是连函数要干啥子都不晓得,还写啥子代码哦。😊

第二要素:寻找递归结束条件
  所谓递归,就是会在函数内部代码中,调用这个函数本身。所以,我们必须要找出递归的结束条件。不然的话,会一直调用自己,进入“无限循环”的深渊。也就是说,我们需要找出当参数为啥时,递归结束,然后返回结果。请注意,这个时候我们一定是可以根据这个参数的值,能够直接知道函数的结果是什么的。(只要你觉得参数是什么时,你能够直接知道函数的结果,那么你就可以把这个参数作为结束的条件)

第三要素:找出函数的等价关系式
  我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。

博文地址:https://blog.csdn.net/weixin_42112224/article/details/119416330


回页目录

1.4 “递归已死”? 递归没有死!!


  齐伟老师在他的开源🆓教程《 python 完全自学教程》中,对递归有其独到之观点。

  • 递归,不是代码程序的必需,通常可以被循环替换

  其实,在大多数情况下,编程中可以不用递归,即递归通常是不必须的——所以会有“递归已死”的观点。

  • 教程截屏图片
    在这里插入图片描述

  • 在程序代码中要谨慎使用递归

  用简短的语言概括递归:对自身的调用。

  最后要强调,递归并非对所有的任务都适用。如果递归能够让程序的可读性非常好,这时应该毫不犹豫地使用——递归没有死。如果与循环等相比较,递归并没有显示出很高的可读性,那么就要谨慎从事了,它毕竟牺牲了执行速度并占用了更多内存。

  • 教程截屏图片
    在这里插入图片描述

🆓地址:https://lqpybook.readthedocs.io/

  齐老师此教程虽言“ Python 基础教程”,但却不仅仅是“基础”哦!😊


回页目录

2、递归的“经典”案例


  递归之要素,即是 递归之特征——递推关系、边界条件——没有对任务提炼出一步步缩小任务问题范围得出结果的递推关系,就无法通过不断调用自身完成任务;代码中不设定递归结束的边界条件,“调用自身”的工作将“无限”重复,直到程序编译环境设置的递归深度限制,抛出报错信息。程序有其特征,才是“递归”;“项目”有其特征,才适用“递归算法”。


  据其特征要素,编排递归算法之代码,事半功倍减少差错,降低 bug 出现机率,轻松愉悦敲代码。


  下面我将用“阶乘”、“裴波拉契数列”和“正整数序列求和”三个递归“经典案例”浅析递归代码“生成”步骤,让我们共识之。


2.1 阶乘


2.1.1 阶乘概念


  • 阶乘( factorial )概念

  阶乘是基斯顿·卡曼( Christian Kramp,1760~1826 )于 1808 年发明的运算符号,是数学术语。一个正整数的阶乘( factorial )是所有小于及等于该数的正整数的积,并且 0 的阶乘为 1 。自然数 n 的阶乘写作 n! 。1808年,基斯顿·卡曼引进这个表示法。任何大于等于1 的自然数n 阶乘表示方法:

n! = 1 × 2 × 3 × … × (n - 1) × n

n! = n × (n - 1)!

  • 0 的阶乘:0! = 1

  定义的必要性:由于正整数的阶乘是一种连乘运算,而 0 与任何实数相乘的结果都是 0 。所以用正整数阶乘的定义是无法推广或推导出 0! = 1 的。即在连乘意义下无法解释“ 0! = 1 ”。

  给“ 0! ”下定义只是为了相关公式的表述及运算更方便。


2.1.2 递归代码


我们严格按“递归框架”来:

一、递归函数作用——代码要干啥—— 求 n! 。

二、递归结束条件——“边界条件”—— n = 1 时 n! = 1 。

三、递归函数等价关系——“递推关系”—— n × (n - 1)! —— n 乘以 (n - 1) 的阶乘。

根据“框架”出代码:


def factorial_n(num: int) -> int:
    ''' 递归 计算 n! ''' # 函数作用。

    if num == 0: # 递归终止条件。
        return 1

    return num * factorial_n(num-1) # 递归函数等价公式 n × (n-1)!。

  除了函数名称定义和功能说明,实际代码就三条语句,递归函数真是简洁明了

2.1.3 炼码


试求 4 和 8 的阶乘:


if __name__ == '__main__':

    for i in (4, 8):
        print(f"\n整数 {i}! = {factorial_n(i)}")
    
  • 代码运行效果截屏图片
    在这里插入图片描述
      由截屏图片可以看到,前面的“三行代码”递归函数代码无疑是正确的。

  • for 循环和“三元操作”的求 n!


def factorial_n(num: int) -> int:
    ''' 递归 计算 n! (三元操作)'''
    return 1 if num == 0 else num * factorial_n(num-1) # 用三元操作语句改写。


def factorial_n(num: int) -> int:
    ''' 递归 计算 n! ( for )'''
    result = 1
    
    for i in range(1, num+1):
        result *= i

    return result


回页目录

2.2 裴波拉契数列


2.2.1 概念


  斐波那契数列( Fibonacci sequence ),又称黄金分割数列,因数学家莱昂纳多·斐波那契( Leonardo Fibonacci )以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……

  在数学上,斐波那契数列以如下递推的方法定义:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2) ( n ≥ 2,n ∈ N* )

  在现代物理、准晶体结构、化学等领域,斐波那契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波那契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

2.2.2 递归代码


我们严格按“递归框架”来:

一、递归函数作用——代码要干啥—— 求裴波拉契数列第 n 项。

二、递归结束条件——“边界条件”—— n = 0、1 时 F(n) = 1 ,即裴波拉契数列前两项都是 1 。

三、递归函数等价关系——“递推关系”——从第三项起,每项的值是紧邻前两项之和,即 F(n) = F(n-1) + F(n-2)。

根据“框架”出代码:


def fib3(n: int) -> int:
    ''' 求裴波拉契数列第 n 项 '''

    if n < 3: # 递归结束条件——递归边界条件—— n = 0/1/2 。
        return 1 if n in (1, 2) else 0

    return fib(n-1) + fib(n-2) # 函数等价关系——递推关系公式—— 当前项 = 前两项和 。

  求裴波拉契数列第 n 项值的函数,还是仅用三行代码,即可求得。

2.2.3 炼码


  试求裴波拉契数列第 3、5、8 项的值以及列表解析出前 35 项的值:


if __name__ == '__main__':

    for i in (3, 5, 8):
        print(f"\n裴波拉契第 {i} 项是:{fib(i)}")

    input(f"\n裴波拉契数列前 35 项: \n{[fib(i) for i in range(35)]}") 

  • 代码运行效果截屏图片
    在这里插入图片描述

回页目录

2.3 1~n 的自然数序列求和


2.3.1 求和代码


我们严格按“递归框架”来:

一、递归函数作用——代码要干啥—— 求自然数序列总和。

二、递归结束条件——“边界条件”—— n = 1 时总和为 1 。

三、递归函数等价关系——“递推关系”—— n + (n - 1)序列总和。

根据“框架”出代码:


 def recur_n(num: int) -> int:
    ''' 递归 计算 1~n 的和 '''

    if num == 1:
        return 1 # 递归结束条件——递归边界条件。

    return num + recur_n(num-1) # 函数等价关系——递归递推关系公式。


   1~n 的自然数序列求和,也是仅用三条代码语句,就能搞定。

2.3.2 炼码


试求 1~10 、1~100 的总和:


if __name__ == '__main__':
    
    for i in (10, 100):
        print(f"\n 1~{i} 的总和是:{recur_n(i)}")

  • 代码运行效果截屏图片
    在这里插入图片描述
  • for 循环、sum()和“三元操作”的求 1~n 的总和
def recur_n(num: int) -> int:
    ''' 递归 计算 1~n 的和 '''
    return 1 if num == 1 else num + recur_n(num-1) # 用三元操作语句改写。


def factorial_for(num: int) -> int:
    ''' 乘积计算 n! '''
    multiple = 1
    for i in range(1, num+1):
        multiple *= i    
    
    return multiple


def sum_n(num: int) -> int:
    ''' sum() 计算 1~n 的和 '''
    return sum(range(1, num+1))



回页目录

3、递归的“优化”


  下面, 我用“求裴波拉契数列第 n 项”来浅析“递归优化”,分别列举算法优化和代码优化,并打印出在相同环境求相同项数所用时间,以此 窥其“优劣”

3.1 “算法优化”


  有人用数组存储递推结果,减少重复递推计算,大大提高递归算法效率。其实还可以用 Python 字典 dict 来存储,也是即为方便的。

  下面以求裴波拉契数列第 n 项值为例,演示“递归算法优化”。经过“优化”,有效减少重复递推计算,能轻松算出第 1000 值。


  • 数组 list 存储

def fib4(n: int) -> int:
    ''' 求裴波拉契数列第 n 项(数组存储递推结果) '''
    
    if n < 3: # 递归结束条件——递归边界条件。
        return 1 if n in (1, 2) else 0

    a = b = 0

    if not lis[n-1]:
        lis[n-1] = fib(n-1)
    else:
        a = lis[n-1]

    if not lis[n-2]:
        lis[n-2] = fib(n-2)
    else:
        b = lis[n-2]

    if a and b:
        return a + b
    elif a and not b:
        return a + fib(n-2)
    elif not a and b:
        return fib(n-1) + b

    print()
    return fib(n-1) + fib(n-2)

  • 代码运行效果截屏图片
    在这里插入图片描述
    在这里插入图片描述

  • 字典 dict 存储


def fib(n: int) -> int:
    ''' 求裴波拉契数列第 n 项(字典存储递推结果) '''

    if n < 3: # 递归结束条件——递归边界条件。
        return 1 if n in (1, 2) else 0

    keys = list(nums.keys())

    if n-1 in keys and n-2 in keys:
        return nums.get(n-1) + nums.get(n-2)
    elif n-1 in keys:
        temp = fib(n-2)
        nums[n-2] = temp
        return nums.get(n-1) + temp
    elif n-2 in keys:
        temp = fib(n-1)
        nums[n-1] = temp
        return nums.get(n-2) + temp
    
    current = fib(n-1) + fib(n-2)
    nums[n] = current
    return current

  • 代码运行效果截屏图片
    在这里插入图片描述
    在这里插入图片描述

3.2 “代码优化”


  虽然递归代码已经够少了,但还可以用“ 三元操作符”粘接成一条语句。😋

(可以点击蓝色文字跳转我的学习笔记,了解更多 Python 三元操作符)


  • 阶乘

def factorial_n(num: int) -> int:
    ''' 递归 计算 n! '''
    return 1 if num == 0 else num * factorial_n(num-1) # 用三元操作语句改写。


  • 裴波拉契数列

def fib(n: int) -> int:
    ''' 求裴波拉契数列第 n 项 '''
    return 1 if n in (0, 1) else fib(n-1) + fib(n-2) # 用三元操作语句改写。

  • 代码运行效果截屏图片
    在这里插入图片描述

  • 自然数序列求总和

def recur_n(num: int) -> int:
    ''' 递归 计算 1~n 的和 '''
    return 1 if num == 1 else num + recur_n(num-1) # 用三元操作语句改写。



回页目录

3.3 循环改写递归


  由代码运行时间可以看出,Python 的 for 循环是要优于 while 的——代码更简洁紧凑,运行时间会略短。

  • for 循环

def fib(n: int) -> int:
    ''' 求裴波拉契数列第 n 项( for 循环) '''
    a = b = 1 # 当前项前两项初值。

    if n < 3: # 递归结束条件——递归边界条件。
        return 1 if n in (1, 2) else 0

    for i in range(3, n+1):
        current = a + b
        a = b
        b = current # 更新当前项前两项值。

    return current

  • 代码运行效果截屏图片
    在这里插入图片描述
    在这里插入图片描述

  • while 循环


def fib(n: int) -> int:
    ''' 求裴波拉契数列第 n 项( while 循环) '''

    if n < 3: # 递归结束条件——递归边界条件。
        return 1 if n in (1, 2) else 0

    a = b = 1 # 当前项前两项初值。
    k = 3

    while k <= n:
        current = a + b
        a = b
        b = current # 更新当前项前两项值。
        k += 1

    return current

  • 代码运行效果截屏图片
    在这里插入图片描述
    在这里插入图片描述


回页目录

3.4 递归“优化”感悟


  由一系列“优化”操作试炼后得出:


我用递归,就希罕她的苗条妖娆

  用数组存储递推结果,大大加快了代码执行速度,但 代码稍显冗长,“算法”有点儿费理,这却与递归本来的“清爽”样子背道而驰。for 循环的写法,“性能”几乎与算法“优化”的递归一致,但代码却也是不太输“清秀”递归。


  所以,在符合递归的场景,放手递归,别想着去“优化”;当场景能轻易被 for 替代,绝不拖泥带水——果立决


  如果不是特别需要“三元操作”的计算返回值,尽量少用。它会让您的代码相对“难读”,特别是用了嵌套的“三元操作”,虽然写起来我感觉非常爽。
在这里插入图片描述


回页目录

4、完整源码

(源码较长,点此跳过源码)

#!/sur/bin/nve python
# coding: utf-8
from time import time


### 求裴波拉契数列第 n 项


def fib(n: int) -> int:
    ''' 求裴波拉契数列第 n 项(字典存储递推结果) '''

    if n < 3: # 递归结束条件——递归边界条件。
        return 1 if n in (1, 2) else 0

    keys = list(nums.keys())

    if n-1 in keys and n-2 in keys:
        return nums.get(n-1) + nums.get(n-2)
    elif n-1 in keys:
        temp = fib(n-2)
        nums[n-2] = temp
        return nums.get(n-1) + temp
    elif n-2 in keys:
        temp = fib(n-1)
        nums[n-1] = temp
        return nums.get(n-2) + temp
    
    current = fib(n-1) + fib(n-2)
    nums[n] = current
    return current


def fib(n: int) -> int:
    ''' 求裴波拉契数列第 n 项(数组存储递推结果) '''
    
    if n < 3: # 递归结束条件——递归边界条件。
        return 1 if n in (1, 2) else 0

    a = b = 0

    if not lis[n-1]:
        lis[n-1] = fib(n-1)
    else:
        a = lis[n-1]

    if not lis[n-2]:
        lis[n-2] = fib(n-2)
    else:
        b = lis[n-2]

    if a and b:
        return a + b
    elif a and not b:
        return a + fib(n-2)
    elif not a and b:
        return fib(n-1) + b

    return fib(n-1) + fib(n-2)


def fib(n: int) -> int:
    ''' 求裴波拉契数列第 n 项( for 循环) '''
    a = b = 1 # 当前项前两项初值。

    if n < 3: # 递归结束条件——递归边界条件。
        return 1 if n in (1, 2) else 0

    for i in range(3, n+1):
        current = a + b
        a = b
        b = current # 更新当前项前两项值。

    return current


def fib(n: int) -> int:
    ''' 求裴波拉契数列第 n 项( while 循环) '''

    if n < 3: # 递归结束条件——递归边界条件。
        return 1 if n in (1, 2) else 0

    a = b = 1 # 当前项前两项初值。
    k = 3

    while k <= n:
        current = a + b
        a = b
        b = current # 更新当前项前两项值。
        k += 1

    return current


def fib(n: int) -> int:
    ''' 求裴波拉契数列第 n 项 '''

    if n < 3: # 递归结束条件——递归边界条件—— n = 0/1/2 。
        return 1 if n in (1, 2) else 0

    return fib(n-1) + fib(n-2) # 函数等价关系——递推关系公式—— 当前项 = 前两项和 。


def fib(n: int) -> int:
    ''' 求裴波拉契数列第 n 项 '''
    return 1 if n in (1, 2) else 0 if n < 3 else fib(n-1) + fib(n-2) # 用三元操作语句改写。


if __name__ == '__main__':
    n = 35
    start_s = time()
    nums = {0: 0, 1: 1, 2: 1}
    lis = [0] * n
    input(f"\n裴波拉契第 3、5、{n} 项是 {fib(3)}, {fib(5)}, {[fib(i) for i in range(n+1)][-1]}。\n\n程序运行用时 {time() - start_s:.6f} 秒。")



### 求自然数 1~n 的序列总和


def sum_n(num: int) -> int:
    ''' sum() 计算 1~n 的和 '''
    return sum(range(1, num+1))


def recur_n(num: int) -> int:
    ''' 递归 计算 1~n 的和 '''

    if num == 1:
        return 1 # 递归结束条件——递归边界条件。

    return num + recur_n(num-1) # 函数等价关系——递归递推关系公式。


def recur_n(num: int) -> int:
    ''' 递归 计算 1~n 的和 '''
    return 1 if num == 1 else num + recur_n(num-1) # 用三元操作语句改写。


def factorial_for(num: int) -> int:
    ''' 乘积计算 n! '''
    multiple = 1
    for i in range(1, num+1):
        multiple *= i    
    
    return multiple


if __name__ == '__main__':
    
    for i in (10, 100):
        print(f"\n 1~{i} 的总和是:{recur_n(i)}")



### 求 n! 


def factorial_n(num: int) -> int:
    ''' 递归 计算 n! '''

    if num == 0: # 递归终止条件。
        return 1

    return num * factorial_n(num-1) # 递归等价公式。


def factorial_n(num: int) -> int:
    ''' 递归 计算 n! (三元操作)'''
    return 1 if num == 0 else num * factorial_n(num-1) # 用三元操作语句改写。


def factorial_n(num: int) -> int:
    ''' 递归 计算 n! ( for )'''
    result = 1
    
    for i in range(1, num+1):
        result *= i

    return result


if __name__ == '__main__':

    for i in (4, 8):
        print(f"\n整数 {i}! = {factorial_n(i)}")

    input() 
    from time import time
    num = int(input(f"\n{' n = ':>15}"))
    print(f"\n{'':=^50}\n\n")
    start_sec = time()
    print(f"\n{' sum() 、递归求 1~n 的和 ':=^43}\n\n{'':~^50}\n\n 1~{num} 的和:sum() 计算 {sum_n(num)}、递归计算 {recur_n(num)}\n\n{'':~^50}\n{f'程序用时{time()-start_sec:.4f}秒':^45}\n")
    start_sec = time()
    print(f"\n{' for 循环相乘 、递归求 n! ':=^42}\n\n{'':~^50}\n\n {num}! = for 循环相乘计算 {factorial_for(num)}、递归计算 {factorial_n(num)}\n\n{'':~^50}\n{f'程序用时{time()-start_sec:.4f}秒':^45}\n")

  • 源码全文本运行效果截屏图片
    在这里插入图片描述

回页首

上一篇:  找出 1~1000中的所有完美数(再次练习查找完美数,找出 1-1000 中的所有完美数)
下一篇: 

我的HOT博:

  本次共计收集 195 篇博文笔记信息,总阅读量 31.65w,平均阅读量 1623。已生成 20 篇阅读量不小于 3000 的博文笔记索引链接。数据采集于 2023-04-25 05:20:28 完成,用时 4 分 36.51 秒。


  1. 让QQ群昵称色变的神奇代码
    ( 53234 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122566500
    点赞:22   踩 :0  收藏:74  打赏:0  评论:16
    本篇博文笔记于 2022-01-18 19:15:08 首发,最晚于 2022-01-20 07:56:47 修改。
  2. ChatGPT国内镜像站初体验:聊天、Python代码生成等
    ( 46594 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/129035387
    点赞:123   踩 :0  收藏:784  打赏:0  评论:73
    本篇博文笔记于 2023-02-14 23:46:33 首发,最晚于 2023-03-22 00:03:44 修改。
  3. pandas 数据类型之 DataFrame
    ( 7944 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124525814
    点赞:6   踩 :0  收藏:23  打赏:0  评论:0
    本篇博文笔记于 2022-05-01 13:20:17 首发,最晚于 2022-05-08 08:46:13 修改。
  4. 罗马数字转换器|罗马数字生成器
    ( 6345 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122592047
    点赞:0   踩 :0  收藏:1  打赏:0  评论:0
    本篇博文笔记于 2022-01-19 23:26:42 首发,最晚于 2022-01-21 18:37:46 修改。
  5. Python字符串居中显示
    ( 6018 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122163023
    点赞:1   踩 :0  收藏:5  打赏:0  评论:1
    本篇博文笔记于 2021-12-26 23:35:29 发布。
  6. 斐波那契数列的递归实现和for实现
    ( 5276 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122355295
    点赞:4   踩 :0  收藏:2  打赏:0  评论:8
    本篇博文笔记于 2022-01-06 23:27:40 发布。
  7. 练习:字符串统计(坑:f‘string‘报错)
    ( 4851 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121723096
    点赞:0   踩 :0  收藏:1  打赏:0  评论:0
    本篇博文笔记于 2021-12-04 22:54:29 发布。
  8. 个人信息提取(字符串)
    ( 4666 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124244618
    点赞:1   踩 :0  收藏:8  打赏:0  评论:0
    本篇博文笔记于 2022-04-18 11:07:12 首发,最晚于 2022-04-20 13:17:54 修改。
  9. 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
    ( 4565 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121645399
    点赞:14   踩 :0  收藏:42  打赏:0  评论:0
    本篇博文笔记于 2021-11-30 23:43:17 发布。
  10. 回车符、换行符和回车换行符
    ( 4306 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/123109488
    点赞:0   踩 :0  收藏:2  打赏:0  评论:0
    本篇博文笔记于 2022-02-24 13:10:02 首发,最晚于 2022-02-25 20:07:40 修改。
  11. python清屏
    ( 4190 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/120762101
    点赞:0   踩 :0  收藏:5  打赏:0  评论:0
    本篇博文笔记于 2021-10-14 13:47:21 发布。
  12. 密码强度检测器
    ( 3851 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121739694
    点赞:1   踩 :0  收藏:4  打赏:0  评论:0
    本篇博文笔记于 2021-12-06 09:08:25 首发,最晚于 2022-11-27 09:39:39 修改。
  13. 罗马数字转换器(用罗马数字构造元素的值取模实现)
    ( 3786 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122608526
    点赞:0   踩 :0  收藏:0  打赏:0  评论:0
    本篇博文笔记于 2022-01-20 19:38:12 首发,最晚于 2022-01-21 18:32:02 修改。
  14. 练习:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)
    ( 3514 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124424935
    点赞:1   踩 :0  收藏:2  打赏:0  评论:0
    本篇博文笔记于 2022-04-26 12:46:25 首发,最晚于 2022-04-27 21:22:07 修改。
  15. 练习:生成100个随机正整数
    ( 3482 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122558220
    点赞:1   踩 :0  收藏:3  打赏:0  评论:0
    本篇博文笔记于 2022-01-18 13:31:36 首发,最晚于 2022-01-20 07:58:12 修改。
  16. 我的 Python.color() (Python 色彩打印控制)
    ( 3320 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/123194259
    点赞:2   踩 :0  收藏:7  打赏:0  评论:0
    本篇博文笔记于 2022-02-28 22:46:21 首发,最晚于 2022-03-03 10:30:03 修改。
  17. Python列表(list)反序(降序)的7种实现方式
    ( 3311 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/128271700
    点赞:4   踩 :0  收藏:10  打赏:0  评论:8
    本篇博文笔记于 2022-12-11 23:54:15 首发,最晚于 2023-03-20 18:13:55 修改。
  18. 练习:仿真模拟福彩双色球——中500w巨奖到底有多难?跑跑代码就晓得了。
    ( 3176 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/125415626
    点赞:3   踩 :0  收藏:4  打赏:0  评论:3
    本篇博文笔记于 2022-06-22 19:54:20 首发,最晚于 2022-06-23 22:41:33 修改。
  19. 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )
    ( 3045 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124539589
    点赞:3   踩 :0  收藏:3  打赏:0  评论:3
    本篇博文笔记于 2022-05-02 13:02:39 首发,最晚于 2022-05-21 06:10:42 修改。
  20. Linux 脚本文件第一行的特殊注释符(井号和感叹号组合)的含义
    ( 3011 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/123087606
    点赞:0   踩 :0  收藏:4  打赏:0  评论:3
    本篇博文笔记于 2022-02-23 13:08:07 首发,最晚于 2022-04-04 23:52:38 修改。
推荐条件 阅读量突破三千
(更多热博,请点击蓝色文字跳转翻阅)

回页首


老齐漫画头像

精品文章:

  • 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
  • OPP三大特性:封装中的property
  • 通过内置对象理解python'
  • 正则表达式
  • python中“*”的作用
  • Python 完全自学手册
  • 海象运算符
  • Python中的 `!=`与`is not`不同
  • 学习编程的正确方法

来源:老齐教室


回页首

◆ Python 入门指南【Python 3.6.3】


好文力荐:

  • 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
  • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
  • 靠谱程序员的好习惯
  • 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归

CSDN实用技巧博文:

  • 8个好用到爆的Python实用技巧
  • python忽略警告
  • Python代码编写规范
  • Python的docstring规范(说明文档的规范写法)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/474917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mulesoft MCIA 破釜沉舟备考 2023.04.29.27 (易错题)

mulesoft MCIA 破釜沉舟备考 2023.04.29.27 (易错题) 1. An insurance company has an existing API which is currently used by customers.2. An organization has deployed both Mule and non-Mule API implementations to integrate its customer and order management s…

《2023中国各地区科创之星势力图1.0版》重磅发布

数据猿出品 本次“数据猿2023年度三大媒体策划活动——《2023中国各地区科创之星势力图1.版》”的发布&#xff0c;是数据猿在2022年3.0版本的基础上&#xff0c;迭代升级的2023开年的第一个版本。本年度下一次版本迭代将于2023年8月底发布2023年2.0版&#xff0c;敬请期待&…

51 - 自写操作系统

简易OS 1> 版本1&#xff1a;任务建立与切换2> 版本2&#xff1a;定时器切换2.1> main.c2.2> task.c2.3> sleep.c 3> 版本3&#xff1a;加时间片轮转 &#x1f517; //--------- 参考视频链接 ------// 通过实验&#xff0c; 学习理解操作系统的大概&#xf…

【MySQL入门指南】外键约束使用详解

一、为什么需要外键&#xff1f; MySQL是一种关系型数据库&#xff0c;现实中的业务往往是相互关联的&#xff0c;这也就决定了数据库中的表也是存在相互关系的。而表与表之间的相互关系就是通过外键来维护的。给大家举一个现实的例子来帮助理解&#xff1a; 现在我们需要在数据…

IPsec中IKE与ISAKMP过程分析(主模式-消息1)

IPsec协议族中IKE&#xff08;Internet Key Exchange&#xff09;是一种基于ISAKMP的协议&#xff0c;它为建立IPSec安全通信隧道提供了一种无痕密钥交换的机制。简单来说&#xff0c;IKE就是ISAKMP的扩展&#xff0c;为ISAKMP提供了更加高效、灵活和安全的密钥协商机制。 GMT …

什么是大数据?如何入门学习大数据?

什么是大数据&#xff1f;在互联网技术快速发展的今天&#xff0c;大量日常生活和经营活动中产生的数据都已经信息化。我们产生的数据量相比以前有了爆炸式的增长&#xff0c;传统的数据处理技术已经无法胜任&#xff0c;需求催生技术&#xff0c;一套用来处理海量数据的软件工…

TCP报文结构以及三次握手以及四次握手

源端口号: 目标端口号:用来标识接收方计算机的具体应用进程 序号&#xff1a;发送数据组的第一个字节的序号。在TCP传送的流中&#xff0c;每一个字节一个序号。例如&#xff1a;一个报文段的序号为300&#xff0c;此报文段数据部分共有100字节&#xff0c;则下一个报文段的序…

vmware安装redhat 8

vmware安装redhat 8 1、下载镜像文件1.1 镜像文件 2、安装系统2.1、选择自定义安装2.2、兼容性选择2.3、选择镜像文件导入2.4、设置用户名密码2.5、选择虚拟机在磁盘上的位置2.6、选择处理器数量2.7、选择内存大小2.8、选择桥接或NAT2.9、选择SCSI控制器类型2.10、选择虚拟机磁…

第十二章 Transform组件(下)

上一章节中我们介绍了Transform组件的属性和方法。我们发现 Transform 中有right&#xff0c;up和forward&#xff0c;而 Vector3 类中也有right&#xff0c;up和forward&#xff0c;他们是一回事嘛&#xff1f;我们使用Forward来说明两者之间的区别。我们知道&#xff0c;改变…

【web基础】html常用标签+作品展示

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 说明&#xff1a;此部分是java web基础知识&a…

Python游戏利器pygame,疯狂赛车(34)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 你玩过游戏吗&#xff1f; 你喜欢玩游戏吗&#xff1f; 手机游戏&#xff0c;电脑游戏&#xff0c;还是游戏机游戏…

java基础入门-02

Java基础入门-02 8、面向对象8.1. 类和对象8.1.1 类和对象的理解8.1.2 类的定义8.1.3 对象的使用8.1.4 学生对象-练习 8.2. 对象内存图8.2.1 单个对象内存图8.2.2 多个对象内存图 8.3. 成员变量和局部变量8.3.1 成员变量和局部变量的区别 8.4. 封装8.4.1 封装思想8.4.2 private…

智能网联汽车城市化的进程和思考

4月19日&#xff0c;工信部官网显示&#xff0c;支持湖北&#xff08;襄阳&#xff09;、浙江&#xff08;德清&#xff09;、广西&#xff08;柳州&#xff09;创建国家级车联网先导区。至此&#xff0c;车联网国家级先导区正式扩容&#xff0c;由4个增至7个。智能网联作为新生…

Qt5.9学习笔记-事件(一)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

哪些问题是ChatGPT不会回答我的?

哪些问题是ChatGPT不会回答我的&#xff1f; 文章目录 哪些问题是ChatGPT不会回答我的&#xff1f;前言ChatGPT擅长回答哪些问题呢&#xff1f;结语 前言 对于chatgpt&#xff0c;人们或许会觉得无论什么问题&#xff0c;它都能够答复&#xff0c;但对于以下这些问题&#xff…

云和恩墨荣获2023数字中国创新大赛·信创赛道“最具发展潜力奖”等4个奖项

4月27日&#xff0c;作为2023数字中国创新大赛信创赛道系列活动之一的“信创与开源技术论坛”在福州召开&#xff0c;信创赛道全国总决赛颁奖仪式在该论坛上举行。云和恩墨的参赛作品“安稳易用的企业级国产数据库 - MogDB”经过层层筛选、角逐&#xff0c;最终荣获“信创赛道最…

2023五一数学建模竞赛选题人数公布

数据来源自&#xff0c;各个平台人数投票统计&#xff0c;仅供参考。 具体数值比例为&#xff1a; 题号人数A504B1174C1905 目前&#xff0c;五一数模竞赛C题半成品论文基本完成制作&#xff08;累计35页&#xff0c;10000字&#xff09;&#xff0c;注&#xff1a;蓝色字体…

面向画布(Canvas)的JavaScript库

面向画布(Canvas)的JavaScript库 总结 每个库各有特色&#xff0c;根据需求选择 学习要点 面向画布(Canvas)的JavaScript库 EaselJS 是一个封装了 HTML5 画布(Canvas) 元素的 JavaScript 库。jCanvaScript面向HTML5画布&#xff08;canvas&#xff09;的Javascript类库&…

【C++】switch 语句

1、缘起 最近在 BiliBili 黑马程序员学习 C 编程语言&#xff0c;今天学习到了 switch 语句。为了加强记忆&#xff0c;所以就写了一篇关于 switch 语句的博客。 switch 语句是 C 中的一种流程控制语句&#xff0c;它可以根据变量的值来执行不同的代码块。这种语句通常用于替代…

《LearnUE——基础指南:上篇—0》——UE架构

UE架构 给我一个UObject&#xff0c;我可以翘起整个UE 思考&#xff1a;如果让我们自己来设计一款3D渲染引擎&#xff0c;你会怎么设计整个架构&#xff1f; 目前&#xff0c;市面上有众多的3D游戏引擎和各种三维渲染引擎&#xff0c;像常见的渲染库OpenGL&#xff0c;WebGL&…