鱼C论坛

 找回密码
 立即注册
查看: 1364|回复: 5

[已解决]020讲课后作业动动手第0题

[复制链接]
发表于 2017-9-30 10:04:44 | 显示全部楼层 |阅读模式

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

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

x
题目:统计长字符串中各个字符出现的次数


程序:
str1 = '''%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+$&[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^{*
@##&{#&{&)*%(]{{([*}@[@&]+!!*{)!}{%+{))])[!^})+)$]#{*+^((@^@}$[**$&^{$!@#$%)!@(&
+^!{%_$&@^!}$_${)$_#)!({@!)(^}!*^&!$%_&&}&_#&@{)]{+)%*{&*%*&@%$+]!*__(#!*){%&@++
!_)^$&&%#+)}!@!)&^}**#!_$([$!$}#*^}$+&#[{*{}{((#$]{[$[$$()_#}!@}^@_&%^*!){*^^_$^
]@}#%[%!^[^_})+@&}{@*!(@$%$^)}[_!}(*}#}#___}!](@_{{(*#%!%%+*)^+#%}$+_]#}%!**#!^_
)@)$%%^{_%!@(&{!}$_$[)*!^&{}*#{!)@})!*{^&[&$#@)*@#@_@^_#*!@_#})+[^&!@*}^){%%{&#@
'''
list1 = []

for each in str1:
    if each not in list1:
        if each == '\n':
            print('\\n', str1.count(each))
        else:
            print(each, str1.count(each))
        list1.append(each)

结果:
% 31
$ 34
@ 38
_ 35
^ 33
# 30
) 34
& 31
! 40
+ 20
] 14
* 34
} 35
[ 18
( 19
{ 34
\n 6
>>>

有哪位能解释下这个程序啊,当执行第一个循环print语句应该就起作用了啊,不能理解为什么是整个计数完成后才print出来结果
最佳答案
2017-9-30 15:51:16
你理解的没错啊,的确是循环一次就打印一次。

但是,但是,但是......:(以你的字符串前5个字符的执行为例:%%$@_......)
1.  count()这个BIF的作用就是统计子字符的出现次数。也就是说,第一轮循环结束时,百分号“%”在字符串中的出现次数已经统计完毕,然后print百分号和它出现的次数,并且把%号添加到list1列表中去了。

2.  第二轮循环就不会再统计%号了,而是$号,然后统计完毕将$添加到list1列表中,防止重复计算;依次类推:接下来就是统计@符号、和下划线_符号。直到所有字符统计完成。

3. 所以每一轮循环结束的时候单个字符的所有统计计数就已经完成了,打印的结果当然就是整个计数完成后的样子。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-30 10:37:53 | 显示全部楼层
代码绝对是边执行边打印的; 我不知道你为什么会理解成   整个计数完成后才print出来结果

2017-09-30_103339.png
如果是CPU运算太块,不如加个sleep:

  1. import time

  2. str1 = '''%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^{*
  3. @##&{#&{&)*%(]{{([*}@[@&]+!!*{)!}{%+{))])[!^})+)$]#{*+^((@^@}$[**^{$!@#$%)!@(&
  4. +^!{%_@^!}$_${)$_#)!({@!)(^}!*^&!$%_&&}&_#&@{)]{+)%*{&*%*&@%$+]!*__(#!*){%&@++
  5. !_)^&%#+)}!@!)&^}**#!_$([$!$}#*^}$+&#[{*{}{((#$]{[$[$()_#}!@}^@_&%^*!){*^^_$^
  6. ]@}#%[%!^[^_})+@&}{@*!(@$%$^)}[_!}(*}#}#___}!](@_{{(*#%!%%+*)^+#%}$+_]#}%!**#!^_
  7. )@)$%%^{_%!@(&{!}$_$[)*!^&{}*#{!)@})!*{^&[&$#@)*@#@_@^_#*!@_#})+[^&!@*}^){%%{&#@
  8. '''
  9. list1 = []

  10. for each in str1:
  11.     if each not in list1:
  12.         time.sleep(2)
  13.         if each == '\n':
  14.             print('\\n', str1.count(each))
  15.         else:
  16.             print(each, str1.count(each))
  17.         list1.append(each)

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

使用道具 举报

 楼主| 发表于 2017-9-30 11:23:48 | 显示全部楼层
ba21 发表于 2017-9-30 10:37
代码绝对是边执行边打印的; 我不知道你为什么会理解成   整个计数完成后才print出来结果

函数意思我都知道,就是不是很清楚他是怎么打印出最后的结果的
我从第一个字符  %  来说

for each in str1:
    if each not in list1:
        if each == '\n':
            print('\\n', str1.count(each))
        else:
            print(each, str1.count(each))
        list1.append(each)

|%是属于str1的,所以执行下面程序
|-- 因为此时list1中无%,则条件符合,执行if内内容
|-- -- %不等于/n,则执行else的内容
|-- -- 执行print(%,strl1.count(%))   此时等于是打印出来了 %  1            
|-- -- list1.append(%)                list1列表里此时有%这个符号了, 所以会跳到最外面那个for语句,检查第二个字符,第二个字符又是%,因为list1里面有%字符了,所以 if each not in list1就为fault,就不会执行了,那以后出现的%还怎么统计
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 15:51:16 | 显示全部楼层    本楼为最佳答案   
你理解的没错啊,的确是循环一次就打印一次。

但是,但是,但是......:(以你的字符串前5个字符的执行为例:%%$@_......)
1.  count()这个BIF的作用就是统计子字符的出现次数。也就是说,第一轮循环结束时,百分号“%”在字符串中的出现次数已经统计完毕,然后print百分号和它出现的次数,并且把%号添加到list1列表中去了。

2.  第二轮循环就不会再统计%号了,而是$号,然后统计完毕将$添加到list1列表中,防止重复计算;依次类推:接下来就是统计@符号、和下划线_符号。直到所有字符统计完成。

3. 所以每一轮循环结束的时候单个字符的所有统计计数就已经完成了,打印的结果当然就是整个计数完成后的样子。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-1 09:37:31 | 显示全部楼层
铁棍阿童木 发表于 2017-9-30 15:51
你理解的没错啊,的确是循环一次就打印一次。

但是,但是,但是......:(以你的字符串前5个字符的执行 ...

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

使用道具 举报

 楼主| 发表于 2017-10-1 09:38:11 | 显示全部楼层
ba21 发表于 2017-9-30 10:37
代码绝对是边执行边打印的; 我不知道你为什么会理解成   整个计数完成后才print出来结果

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 06:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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