python Chap5 学习笔记

python Chap5 学习笔记

用户 - 928Zhou28 - HydroOJicon-default.png?t=N7T8https://hydro.ac/d/datawhale_p2s/user/33001

循环(loop):首尾相接的就是循环,例如一个地铁站点它既是终点又是起点,那他的那一条地铁线路就是一个循环。循环(Loop)是一种控制结构,它允许代码重复执行,直到满足某个条件为止。

可以把range()简单理解成是一个数列。range后面的括号内跟着是一个范围,但是是左闭右开区间,例如range(x,y)中包含x,不包含y。 例如

  • range(5)会生成序列 [0, 1, 2, 3, 4]。

  • range(2, 5)会生成序列 [2, 3, 4]。

  • range(0, 10, 2)会生成序列 [0, 2, 4, 6, 8]。

range()到底是什么

range是一个生成数列的东西,本质上就是一个生成器。每一次for从里面取东西的时候,生成器会生成一些东西给到x,然后生成东西给for用。

例如在上述内容中也可以不用循环来完成同样的任务

range()中只有一个参数的时候:

Tip:默认从0开始

range()中有三个参数的时候:

类似于生成了等差数列

Tip:开区间的数值+1,默认转化成闭区间

如果输出的步长本身是不等差的话,在设置第三个参数是无法控制程序每一次循环的内容的。 例如只对从 m 到 n 的 奇数求和:

如果反着来计算

最后步长写-1,可以从尾到头生成数列,例如生成9,8,7,6...1

for i in range(10,1,-1)
#在python中不管数值是左边大还是右边大,只管左闭右开的
    print(i)
10
9
8
7
6
5
4
3
2
1

但实际上在代码实践中不建议这么做,因为有一个函数可以实现同样的效果,反转reversed()

for i in reversed(range(0,10,1)): 
#步长默认是1
#如果用reversed只需要正着生成数字就可以了
      print(i)
#用reversed可以默认把所有正着生成的数字反转
9
8
7
6
5
4
3
2
1
0

for 循环嵌套

Tip:python原生的for循环语法是非常慢的,如果想要程序做的有效率,多层for循环尽量不要用python写。要考虑python和c++的混合编程。

Tip:复杂代码建议用代码可视化工具来看代码具体的操作流程 (https://pythontutor.com/visualize.html#code=%23%20%E4%B8%8B%E9%9D%A2%E7%9A%84%E4%BB%A3%E7%A0%81%E5%B0%86%E8%BE%93%)xia'm)👇

如果将x,y换成“*”

如果想要依次的控制循环内容,就需要用外层循环的变量值当作内层循环的范围。

while 循环

while循环while是许多编程语言(包括Python、Java、C++等)中的一个关键字,用于创建一个只要条件满足就会一直执行的循环。这种循环被称为"while循环"。

例如,找出一个数最左边的那一位的数值(12345 的 1 ):

举个例子:依次找出 n 个 4 或者 7 的整数倍非负整数

在上述代码中,foundguess是两个用于追踪和计算的变量。

  • found:这个变量用于追踪我们到目前为止找到了多少个是4或7的倍数的数。每当我们在guess中找到一个是4或7的倍数的数时,我们就增加found的值。

  • guess:这个变量是我们正在检查的当前数,看它是否是4或7的倍数。我们从-1开始,然后在每次循环中递增guess,然后检查新的guess是否是4或7的倍数。

所以,nthMultipleOf4or7函数的工作原理是:它开始从-1(guess)开始,然后逐个检查每个数,看它是否是4或7的倍数。每当找到一个是4或7的倍数的数时,它就增加found的值。当found的值等于n时(即我们找到了n个是4或7的倍数的数),它就返回当前的guess。

guess变量被初始化为-1,这是因为在循环的开始,guess被立即递增guess += 1)。如果guess被初始化为0,那么第一个被检查的数将是1,而不是0。由于0是任何数的倍数,包括4和7,所以应该作为第一个被检查的数。 因此,将guess初始化为-1可以确保第一个被检查的数是0,这样就能正确地找到所有是4或7的倍数的数,包括0。

