鱼C论坛

 找回密码
 立即注册
查看: 2876|回复: 14

妹纸求助(@﹏@)~课后习题20讲新手有问题

[复制链接]
发表于 2016-10-31 10:09:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
QQ图片20161031100139.png QQ图片20161031100210.png QQ图片20161031100436.png
我的渣码到底错在哪里嘞?乍一看好像没地方有问题,可是运行结果差异这么大。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-31 10:09:56 | 显示全部楼层
  1. string2 = '''ahbdguj......'''
  2. list2 = []
  3. count = 3 #每处理字符串里的一个字符count+1
  4. for each in string2:
  5.     if each == '\n':
  6.         continue
  7.     if each.islower():#先挑出小写字符
  8.         stra = string2[count-3:count]
  9.         strb = string2[count+1:count+4]
  10.         if stra.isupper() and strb.isupper():#再检测两边是否都有3位的大写字符串
  11.             if string2[count-4].islower and string2[count+4].islower:#再检测两边是否仅有3位大写字符串
  12.                 list2.append(each)#符合以上条件就确认为密码并写入list2
  13.     count += 1
  14. print(list2)

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-31 11:20:18 | 显示全部楼层
  1. count = 3 #每处理字符串里的一个字符count+1
复制代码

这句说明查找从第4个字符开始,而对迭代(for循环)来说,默认从第1个字符开始,这里产生了不匹配。
可以直接初始化count = 0。
  1. if string2[count-4].islower and string2[count+4].islower:#再检测两边是否仅有3位大写字符串
复制代码

这句调用字符串方法后加上()。
  1. if string2[count-4].islower() and string2[count+4].islower():
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-31 12:01:38 | 显示全部楼层
楼上正解。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-31 15:27:53 | 显示全部楼层
Kotori 发表于 2016-10-31 11:20
这句说明查找从第4个字符开始,而对迭代(for循环)来说,默认从第1个字符开始,这里产生了不匹配。
可 ...

非常感谢你的解答。count =3 是因为我的这个count并不是用来作为for循环的依据,而是作为位置存在的。而且密码字符的左右两边都有三个大写字母,string2[count-3:count]如果不从3开始count-3就从负数开始了。

后面的括号我给忘记了,谢谢改错。不过最终的运行结果还是错的。。。好伤心
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-31 15:31:05 | 显示全部楼层
Kotori 发表于 2016-10-31 11:20
这句说明查找从第4个字符开始,而对迭代(for循环)来说,默认从第1个字符开始,这里产生了不匹配。
可 ...

而且好奇怪啊,照理说count的初始值的多少结果应该并没有什么变化。为什么count=1,2,3等等结果完全不同了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-31 16:25:46 | 显示全部楼层
百年上单提莫 发表于 2016-10-31 15:31
而且好奇怪啊,照理说count的初始值的多少结果应该并没有什么变化。为什么count=1,2,3等等结果完全不同了

你还是没理解,我举个例子好了。只修改了没加括号的地方,举例过程在注释里。
  1. string2 = '''ahbdguj......'''
  2. list2 = []
  3. count = 3 #这里用你的初始值3
  4. for each in string2: #第一个取出的each是"a"
  5.     if each == '\n': #这里不是换行,跳过
  6.         continue
  7.     if each.islower(): #这里是小写,执行
  8.         stra = string2[count-3:count] #这里是关键,当你的count为3里,这里的stra是[0-3]
  9.         strb = string2[count+1:count+4] #这里的strb是[4-7],如果是这样的话,实际上就是在判断第4个字符的两边位置。而你想在这个位置判断的是第1个字符。这也就是我上面说的不匹配,所以出现的结果会很奇怪。
  10.         if stra.isupper() and strb.isupper():
  11.             if string2[count-4].islower() and string2[count+4].islower():
  12.                 list2.append(each)
  13.     count += 1
  14. print(list2)
复制代码

