python讲解教案

30题教案

首先我们观察它给出的这个题目,它的高度是9,设行数为i,顺序是123456789,然后设星星的个数为j,可以得出的规律是第一行有1个,第二行有1,2两个,以此类推,可以得出这样的规律,然后设空格数为k,可以得出的规律是432101234。现在我们来观察这几个规律之间的联系,首先比较i和j的前五行,可以发现最后一个星星的编号和行数是一个样的,所以在前5行可以得出只要j<=i就要打印出星星,同样的道理后4行,星星的个数加上行数小于等于10就要打印星星i+j<=10,然后再仔细观察可以发现这两个条件这10行都能满足。所以在写代码的时候要加上and,做两重限制。然后就可以开始写初步代码了,在输出代码后可以得到,此时这个10要改变,因为一旦输入的条件大于10就不行了,但是此时还缺少了条件。需要补充空格的条件,比较行数和空格数,前五行相加都是5而后四行相减也是5,要找到它们共同的规律,就要用到这个5,可已发现用5减去行数就能得到空格数,后四位也是一样,5减去6得到的数再绝对值一下,就能得到答案。所以可以得出 5是怎么计算的呢,此时的n是9,所以用n//2然后减i在加上1,然后再取绝对值,然后打印,end后面默认是空号

Demo47

堆叠模式

首先分析题目,要输入两个数字a和n

那么可以写出a,n = eval(input()),然后这依旧是一个循环问题,所以在主体部分我们还是要用到for循环所以写for i in range(n):循环n次就行,结果是要做累加,所以写sum=0,然后现在我们要观察规律,可以发现22是2乘以10加2,而222又是22乘以10加2,所以以此类推,每一项都是前一项乘以10加2,再做累加,所以要有数表示前一项,所以我们再写一个num=0,通过规律可以写出 num = num * 10 + a

sum += num可以来举例计算 第一次循环n为0乘以10加2可以得出2,第二次是前一项的结果2乘以10加上2得22,以此类推,就以得出结果,然后我们验证一下。

Demo50

十进制转十六进制

首先我们自己要清楚十进制要怎么计算成十六进制,就用举例

此时观察规律,我们的计算要从上往下算,但是余数的拼接则是要从下往上,所以就要写两个部分,首先第一个部分,我们设定num为输入的部分,用while循环 只要num不等于0,循环就会一直继续,然后计算余数,用y来存储,num则整除16,而余数在十六进制中是有两种形态的,所以我们都需要考虑到,如果是小于10,就不需要有其他设置直接拼接就好,但如果是大于10就需要做转换,这里用到的ord(‘A’)就是A的ascll码值,然后再加上y减去10,这个y是指余数10到15,而10则是为了计算偏移量,用余数减去10得到的偏移量在加上A的ascll码就可以得到对应的字母的ascll码,然后再用chr方法将它们转化成字符串,用y来储存。那么如何实现y的拼接呢?我们可以测试发现,设s=“”, 然后在空号s = s + “1”得出s的位置在加号前后拼接的位置就会不同,所以可以写出s = y+s

但是此时y极有可能是数字也是字符串,为了避免出现问题,我们直接将它们都换成字符串变成str(y)+s,都是字符串的拼接了

二分查找

首先我们来分析原理,这里给出一个数组

123456789

012345678角标此时这里是升序,最小值是角标0所在的1,最大值是角标8所在的9,假设我们要找的是元素8的位置,就是要找角标7.用我们之前的方法,效率非常慢,需要遍历8次,而二分查找的思路则是从中间将元素分成两半,再比较大小,这样可以直接消除一半的数据,然后又继续将数据分半,再进行比较。

思路是这样,现在我们来具体的分析一下,这里的数据是均匀排列的,所以我们不需要分析,我们主要要观察的是它们的角标。此时的最小值min是角标0的位置,最大值max则是在角标8的位置,我们这里分析的是中间位置,而不是中间值,它们不是一样的。而我们现在需要找的中间位置mid是0+8/2所在的角标4,然后用我们需要找的key8来与mid所在位置的值来比较,8比5要大,那么从min到mid之间的区间就都不要比较了。因为它们已经都比8小,只需要比较后面的区间,此时max并没有改变,而min则变成了角标5,也就是当前mid+1的位置,那么mid也需要改变,5+8/2得出6,那么mid也就移动到了角标6的位置,同样的道理用8与角标6的7进行比较,8比7大,那么67这个区间就可以排除了,同样的道理,min的值发生改变移动到角标7的位置,还是当前mid加1的地方,而max没变,产生新的区间,mid也发生变化,7+8/2位置在角标7,再进行比较,然后找到了,并且发现此时mid值与key的值相等了,所以当mid与key相等时就是找到了。然后我们在进行比较,设key=4,同理进行二分查找,但此时是key比mid小,区间在前面,而min没有改变,而max则变成角标3,是mid-1的位置,然后继续进行比较,0+3/2 mid移动到角标1的位置,然后又进行比较,又生成新的23区间,进行相同的步骤,就只剩下了角标3,key就是这里,而此时min,max,mid都在一个位置上。前面的情况都是找到了,现在来研究找不到的情况,设key为6.5,前面都是一样的方法,当比较到6.5比7小,此时max,min,mid都在角标5上,元素为6,但6.5比6大,那么根据前面同理,要考虑右边的区间那么min就要变成mid+1移动到角标6的位置,那此时就出现了问题,min比max大了,报错了,所以这就是不存在的情况。现在来写代码

