新手的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,'次')
报错内容: while t < len(string1):
if (a1:=a()) not in zifu:
zifu.append(string1)
cishu.append(string1.count(a1))
t += 1
python3.8+语法{:5_102:} 错误原因:在第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 kogawananari 发表于 2020-9-8 08:10
python3.8+语法
感谢大神 本帖最后由 来包利子 于 2020-9-8 10:23 编辑
sunrise085 发表于 2020-9-8 09:26
错误原因:在第22行和第24行分别执行了 a() ,相当于每次 while 循环,a() 执行了两次,也就是跳过两个字符 ...
感谢大神。
我还想再追问一下。
变量不是‘贴标签’吗,为什么命名变量会让函数的功能发生变化?命名之前,函数运行一次会初始化一次;命名之后,函数就不会初始化了。
您提的解决办法也是一个例子。为什么直接使用a()会执行读取操作,而用一个变量命名之后就不会执行?
希望大神能指点指点{:10_254:} 来包利子 发表于 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:} kogawananari 发表于 2020-9-8 11:03
每执行一次yihao()就会返回一个function object 相当于初始化
而yihao()() 初始化是在第一个括号 和命名 ...
{:10_288:}{:10_288:}{:10_288:}
页:
[1]