不好的使用while的习惯:在知道循环范围的情况下使用while

break 与 continue 语句

breakcontinue都是用于控制循环流程的关键词。

  • break:当在循环中遇到break语句时,会立即终止当前的循环,不论循环条件是否仍然满足。如果该循环嵌套在其他循环中,break只会终止最内层的循环。(break只会跳出离他最近的那个循环) 例如:

for i in range(5):
    if i == 3:
        break
    print(i)

在这段代码中,输出将是0,1,2。 当i等于3时,break语句被执行,终止了循环,所以3和4没有被打印出来。

  • Continue:当在循环中遇到continue语句时,会立即跳过当前的循环迭代,进入下一次迭代,即跳过continue后面的所有语句,直接开始下一次循环。 例如:

for i in range(5):
    if i == 3:
        continue
    print(i)

在这段代码中,输出将是0,1,2,4。 当i等于3时,continue语句被执行,跳过了当前循环迭代,所以3没有被打印出来。

假·死循环

"假死循环"一词通常用来描述在计算机程序中出现的一种情况,这种情况下,程序看起来像是在无限循环中,但实际上并非如此。

在某些情况下,程序可能会进入一种状态,其中它在处理某个任务时消耗大量的时间和/或资源,这可能是由于算法的效率低下,或者是由于输入的规模过大。在这种情况下,尽管程序实际上并没有陷入无限循环,但由于它需要花费非常长的时间来完成任务,所以看起来好像它在 "假死循环"中。

然而,"假死循环"并不意味着程序已经完全停止响应。程序仍然在运行,并可能在某个时刻完成其任务。这与真正的"死循环"不同,真正的"死循环"是程序由于某种原因(如编程错误)而陷入无法结束的循环。

假死循环就是与环境的一种交互。在人工智能领域,有一个叫“强化学习”的东西,他会和环境进行交互来去不断的去得到新的信息来完善自身的智能体。

类似于听歌软件中的单曲循环,如果想让歌曲停止循环播放有两种方法:

  • 1.在我的外部环境(电脑)中设置了定时关机,一到某个时间点就关机了,一关机歌自然就停了。

  • 2.去听歌软件内部去设置听多久之后就自动停止播放。(这就类似于每一次循环完之后,都会去判定是否到自动停止的时间点,如果到时间了就会停止播放,而计算机语言中的break就类似这种功能。)

注意:计算机本身不存在死循环,计算机的资源是有限的,循环一定是会停止的。如果有一个循环它不会停,那一定不是计算机能够解决的问题。例如,你无法得知无限不循环小数是否是循环小数。

质数的判断

例如:判断一个数是不是质数

更快的算法:

计算两种方法运行的时间

剪枝:剪枝(Pruning)是一种优化策略,用于减少搜索空间或减小模型的复杂性。以下是两种常见的剪枝技术:

  • 搜索剪枝:这是在搜索算法(如深度优先搜索或广度优先搜索)中使用的技术,其目标是避免搜索不可能或不太可能导致解决方案的路径。一个例子是alpha-beta剪枝,它在游戏树搜索中非常有用,可以显著减少需要评估的节点数量。

  • 决策树剪枝:这是一种防止决策树过拟合的技术。在创建决策树时,可能会出现过度复杂的树,这会导致在训练数据上表现良好,但在新数据上表现差的情况。通过剪枝,我们可以消除树的某些部分,使其在训练数据上的表现略有下降,但在新数据上的表现得到改善。这通常通过成本复杂性剪枝或减枝(reduced error pruning)等技术来实现。

将这节课中的知识点串联,编程程序:依次找出第 n 位质数

总结

  • For 循环用于指定范围的重复操作。

  • range() 可以生成一个数字范围。

  • 在不知道循环什么时间停止的时候,应该试试 While 循环。

  • 循环同样也是可以嵌套的。

  • 巧妙地使用 breakcontinue 语句。 来判断某个循环是否有必要在当前执行下去。

  • 合理的剪枝,缩小搜索范围/循环范围,可以大幅提高程序运行效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值