鱼C论坛

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

[已解决]请问统计字符里提示语法有误,怎么修改呢?

[复制链接]
发表于 2018-6-14 12:21:38 | 显示全部楼层 |阅读模式

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

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

x
#统计长字符串各个字符出现的次数
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  # ' '



def findstrtype(stringin):
    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)
最佳答案
2018-6-14 15:46:53
本帖最后由 凌九霄 于 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来格式化字符的话就不会有这个问题了。

修改后的代码:
  1. # 统计长字符串各个字符出现的次数


  2. def findstrtype(stringin):
  3.     suma = 0  # '%'
  4.     sumb = 0  # '
  5.     sumc = 0  # '@'
  6.     sumd = 0  # '_'
  7.     sume = 0  # '#'
  8.     sumf = 0  # '('
  9.     sumg = 0  # ')'
  10.     sumh = 0  # '^'
  11.     sumi = 0  # '&'
  12.     sumj = 0  # '['
  13.     sumk = 0  # ']'
  14.     suml = 0  # '!'
  15.     summ = 0  # '*'
  16.     sumn = 0  # '{'
  17.     sumo = 0  # '}'
  18.     sump = 0  # '+'
  19.     sums = 0  # ' '
  20.     length = len(stringin)
  21.     for each in range(length):
  22.         if stringin[each] == '%':
  23.             suma += 1
  24.         elif stringin[each] == ':
  25.             sumb += 1
  26.         elif stringin[each] == '@':
  27.             sumc += 1
  28.         elif stringin[each] == '_':
  29.             sumd += 1
  30.         elif stringin[each] == '#':
  31.             sume += 1
  32.         elif stringin[each] == '(':
  33.             sumf += 1
  34.         elif stringin[each] == ')':
  35.             sumg += 1
  36.         elif stringin[each] == '^':
  37.             sumh += 1
  38.         elif stringin[each] == '&':
  39.             sumi += 1
  40.         elif stringin[each] == '[':
  41.             sumj += 1
  42.         elif stringin[each] == ']':
  43.             sumk += 1
  44.         elif stringin[each] == '!':
  45.             suml += 1
  46.         elif stringin[each] == '*':
  47.             summ += 1
  48.         elif stringin[each] == '{':
  49.             sumn += 1
  50.         elif stringin[each] == '}':
  51.             sumo += 1
  52.         elif stringin[each] == '+':
  53.             sump += 1
  54.         else:
  55.             sums += 1
  56.     print("这段字符串有:%d 个 %% %d个$ %d个@ %d个__ %d个#  %d个( %d个) %d个^ %d个& %d个[ %d个] %d个! %d个* %d个{ %d个} %d个+ %d个空格" % (
  57.         suma, sumb, sumc, sumd, sume, sumf, sumg, sumh, sumi, sumj, sumk, suml, summ, sumn, sumo, sump, sums))

  58. str1 = "%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^"

  59. findstrtype(str1)
复制代码


另外,既然是python,你这段代码就太不python了,繁琐不说,如果换一个不同字符的字符串,你的程序还得要大改。手痒我也写了几句能适应任何字符串的:
  1. str1 = "%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^"

  2. str2 = set(str1)

  3. for i in str2:
  4.     print("{0}个{1}".format(str1.count(i),i))
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-14 14:59:42 | 显示全部楼层
print语句 语法格式错误,请参考示例

>>> a= '鱼C'
>>> b = '鱼友'
>>> print('%s 和 %s' % (a,b) )
鱼C 和 鱼友
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-14 15:46:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 凌九霄 于 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来格式化字符的话就不会有这个问题了。

