重点:递归函数,数学模块,随机模块---day14
1.递归函数
自己调用自己的函数是递归函数
递:去
归:回
一去一回叫作递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 简单递归 def digui(n): print (n, '<==1==>' ) if n > 0 : digui(n - 1 ) print (n, '<==2==>' ) digui( 5 ) 解析: ''' 去的过程: n = 5 print(5,"<===1===>") 5 > 0 digui(5-1) <=> digui(4) <=> 当前代码在第14行,代码暂停阻塞 n = 4 print(4,"<===1===>") 4 > 0 digui(4-1) <=> digui(3) <=> 当前代码在第14行,代码暂停阻塞 n = 3 print(3,"<===1===>") 3 > 0 digui(3-1) <=> digui(2) <=> 当前代码在第14行,代码暂停阻塞 n = 2 print(2,"<===1===>") 2 > 0 digui(2-1) <=> digui(1) <=> 当前代码在第14行,代码暂停阻塞 n = 1 print(1,"<===1===>") 1 > 0 digui(1-1) <=> digui(0) <=> 当前代码在第14行,代码暂停阻塞 n = 0 print(0,"<===1===>") 0 > 0 条件不满足,返回False,不执行调用,print(0,"<===2===>") 回的过程: n = 1 从阻塞位置14行继续向下执行 print(1,"<===2===>") n = 2 从阻塞位置14行继续向下执行 print(1,"<===2===>") n = 3 从阻塞位置14行继续向下执行 print(1,"<===2===>") n = 4 从阻塞位置14行继续向下执行 print(1,"<===2===>") n = 5 从阻塞位置14行继续向下执行 print(1,"<===2===>") 到此代码全部执行结束 543210012345 ''' ''' 递归函数有回的过程,有两种情况可以触发: (1)当最后一层函数全部执行结束的时候,有触底反弹的过程(回马枪),回到上层函数空间的调用处 (2)遇到return返回值,直接返回上层空间的调用处 函数在运行的时候,需要内存开辟空间才可以,这个空间叫做栈帧空间 递归: (1)去的过程就是不停的开辟栈帧空间,在回的时候,就是不停的释放栈帧空间, 递归函数就是不停的开辟和释放栈帧空间的一个完整的过程 (2)回的时候有两种触发的机制,要么是最后一层函数空间全部执行完毕,要么是遇到return,都会触底反弹(回马枪) (3)写递归函数的时候,必须给与跳出的条件,如果递归的层数过多,不推荐使用,容易内存溢出或者蓝屏 (4)递归调用每一层空间都是独立的个体,独立的副本,资源不共享,可以通过return来完成值的传递。 ''' #官方说法,递归最大深度是1000层,具体按照机器来看 def deepfunc(): deepfunc() deepfunc() #996 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | # 求任意数n的阶乘:5!= 5*4*3*2*1 #普通方法 def func(n): total = 1 for i in range ( 1 ,n + 1 ): total * = i ''' total = total * i => 1 * 1 total = total * i => 1 * 1 * 2 total = total * i => 1 * 1 * 2 * 3 total = total * i => 1 * 1 * 2 * 3 * 4 total = total * i => 1 * 1 * 2 * 3 * 4 * 5 ''' return total res = func( 5 ) print (res) #递归写法 def jiecheng(n): if n < = 1 : return 1 return n * jiecheng(n - 1 ) res = jiecheng( 5 ) print (res) #jiecheng(1) =>1 ''' #代码解析: #去的过程 n = 5 return 5 * jiecheng(5 - 1) => 5*jiecheng(4) n = 4 return 4 * jiecheng(4 - 1) => 4*jiecheng(3) n = 3 return 3 * jiecheng(3 - 1) => 3*jiecheng(2) n = 2 return 2 * jiecheng(2 - 1) => 2*jiecheng(1) n = 1 return 1 #回的过程 n = 2 return 2 * jiecheng(1) => 2*1 [jiecheng(2)] n = 3 return 3 * jiecheng(2) => 3*2*1 [jiecheng(3)] n = 4 return 4*jiecheng(3) => 4*3*2*1 [jiecheng(4)] n = 5 return 5*jiecheng(4) => 5*4*3*2*1 [jiecheng(5)] res = jiecheng(5) <==> 5*4*3*2*1 = 120 ''' # 尾递归(自己调用自己,并且非表达式)[把值放到参数中运算](推荐) ''' 无论调用多少次函数,都只占用一份空间 好处,只需要考虑最后一层空间的结果是多少,就不用额外考虑回的过程了 cpython解释器目前不支持 ''' def jiecheng(n,endval): if n < = 1 : return endval return jiecheng(n - 1 ,endval * n) res = jiecheng( 5 , 1 ) print (res) #优化一(防止用户乱传参数) def outer(n): def jiecheng(n,endval): if n < = 1 : return endval return jiecheng(n - 1 ,endval * n) return jiecheng(n, 1 ) print (outer( 5 )) #优化二(防止用户乱传参数) def jiecheng(n,endval = 1 ) if n < = 1 : return endval return jiecheng(n - 1 ,endval * n) print (jiecheng( 5 )) ''' #代码解析: #去的过程 n = 5,endval = 1 return jiecheng(5-1,endval*n) => return jiecheng(4,1*5) n = 4,endval = 1*5 return jiecheng(4-1,endval*n) => return jiecheng(3,1*5*4) n = 3,endval = 1*5*4 return jiecheng(3-1,endval*n ) => return jiecheng(2,1*5*4*3) n = 2,endval = 1*5*4*3 return jiecheng(2-1,endval*n ) => return jiecheng(1,1*5*4*3*2) n = 1,endval = 1*5*4*3*2 if 1 <= 1 条件满足 return endval => return 1*5*4*3*2 # 回的过程 n = 2 return 1*5*4*3*2 n = 3 return 1*5*4*3*2 n = 4 return 1*5*4*3*2 n = 5 return 1*5*4*3*2 到此程序全部结束; ''' #2.斐波那契数列,用递归 1 1 2 3 5 8 13 ... def feb(n): if n = = 1 or n = = 2 : return 1 #当前值n = 上一个值(n-1) + 上上个值(n-2) return feb(n - 1 ) + feb(n - 2 ) res = feb( 5 ) print (res) """ #代码解析: n = 5 return feb(4) + feb(3) <=> 3 + 2 => 5 feb(4) feb(3) feb(3) + feb(2) feb(2) + feb(1) feb(2)+feb(1) feb(4) feb(3) feb(3) + feb(2) feb(2) + feb(1) 1+1 feb(4) feb(3) 2 + 1 1 + 1 feb(4) = 3 feb(3) = 2 """ |
2.数学模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | math 数学模块 模块.方法() import math #ceil() 向上取整 ***** res = math.ceil( 3.01 ) print (res) #floor() 向下取整操作 ***** res = math.floor( 4.1 ) print (res) #pow() 计算一个数值的N次方(结果为浮点数)(对比内置函数pow) res = math. pow ( 2 , 3 ) print (res) #2**3 #sqrt() 开平方运算(结果浮点数) 参数= 某个数的平方 res = math.sqrt( 9 ) print (res) #3.0 #fabs() 计算一个数值的绝对值(结果为浮点数)(对比内置abs) res = math.fabs( - 9 ) print (res) #modf() 将一个数值拆分为整数和小数两部分组成元组 res = math.modf( - 19.8 ) print (res) #copysign() 将参数第二个数值的正负号拷贝给第一个(返回一个小数) res = math.copysign( - 90 , - 18 ) print (res) #-90.0 #fsum() 将一个容器数据中的数据进行求和运算(结果浮点数)(对比内置sum) lst = [ 1 , 2 , 3 , 4 ] res = math.fsum(lst) print (res) #圆周率常数 pi res = math.pi print (res) |
3.随机模块 random
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | # ### 随机模块 random import random #random() 获取随机0-1之间的小数(左闭右开) 0<= x <1 res = random.random() print (res) #randrange() 随机获取指定范围内的整数(包含开始值,不包含结束值,间隔值) 同range ***** #一个参数的用法 res = random.randrange( 3 ) #0 1 #二个参数的用法 res - random.randrange( 3 , 7 ) #3,4,5,6 #三个参数的用法 res = random.randrange( 3 , 10 , 2 ) #3,5,7,9 print (res) #randint() 随机产生指定范围内的随机整数(可以获取到最大值)[了解] res = random.randint( 1 , 3 ) #1,2,3 print (res) #uniform() 获取指定范围内的随机小数(左闭右开) res = random.uniform( 1 , 3 ) #1<= x <3 print (res) res = random.uniform( 3 , 1 ) #3 >= x >0 print (res) """ "Get a random number in the range [a, b) or [a, b] depending on rounding." return a + (b-a) * self.random() a = 3 , b = 1 return a + (b-a) * 0~1 return 3 + (1-3) * 0~1 return 3 + -2 * (0~1) 最大值:3 + -2 * 0 = 3 最小值:3 + -2 * 1 = 1 1< x <=3 """ #choice() 随机获取序列中的值(多选一) lst = [ "周杰伦" , "蔡徐坤" , "易烊千玺" , "神秘boy" ] res = random.choice(lst) print (res) #自定义choice函数 def mychoice(lst): #随机获取0~3的下标 num = random.randrange( len (lst)) #通过下标来获取列表的值 return lst[num] print (mychoice(lst)) #lambda表达式 mychoice = lambda lst : lst[random.randrange( len (lst)] print (mychoice(lst)) #sample() 随机获取序列中的值(多对多) #返回列表 lst = [ "周杰伦" , "蔡徐坤" , "易烊千玺" , "神秘boy" ] res = random.sample(lst, 2 ) # 第二个参数为随机返回2个 print (res) #shuffle() 随机打乱序列中的值(直接打乱原序列) lst = [ "周杰伦" , "蔡徐坤" , "易烊千玺" , "神秘boy" ] random.shuffle(lst) print (lst) #随机验证码 4位 大小写字母数字 #chr => 给ascii码返回对应的字符 ''' A~Z a~z 0~9 ''' #A => 65 #a => 97 print ( chr ( 65 )) def yanzhengma(): strvar = '' for i in range ( 4 ): # 大写字母 A-Z 65-90 b_word = chr (random.randrange( 65 , 91 )) # 小写字母 a-z 97-122 s_word = chr (random.randrange( 97 , 123 )) # 数字0-9 num = str (random.randrange( 0 , 10 )) #把可能的字符都放在列表里,一次抽一个 lst = [b_word,s_word,num] strvar + = random.choice(lst) return strvar res = yanzhengma() print (res) |
总结:今天主要讲了递归函数,数学模块math,随机模块random。
递归函数重点,目前还没完全弄明白,需继续研究
__EOF__

本文作者:404 Not Found
本文链接:https://www.cnblogs.com/weiweivip666/p/12913935.html
关于博主:可能又在睡觉
版权声明:转载请注明出处
声援博主:如果看到我睡觉请喊我去学习
本文链接:https://www.cnblogs.com/weiweivip666/p/12913935.html
关于博主:可能又在睡觉
版权声明:转载请注明出处
声援博主:如果看到我睡觉请喊我去学习
-------------------------------------------
个性签名:代码过万,键盘敲烂!!!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
分类:
python学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人