这个count在你的这个程序思路中,是作为一个位置的标志。那么count的作为初始值应该与过程同步,所以要赋值为0。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-10-31 19:19:31 | 显示全部楼层
Kotori 发表于 2016-10-31 16:25
你还是没理解,我举个例子好了。只修改了没加括号的地方,举例过程在注释里。

这个count在你的这个程 ...

我明白了。each和count不匹配,如果把count改成0,出现负数也是不对,所以这段代码的思想是不正确的。O(∩_∩)O谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-31 19:24:37 | 显示全部楼层
Kotori 发表于 2016-10-31 16:25
你还是没理解,我举个例子好了。只修改了没加括号的地方,举例过程在注释里。

这个count在你的这个程 ...

可是负数也就出现在头几个字符中,后面的应该出现正解呀,为什么还是和标准答案相差很多嘞
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-31 19:55:50 | 显示全部楼层
我看了你的代码 用了你的思路编出来了一个跟你编程思路一样的程序,代码如下:
  1. f = open(r'C:\Users\WZX\Desktop\Python\IDLE\20讲作业\string2.txt')#文件路径

  2. str1 = f.read()
  3. lenth = len(str1)
  4. list1 = []

  5. for i in range(lenth):#循环长度为字符串长度
  6.     if str1[i].islower():#判断当前字符是否为小写
  7.         stra = str1[i-3:i]
  8.         strb = str1[i+1:i+4]
  9.         if stra.isupper() and strb.isupper():
  10.             if str1[i+4].islower() and str1[i-4].islower():
  11.                 list1.append(str1[i])

  12. print(list1)
复制代码


输出结果是这样的  多了2个字符 我也在找问题所在 贴出来一起讨论一下
QQ图片20161031195535.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-31 20:00:10 | 显示全部楼层
q545777551 发表于 2016-10-31 19:55
我看了你的代码 用了你的思路编出来了一个跟你编程思路一样的程序,代码如下:

我俩大致思路差不多,但是你的结果跟答案接近的多了多了一些重复的而已
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-31 20:31:14 | 显示全部楼层
百年上单提莫 发表于 2016-10-31 20:00
我俩大致思路差不多,但是你的结果跟答案接近的多了多了一些重复的而已

我已经找到了问题的所在,通过搜索多出来的u和b的下标我在源文件里面找到相应的位置 发现这两个字符的位置都是在每行换行的位置,应该是换行没有处理的问题,现在正在处理中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-31 21:30:45 | 显示全部楼层
百年上单提莫 发表于 2016-10-31 20:00
我俩大致思路差不多,但是你的结果跟答案接近的多了多了一些重复的而已

已经解决问题。通过replace函数将'\n'换成了''(空白),没有了换行符的影响结果正确了 以下是源代码。欢迎大神前来指正,小弟刚学习不久 谢谢。
  1. f = open(r'C:\Users\WZX\Desktop\Python\IDLE\20讲作业\string2.txt')

  2. list1 = []
  3. str1 = f.read()
  4. str1 = str1.replace('\n','')#消除文档中的换行符影响
  5. lenth = len(str1)
  6. for i in range(lenth):#循环长度为字符串长度
  7.     if str1[i].islower():#判断当前字符是否为小写
  8.         stra = str1[i-3:i]
  9.         strb = str1[i+1:i+4]
  10.         if stra.isupper() and strb.isupper():#判断stra和strb是否大写
  11.             if str1[i+4].islower() and str1[i-4].islower():#再一次判断条件
  12.                 list1.append(str1[i])
  13. print(list1)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-11-1 16:33:42 | 显示全部楼层
q545777551 发表于 2016-10-31 21:30
已经解决问题。通过replace函数将'\n'换成了''(空白),没有了换行符的影响结果正确了 以下是源代码。欢 ...

O(∩_∩)O谢谢,我都学半个多月了还停留在小白阶段呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-1 21:45:36 | 显示全部楼层
百年上单提莫 发表于 2016-11-1 16:33
O(∩_∩)O谢谢,我都学半个多月了还停留在小白阶段呢

一起加油!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-23 15:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表