修改后的代码:
  1. # 统计长字符串各个字符出现的次数


  2. def findstrtype(stringin):
  3.     suma = 0  # '%'
  4.     sumb = 0  # '
  5.     sumc = 0  # '@'
  6.     sumd = 0  # '_'
  7.     sume = 0  # '#'
  8.     sumf = 0  # '('
  9.     sumg = 0  # ')'
  10.     sumh = 0  # '^'
  11.     sumi = 0  # '&'
  12.     sumj = 0  # '['
  13.     sumk = 0  # ']'
  14.     suml = 0  # '!'
  15.     summ = 0  # '*'
  16.     sumn = 0  # '{'
  17.     sumo = 0  # '}'
  18.     sump = 0  # '+'
  19.     sums = 0  # ' '
  20.     length = len(stringin)
  21.     for each in range(length):
  22.         if stringin[each] == '%':
  23.             suma += 1
  24.         elif stringin[each] == ':
  25.             sumb += 1
  26.         elif stringin[each] == '@':
  27.             sumc += 1
  28.         elif stringin[each] == '_':
  29.             sumd += 1
  30.         elif stringin[each] == '#':
  31.             sume += 1
  32.         elif stringin[each] == '(':
  33.             sumf += 1
  34.         elif stringin[each] == ')':
  35.             sumg += 1
  36.         elif stringin[each] == '^':
  37.             sumh += 1
  38.         elif stringin[each] == '&':
  39.             sumi += 1
  40.         elif stringin[each] == '[':
  41.             sumj += 1
  42.         elif stringin[each] == ']':
  43.             sumk += 1
  44.         elif stringin[each] == '!':
  45.             suml += 1
  46.         elif stringin[each] == '*':
  47.             summ += 1
  48.         elif stringin[each] == '{':
  49.             sumn += 1
  50.         elif stringin[each] == '}':
  51.             sumo += 1
  52.         elif stringin[each] == '+':
  53.             sump += 1
  54.         else:
  55.             sums += 1
  56.     print("这段字符串有:%d 个 %% %d个$ %d个@ %d个__ %d个#  %d个( %d个) %d个^ %d个& %d个[ %d个] %d个! %d个* %d个{ %d个} %d个+ %d个空格" % (
  57.         suma, sumb, sumc, sumd, sume, sumf, sumg, sumh, sumi, sumj, sumk, suml, summ, sumn, sumo, sump, sums))

  58. str1 = "%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^"

  59. findstrtype(str1)
复制代码


另外,既然是python,你这段代码就太不python了,繁琐不说,如果换一个不同字符的字符串,你的程序还得要大改。手痒我也写了几句能适应任何字符串的:
  1. str1 = "%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^"

  2. str2 = set(str1)

  3. for i in str2:
  4.     print("{0}个{1}".format(str1.count(i),i))
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2018-6-14 20:12:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-14 22:41:13 | 显示全部楼层
print("这段字符串%有"+"%d个"  %(suma),"$有"+"%d个"  %(sumb))

这句话要改成这样的形式才能正确输出啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-15 14:41:21 | 显示全部楼层
凌九霄 发表于 2018-6-14 15:46
先说说你的程序存在的问题:
1、尽量不要使用全局性的变量
2、对变量的作用范围认识不清,在你的函数中可 ...

首先,感谢您的回复,说的很详细具体,特别是%的用法,这个我琢磨了很久也不清楚。
其次,初学python,您说的这两个函数我还没有用过,只是在练习if 语句,昨天学到str方法,count(sub[, start[, end]])我觉得很适合用在这里,还在琢磨怎么用。
最后,请教一下您,写代码的时候,怎么理逻辑?或者说,怎么能够提高抽象能力?有什么教材适合学习吗?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-15 19:30:36 | 显示全部楼层
本帖最后由 凌九霄 于 2018-6-15 23:59 编辑
luoyingne 发表于 2018-6-15 14:41
首先,感谢您的回复,说的很详细具体,特别是%的用法,这个我琢磨了很久也不清楚。
其次,初学python, ...


客气了。对于你提出的问题,这里高手如云,我也不敢妄言,个人以为"面向对象"这四个字学习得越深入,理解得越透彻,则越能写出高抽象,低耦合的代码。还是得多揣摩高质量的代码,特别是python本身,它的模块都是可以直接看到源码的,都是现成的绝佳例子,python学习到一定的程度,真的应该去好好研读。另外,倒是有本书推荐给你《大话设计模式》,浅显易懂,讲故事一般引人入胜,例子是基于C#的。基于python的也有一本《精通python设计模式》,如果学到一定的程度,对于编程有些经验后,可以选择其一看看。
360截图20180615192804819.jpg 360截图20180615192652606.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 21:46:06 | 显示全部楼层
凌九霄 发表于 2018-6-15 19:30
客气了。对于你提出的问题,这里高手如云,我也不敢妄言,个人以为"面向对象"这四个字学习得越深入,理 ...

多谢您的帮忙和回复。最近发生了一些不可不做之事,耽误了一点学习,现在才看到。现在我还在学习语法中。刚自己试string 方法。先打好基础吧,您推荐的书我会争取9月份开始看的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 10:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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