鱼C论坛

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

[已解决]《零基础python学习》第19讲课后练习疑问

[复制链接]
发表于 2020-2-5 01:35:53 | 显示全部楼层 |阅读模式

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

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

x
练习题:编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数。

                               
登录/注册后可看大图

  1. def count(*var):
  2.     length = len(var)
  3.     for j in range(length):
  4.         number = 0
  5.         letter = 0
  6.         others = 0
  7.         spaces = 0
  8.         # 依次取出传入列表中的每个字符串进行参数判断
  9.         for each in var[j]:
  10.             if each.isalpha():
  11.                 letter += 1
  12.             elif each.isdigit():
  13.                 number += 1
  14.             elif each == ' ':
  15.                 spaces += 1
  16.             else:
  17.                 others += 1
  18.         print('第%d个字符串共有:英文字母%d个,数字%d个,空格%d个,其他字符%d个' % (j + 1, letter, number, spaces, others))


  19. ls = []
  20. x = int(input('请输入参数个数:'))
  21. # 将依次输入的字符串存放在列表中
  22. for i in range(x):
  23.     ls.append(input('请输入第%d个参数:' % (i + 1)))
  24.     i += 1
  25. count(ls)
复制代码
问题:
1.运行后只能输出第一个字符串的结果,之后的都无法输出
2.输出的结果不正确,不知道是我的if语句和print哪里用错了

最佳答案
2020-2-5 11:18:11
试试这样:

  1. def count(*var):
  2.     length = len(var)
  3.     for j in range(length):
  4.         number = 0
  5.         letter = 0
  6.         others = 0
  7.         spaces = 0
  8.         # 依次取出传入列表中的每个字符串进行参数判断
  9.         for each in var[j]:
  10.             if each.isalpha():
  11.                 letter += 1
  12.             elif each.isdigit():
  13.                 number += 1
  14.             elif each == ' ':
  15.                 spaces += 1
  16.             else:
  17.                 others += 1
  18.         print('第%d个字符串共有:英文字母%d个,数字%d个,空格%d个,其他字符%d个' % (j + 1, letter, number, spaces, others))


  19. ls = []
  20. x = int(input('请输入参数个数:'))
  21. # 将依次输入的字符串存放在列表中
  22. for i in range(x):
  23.     ls.append(input('请输入第%d个参数:' % (i + 1)))
  24.     i += 1
  25. count(*ls)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-5 02:28:21 | 显示全部楼层
本帖最后由 jackz007 于 2020-2-5 02:29 编辑

      你这个函数 count(* var) 的输入是收集参数,也就是说,预期的输入参数 var 应该是用逗号隔开的多个字符串,可是,调用的时候,却只用了一个参数:
  1. count(ls)
复制代码

      这就意味着在函数 count(* var) 中,var 就一定是一个参数,这个参数就是列表 ls,所以,函数 count() 内所有的代码行为就会脱离预期。
      解决方法很简单,只要把这一句:
  1. def count(*var):
复制代码

      改成下面这样就好了
  1. def count(var):
复制代码

      也就是把函数的输入参数由收集参数改为普通参数就好了。
      
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 11:18:11 | 显示全部楼层    本楼为最佳答案   
试试这样:

  1. def count(*var):
  2.     length = len(var)
  3.     for j in range(length):
  4.         number = 0
  5.         letter = 0
  6.         others = 0
  7.         spaces = 0
  8.         # 依次取出传入列表中的每个字符串进行参数判断
  9.         for each in var[j]:
  10.             if each.isalpha():
  11.                 letter += 1
  12.             elif each.isdigit():
  13.                 number += 1
  14.             elif each == ' ':
  15.                 spaces += 1
  16.             else:
  17.                 others += 1
  18.         print('第%d个字符串共有:英文字母%d个,数字%d个,空格%d个,其他字符%d个' % (j + 1, letter, number, spaces, others))


  19. ls = []
  20. x = int(input('请输入参数个数:'))
  21. # 将依次输入的字符串存放在列表中
  22. for i in range(x):
  23.     ls.append(input('请输入第%d个参数:' % (i + 1)))
  24.     i += 1
  25. count(*ls)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 13:30:34 | 显示全部楼层
jackz007 发表于 2020-2-5 02:28
你这个函数 count(* var) 的输入是收集参数,也就是说,预期的输入参数 var 应该是用逗号隔开的多个 ...

也就是说传入函数count(*var)的参数必须是2个以上的才能按照预期运行代码,是这个意思吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 13:34:08 | 显示全部楼层

这样改完运行结果是符合预期的,但是我不太明白最后一行count(*ls)这个地方,不管我输入多少个字符串,ls都只是1个列表,只是这个列表的长度不同,为什么把最后一行count(ls)改成可变参数就实现预期了呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 13:35:00 | 显示全部楼层
byramid 发表于 2020-2-5 13:34
这样改完运行结果是符合预期的,但是我不太明白最后一行count(*ls)这个地方,不管我输入多少个字符串,ls ...

count(*ls) 是将列表 ls 拆包。如果 ls 是 [1, 2],那么 count(*ls) 相当于 count(1, 2)。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 13:36:50 | 显示全部楼层
byramid 发表于 2020-2-5 13:30
也就是说传入函数count(*var)的参数必须是2个以上的才能按照预期运行代码,是这个意思吗?

不是,你传进的参数是一个列表,无法按照预期执行代码。

如果你传进了一个字符串,例如 count("abcd123"),也可以按照预期执行代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-4 02:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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