来包利子 发表于 2020-9-8 00:35:27

新手的py程序报错了...绞尽脑汁还是不会改,求大佬指点一下如何修复

程序目标:传送门小甲鱼Python课后作业动动手第0题

我的程序:

文字版:#以上一长串为string1

#利用刚学的闭包函数,再用a()连续读取出每一个字符
def yihao():
    i = 0
    def erhao():
      nonlocal i
      result = string1
      i += 1
      return result
    return erhao
a = yihao()

#先设置好变量,列表
t = 0
zifu = []
cishu = []

#利用while循环,把所有的字符列成一个列表:zifu
#再把字符出现的次数列成一个列表:cishu
while t < len(string1):
    if a() not in zifu:
      zifu.append(string1)
      cishu.append(string1.count(a()))
    t += 1

#利用for循环,打印出结果
for each in zifu:
    print(each,'一共出现了',cishu,'次')

报错内容:

kogawananari 发表于 2020-9-8 08:10:54

while t < len(string1):
    if (a1:=a()) not in zifu:
      zifu.append(string1)
      cishu.append(string1.count(a1))
    t += 1

python3.8+语法{:5_102:}

sunrise085 发表于 2020-9-8 09:26:41

错误原因:在第22行和第24行分别执行了 a() ,相当于每次 while 循环,a() 执行了两次,也就是跳过两个字符,所以 while 循环执行到一半的时候,a()就已经达到 string1 的结尾了
帮你把 while 这里修改了,下面这种写法是3.8以前的版本写法。3.8版本之后出现了 海象赋值(:=),也就是2楼所写的那样,就可以少写一行了。
while t < len(string1):
    temp=a()
    if temp not in zifu:
      zifu.append(string1)
      cishu.append(string1.count(temp))
    t += 1

来包利子 发表于 2020-9-8 10:11:58

kogawananari 发表于 2020-9-8 08:10
python3.8+语法

感谢大神

来包利子 发表于 2020-9-8 10:13:07

本帖最后由 来包利子 于 2020-9-8 10:23 编辑

sunrise085 发表于 2020-9-8 09:26
错误原因:在第22行和第24行分别执行了 a() ,相当于每次 while 循环,a() 执行了两次,也就是跳过两个字符 ...

感谢大神。

我还想再追问一下。

变量不是‘贴标签’吗,为什么命名变量会让函数的功能发生变化?命名之前,函数运行一次会初始化一次;命名之后,函数就不会初始化了。
您提的解决办法也是一个例子。为什么直接使用a()会执行读取操作,而用一个变量命名之后就不会执行?

希望大神能指点指点{:10_254:}

kogawananari 发表于 2020-9-8 11:03:55

来包利子 发表于 2020-9-8 10:13
感谢大神。

我还想再追问一下。


每执行一次yihao()就会返回一个function object 相当于初始化
而yihao()() 初始化是在第一个括号 和命名没关系 命名是为了后面可以引用
每个function object都有自己的__closure__属性(了解一下就行)
a = yihao()
b = yihao()
a()
a()
a()
print() # 3
b()
b()
print() # 2

用变量去引用yihao()返回的function object是必要的
闭包和递归都是内存杀手{:5_102:}

来包利子 发表于 2020-9-8 18:21:15

kogawananari 发表于 2020-9-8 11:03
每执行一次yihao()就会返回一个function object 相当于初始化
而yihao()() 初始化是在第一个括号 和命名 ...

{:10_288:}{:10_288:}{:10_288:}
页: [1]
查看完整版本: 新手的py程序报错了...绞尽脑汁还是不会改,求大佬指点一下如何修复