鱼C论坛

 找回密码
 立即注册
查看: 1672|回复: 6

[已解决]关于程序异常的问题

[复制链接]
发表于 2017-4-9 20:31:36 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 hikaru2015 于 2017-4-9 20:39 编辑

#求一个列表中各个字符串分别包含的数字,字母和特殊符号数量,下面三个其实都是一个函数和同一个参数(以 kk = ['sdf3','fg45','fg@3'] 为例),只是开头的参数录入方式不同,造成了三个不同的输出结果,是什么原因?
def count(*param):
    symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
    chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    nums = '0123456789'
    n = 0 #数字
    c = 0 #字母
    s = 0 # 特殊符号
    ss = 0 # 空格
    for each in param:
            for each1 in each:
                    if each1 in chars:
                            c += 1
                    elif each1 in nums:
                            n += 1
                    elif each1 ==' ':
                            ss +=1
                    elif each1 in symbols:
                            s +=1
                print(n,c,ss)

返回结果 :
>>> count(kk)
         0 0 0


但如果改为这样:
kk = ['sdf3','fg45','fg@3']
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
n = 0 #数字
c = 0 #字母
s = 0 # 特殊符号
ss = 0 # 空格
for each in kk:
        for each1 in each:
                if each1 in chars:
                        c += 1
                elif each1 in nums:
                        n += 1
                elif each1 ==' ':
                        ss +=1
                elif each1 in symbols:
                        s +=1                
        print(n,c,ss)

则可以正常显示:
1 3 0
3 5 0
4 7 0


如果将程序改为
temp = input('请输入一个列表')
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
n = 0 #数字
c = 0 #字母
s = 0 # 特殊符号
ss = 0 # 空格
for each in temp:
        for each1 in each:
                if each1 in chars:
                        c += 1
                elif each1 in nums:
                        n += 1
                elif each1 ==' ':
                        ss +=1
                elif each1 in symbols:
                        s +=1                
        print(n,c,ss)

输出结果:
请输入一个列表['sdf3','fg45','fg@3']
0 0 0
0 0 0
0 1 0
0 2 0
0 3 0
1 3 0
1 3 0
1 3 0
1 3 0
1 4 0
1 5 0
2 5 0
3 5 0
3 5 0
3 5 0
3 5 0
3 6 0
3 7 0
3 7 0
4 7 0
4 7 0
4 7 0


为何同一个函数,参数输入方式不同,得到的结果大相径庭呢?
最佳答案
2017-4-10 09:39:42
你第一份代码在定义count函数参数时使用了*,导致你传进来的param把你的整个列表参数当做一个参数组成一个元组,for each in param 的each的值只会是一个,就是你的列表['sdf3','fg45','fg@3'],后边的each1每个就是列表中的每个值,导致比较结果最终是0 0 0
第二和第三份代码的区别在于你用了input输入整个列表,但是你没有转换成列表类型,python3中input的返回的都是字符串类型,相当于你的temp的值是r'['sdf3','fg45','fg@3']'这样,所以你的循环统计就是每个字符,包括了'和[,但是你的输出没有特殊符号,所以没有体现出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-9 20:44:22 | 显示全部楼层
@冬雪雪冬 @lumber2388779 @ooxx7788 @gopythoner
召唤术~
为什么...好神奇~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 22:25:16 | 显示全部楼层
把第一行改为:
def count(param):
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 09:14:38 | 显示全部楼层
冬雪雪冬 发表于 2017-4-9 22:25
把第一行改为:
def count(param):

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

使用道具 举报

发表于 2017-4-10 09:18:51 | 显示全部楼层

我试了是可以的。
1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 09:39:42 | 显示全部楼层    本楼为最佳答案   
你第一份代码在定义count函数参数时使用了*,导致你传进来的param把你的整个列表参数当做一个参数组成一个元组,for each in param 的each的值只会是一个,就是你的列表['sdf3','fg45','fg@3'],后边的each1每个就是列表中的每个值,导致比较结果最终是0 0 0
第二和第三份代码的区别在于你用了input输入整个列表,但是你没有转换成列表类型,python3中input的返回的都是字符串类型,相当于你的temp的值是r'['sdf3','fg45','fg@3']'这样,所以你的循环统计就是每个字符,包括了'和[,但是你的输出没有特殊符号,所以没有体现出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 10:18:31 | 显示全部楼层

我那个程序退格有点错误,修改后可以了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-19 08:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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