本帖最后由 凌九霄 于 2018-6-14 16:55 编辑
先说说你的程序存在的问题:
1、尽量不要使用全局性的变量
2、对变量的作用范围认识不清,在你的函数中可以引用全局变量,但是是只读,想要改写是不可以的,
所以程序会报UnboundLocalError: local variable 'suma' referenced before assignment错误,注意它
里面的local variable,即它认为你函数里的suma之类是局部变量,非外面的全局变量suma,所以解
释器认为你未赋值引用。解决的方式有两个:
一、将外部的一系列变量赋值放到函数内。
二、 如果是python3的话,则用global关键字修饰函数里面的类suma变量,这样才能改写函数外部的
同名变量,建议第一种方式
3、print的语法错误,最外层引号和里面的引号要区分, % 后面应该是个元组,而不是每个变量前加%
4、改为正确的后,print依然报TypeError: not all arguments converted during string formatting,意即
你想要打印的变量中有未能转化的参数。其实这个是字符需要转义引起的,而且你的参数中有个很特殊
的需要转义的字符:% 这个%不能用一般的 \ 来转义,而是要用到格式化操作符辅助指令%来输出。
如果你用format来格式化字符的话就不会有这个问题了。
修改后的代码:
- # 统计长字符串各个字符出现的次数
- def findstrtype(stringin):
- suma = 0 # '%'
- sumb = 0 # '
- sumc = 0 # '@'
- sumd = 0 # '_'
- sume = 0 # '#'
- sumf = 0 # '('
- sumg = 0 # ')'
- sumh = 0 # '^'
- sumi = 0 # '&'
- sumj = 0 # '['
- sumk = 0 # ']'
- suml = 0 # '!'
- summ = 0 # '*'
- sumn = 0 # '{'
- sumo = 0 # '}'
- sump = 0 # '+'
- sums = 0 # ' '
- length = len(stringin)
- for each in range(length):
- if stringin[each] == '%':
- suma += 1
- elif stringin[each] == ':
- sumb += 1
- elif stringin[each] == '@':
- sumc += 1
- elif stringin[each] == '_':
- sumd += 1
- elif stringin[each] == '#':
- sume += 1
- elif stringin[each] == '(':
- sumf += 1
- elif stringin[each] == ')':
- sumg += 1
- elif stringin[each] == '^':
- sumh += 1
- elif stringin[each] == '&':
- sumi += 1
- elif stringin[each] == '[':
- sumj += 1
- elif stringin[each] == ']':
- sumk += 1
- elif stringin[each] == '!':
- suml += 1
- elif stringin[each] == '*':
- summ += 1
- elif stringin[each] == '{':
- sumn += 1
- elif stringin[each] == '}':
- sumo += 1
- elif stringin[each] == '+':
- sump += 1
- else:
- sums += 1
- print("这段字符串有:%d 个 %% %d个$ %d个@ %d个__ %d个# %d个( %d个) %d个^ %d个& %d个[ %d个] %d个! %d个* %d个{ %d个} %d个+ %d个空格" % (
- suma, sumb, sumc, sumd, sume, sumf, sumg, sumh, sumi, sumj, sumk, suml, summ, sumn, sumo, sump, sums))
- str1 = "%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^"
- findstrtype(str1)
复制代码
另外,既然是python,你这段代码就太不python了,繁琐不说,如果换一个不同字符的字符串,你的程序还得要大改。手痒我也写了几句能适应任何字符串的:
- str1 = "%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^"
- str2 = set(str1)
- for i in str2:
- print("{0}个{1}".format(str1.count(i),i))
复制代码