前面基本条件先写好,先设定好min max mid的运算方式

然后写好key的值,经过我们前面的分析,找到的条件是key要等于mid,所以我们写循环的时候就设定只要mid还不等于key循环就不会结束。然后我们接着写条件,根据之前总结的规律,如果mid小于key则min=mid+1,如果是大于则是max=mid-1,并且还有不存在的情况,也要写出来,如果min大于max,mid=-1,-1就是表示不存在,并且强制退出循环。判断完这些情况之后,会产生新的区间,所以mid值也会发生变化,再计算一遍,然后继续在循环中比较,最终输出结果mid

列表操作系列问题

通过输入来获取元素

举例

5 个数

1 2 3 4 5 这五个元素,现在要将输入的内容封装到一个数组当中,

现在来写代码,第一个数字直接输入,n是我们的输入长度,第二排的数字就不能直接输入,它们之间也没用逗号分隔,所以我们不能用同样的方法来写,那么此时我们将它们就看做一个字符串,此时就能用input函数来输入,输入之后还不够,我们用了一个新的方法.spilt( )中间是个空格,这是为了将输入的这整个数据一空格的方式来分割,相当于将这整个字符串分隔成了5个字符串,形成了一个列表,这就可以满足上面的条件了,然后将它们放进arr里,最后再输出,但此时还不够,这个列表里面是字符串,而不是我们想要的数字,所以我们还将它们都int一下,这样又要用到前面的知识

[Int(x)for x in arr]循环将arr里的x取出来进行int,然后再放进arr里,就可以覆盖之前的内容,这里其实我们是创建了两个数组

遍历问题:

首先创建一个有元素的数组

Len(arr)是为了取这个数组的角标,写9不取9,所以范围是0到8,而这就是他的角标范围所以直接输出

而foreach循环里则完全不会用到角标的概念

最终问题:

此时这里我们使用循环,首先寻找思路

我们设第一个人就是最大的角标0

那么接下来的循环就从第二个开始,只要大于他,就变成最大值,然后再用不断比较,直到找到最大的值,最小值也是一样,设角标0的值就是最小值,然后让其他角标的值在循环中与它进行比较,比他小就变成最小值,然后再比较

存在性问题

前面的操作很简单,设key等于8 在循环中寻找,如果num等于key则输出存在,并且结束循环,但不存在的情况也要表示出来,这里我们运用的方法是else语句,但它不是对应if语句而是整个for循环,如果if中找到了,那么就正常退出,不会用到else但是如果没有找到,就会触发else语句中的内容

第二个问题是

这里我们修改一下数组,那么此时我们要找的就是角标3

那么首先设key=4

我们假设index就是key的位置,然后步骤与之前的一样,只是这里是要寻找角标,只是这里我们用-1来表示不存在

翻转问题:

这里是要将这个数组的顺序反过来do

那么这里写arr= arr[-1: -9: -1]或[-1: :-1]都可以,因为-1已经标记他是倒着走的

但是如果这里不使用这个方法

首先我们去观察这里的规律

123456789

012345678可以发现遍历了01234就不用便利5678,到中间这个4就结束了,因为它自己与自己互换了,这里就算是偶数,原因也是一样的,都是在中间结束,所以这里我们可以写len(arr)//2

然后写角标互换,第一个是arr【i】设第二个是arr【j】而j等于len(arr)数组的长度- 1-i这里是观察0和8 1和7得出的规律

这里使用更加简单的方法,设left=0,right=len(arr)-1,它们分别从左右两边来遍历,遍历一次两边就进行++和--的操作,画个图来表示,让他们互换,这里我们写一while循环,条件是left要小于等于right,当它出现报错的情况时就是左边比右边大

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值