鱼C论坛

 找回密码
 立即注册
查看: 3161|回复: 7

有一些不是很懂的地方python零基础第20课最后一题

[复制链接]
发表于 2016-8-16 12:37:33 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 junwu2610 于 2016-8-19 10:59 编辑

在这里先谢谢大家的帮忙!

a)每位密码为单个小写字母
b)每位密码的左右两边均有而只有三个大写字母

str1 = '''ABSaDKSbRIHcRHGcdDIF'''

countA = 0  # 统计前边的大写字母
countB = 0  # 统计小写字母
countC = 0  # 统计后边的大写字母
length = len(str1)

for i in range(length):
    if str1[i] == '\n':
        continue

    """
    |如果str1[i]是大写字母:
    |-- 如果已经出现小写字母:
    |-- -- 统计后边的大写字母
    |-- 如果未出现小写字母:
    |-- -- 清空后边大写字母的统计
    |-- -- 统计前边的大写字母
    """
    if str1[i].isupper():
        if countB:
            countC += 1
        else:
            countC = 0
            countA += 1

    """
    |如果str1[i]是小写字母:
    |-- 如果小写字母前边不是三个大写字母(不符合条件):
    |-- -- 清空所有记录,重新统计
    |-- 如果小写字母前边是三个大写字母(符合条件):
    |-- -- 如果已经存在小写字母:
    |-- -- -- 清空所有记录,重新统计(出现两个小写字母)
    |-- -- 如果该小写字母是唯一的:
    |-- -- -- countB记录出现小写字母,准备开始统计countC
    """
    if str1[i].islower():
        if countA != 3:
            countA = 0
            countB = 0
            countC = 0
        else:
            if countB:
                countA = 0
                countB = 0
                countC = 0
            else:
                countB = 1
                countC = 0
                target = i

    """
    |如果前边和后边都是三个大写字母:
    |-- 如果后边第四个字母也是大写字母(不符合条件):
    |-- -- 清空记录B和C,重新统计
    |-- 如果后边仅有三个大写字母(符合所有条件):
    |-- -- 打印结果,并清空所有记录,进入下一轮统计
    """
    if countA == 3 and countC == 3:
        if i+1 != length and str1[i+1].isupper():
            countB = 0
            countC = 0
        else:
            print(str1[target], end='')
            countA = 3
            countB = 0
            countC = 0


if str1[i] == '\n':
        continue
我看过别人说上面这个如果str1是回车键的就跳出循环,进行下一个判断
但是没了还是的一样的结果,所以这个是为了程序的效率而打出来的吗?
if i+1 != length and str1[i+1].isupper():
i +1 != length这个地方也是没了一样得到同样的结果,不太明白这个是要干什么的?

最佳答案

查看完整内容

首先,for 循环内部的 'str' 应该修改为 str[ i ] , 不知是否是楼主打漏了。 改之后, str[ i ] 是回车就进入下一个循环,这个自然,因为'\n' 不对应字母,没有判断的必要。这个是当加密字符串(str1)有许多行时,来判断的。 是为了防止后面的判断 str1 报错。 楼主可以将 str1 中最后的 'cd' 删去其中一个,再运行。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-16 12:37:34 | 显示全部楼层
本帖最后由 van314159 于 2016-8-22 20:58 编辑

首先,for 循环内部的 'str' 应该修改为 str[ i ]  , 不知是否是楼主打漏了。
改之后, str[ i ] 是回车就进入下一个循环,这个自然,因为'\n' 不对应字母,没有判断的必要。这个是当加密字符串(str1)有许多行时,来判断的。
  1. if i+1 != length
复制代码
是为了防止后面的判断 str1[i+1] 报错。 楼主可以将 str1 中最后的 'cd'  删去其中一个,再运行。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-19 11:20:12 | 显示全部楼层
有没有人啊!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-22 16:04:42 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-23 11:04:27 | 显示全部楼层
本帖最后由 junwu2610 于 2016-8-23 11:15 编辑
van314159 发表于 2016-8-19 15:30
首先,for 循环内部的 'str' 应该修改为 str[ i ]  , 不知是否是楼主打漏了。
改之后, str[ i ] 是回车就 ...


可能是之前删除一些 再打的时候漏了打[i]

我试过打很多回车一样可以得到最终的答案ilovefishc
我想是不是真的有需要用这个判断去判断每一个字符是否回车
在这个字符串的话可能没有这个判断的运行速度还是会更快(虽然应该很少)因为每个字符都要判断
但是如果没有的话,如果字符是回车就会判断3个if
就是说如果不是字符串里面不是没超过3个字符就有一个回车其实不用判断是否回车运行速度会更快
(感觉自己好像想太多,其实如果在一个很大的程序里面有一个这样的判断应该会提高运行速度才对)

一开始我见到这个的时候 我是觉得应该是防止报错的 但是我把(i+1 != length)减掉又没有反应 而且我没有想到后面这个str1[i+1].isupper()
我没看懂你说的‘cd’在哪里,不过我在字符串的最后加上多了三个大写字母 KWGcDFR
因为条件成立字符串最后面的小写c也会打印出来 变成了ilovefishcc
如果没有了(i+1 != length)不但没有打出来最后一个c还报错
ilovefishcTraceback (most recent call last):
  File "/Users/Johnnywu/Documents/找字符串密码02(小甲鱼).py", line 266, in <module>
    if str1[i+1].isupper():
IndexError: string index out of range
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-23 18:18:20 | 显示全部楼层
junwu2610 发表于 2016-8-23 11:04
可能是之前删除一些 再打的时候漏了打[i]

我试过打很多回车一样可以得到最终的答案ilovefishc

那可以输出时间看一看.

  1. from time import clock as now
  2. str1 = 'ABSaDKSbRIHcRHGcdDIF\naABSaDKSbRIHcRHGcdDIF\nABSaDKSbRIHcRHGcdDIF\naABSaDKSbRIHcRHGcdDIF\n\
  3.         ABSaDKSbRIHcRHGcdDIF\naABSaDKSbRIHcRHGcdDIF\n'
  4. ......     #代码照常 加一个时间
  5. time1 = now()  #开始计时
  6. for i in range(length):
  7.     if str1[i] == '\n':
  8.         continue
  9.     ......    #代码照常
  10. print('\n时间为:', now() - time1)
复制代码


输出为:
>>abcaabcbcaabcbcaabc
>>时间为: 0.0012147396446380299

若去掉对 /n 的判断,
输出为:
>>abcaabcbcaabcbcaabc
>>时间为: 0.000618841022514971

但多试几次发现两个时间存在比较大的波动。第一种方法也能到10^-4 s 量级。
不能判断这种方法是否有优越性。
不过照LZ的说法,确实应该是不判断换行更快。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-24 04:58:19 | 显示全部楼层
本帖最后由 junwu2610 于 2016-8-24 05:16 编辑
van314159 发表于 2016-8-23 18:18
那可以输出时间看一看.


之前都不会怎么输出时间
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-24 18:55:22 | 显示全部楼层
junwu2610 发表于 2016-8-24 04:58
之前都不会怎么输出时间

就自己在程序里加上几行来输出时间。 time 模块里有一些函数可以记录当前时间。运行前后分别记录再求差值就得到运行时间。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-22 06:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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