鱼C论坛

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

[已解决]python零基础 第020讲:函数:内嵌函数和闭包 动动手 1.

[复制链接]
发表于 2020-12-10 22:23:52 | 显示全部楼层 |阅读模式

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

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

x
请问各位,我写的这个函数和题目要求有什么逻辑漏洞吗?为什么得到的答案不对呢?
def pwfinder(txt):
    pw = []
    length = len(txt)
    for i in range(3, length - 3):
        if txt[i].islower():
            if txt[(i-3):i].isupper() and txt[(i+1):(i+4)].isupper():
                if txt[i-4].islower() and txt[i+4].islower():
                    pw.append(txt[i])
    for each in pw:
        print(each, end = '')
得到的结果是
uilovefisdhc
最佳答案
2020-12-10 23:12:34
本帖最后由 jackz007 于 2020-12-10 23:14 编辑

        请楼主测试一下这个代码
s , p = 'a' + '' . join(str1 . split('\n')) + 'a' , '' 
for k in range(4 , len(s) - 4):
    if s[k - 4] . islower() and s[k - 3 : k] . isupper() and s[k] . islower() and s[k + 1 : k + 4] . isupper() and s[k + 4] . islower():
        p += s[k]
print(p)
        藏有密码的字符串保存在 str1 中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-10 22:25:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 23:12:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-12-10 23:14 编辑

        请楼主测试一下这个代码
s , p = 'a' + '' . join(str1 . split('\n')) + 'a' , '' 
for k in range(4 , len(s) - 4):
    if s[k - 4] . islower() and s[k - 3 : k] . isupper() and s[k] . islower() and s[k + 1 : k + 4] . isupper() and s[k + 4] . islower():
        p += s[k]
print(p)
        藏有密码的字符串保存在 str1 中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-11 13:05:39 | 显示全部楼层
jackz007 发表于 2020-12-10 23:12
请楼主测试一下这个代码

        藏有密码的字符串保存在 str1 中

你这个里面好多我看不懂的代码,我测试了一下
结果是:ilovefishc
是对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-11 13:09:12 | 显示全部楼层
jackz007 发表于 2020-12-10 23:12
请楼主测试一下这个代码

        藏有密码的字符串保存在 str1 中

仔细研究了一下,你这个大概思路应该和我是一样的,难道是因为你把'\n'去掉了就能得到正确答案?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-11 13:19:42 | 显示全部楼层
我尝试修改成我的代码:
def pwfinder(txt):
    pw = []
    length = len(txt)
    for i in range(3, length - 3):
        if txt[i] == '\n':
            continue
        elif txt[i].islower() and txt[(i-3):i].isupper() and txt[(i+1):(i+4)].isupper() and txt[i-4].islower() and txt[i+4].islower():
            pw.append(txt[i])
    for each in pw:
        print(each, end = '')
结果还是:
uilovefisdhc

我意识到问题了,应该就是'\n'的锅,但是我还不会使用:
    s , p = 'a' + '' . join(str1 . split('\n')) + 'a' , ''

嗯,那就先这样吧,接着往下学了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 15:50:20 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-11 15:51 编辑
Tigerbear 发表于 2020-12-11 13:19
我尝试修改成我的代码:
def pwfinder(txt):
    pw = []


       语句
    str1 . split('\n') 
       根据换行符 '\n' 对字符串 str1 进行切片,这样,会得到一系列不含换行符的字符串片段
    '' . join(str1 . split('\n'))
       利用字符串的 join() 方法,把所有的字符串片段拼接成一个完整的字符串,这个字符串当然不含换行符 '\n'。
    'a' + '' . join(str1 . split('\n')) + 'a' 
       在字符串首尾添加小写字符 'a',依据是,每个密码字符的两侧有且仅有 3 个大写字母,这就意味着第 4 个字符一定是小写,这也是你我代码重要的不同,我的代码比较密码字符两侧各 4 个字符,而你,是比较各 3 个字符,为了弥补字符串首尾第 4 个字符的缺失,所以,才增加了两个 'a',以便判断规则对整个字符串通用,从而免去对字符串首尾的单独处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-12-11 15:52:46 | 显示全部楼层
jackz007 发表于 2020-12-11 15:50
语句

       根据换行符 '\n' 对字符串 str1 进行切片,这样,会得到一系列不含换行符的字符 ...

这种巧妙地构思和严谨的方法对于初学者来说受益匪浅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 03:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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