鱼C论坛

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

[已解决]第17课:动动手。我的尝试

[复制链接]
发表于 2021-1-11 09:11:35 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Peteryo01223 于 2021-1-11 09:34 编辑

原题目:
0. 编写一个符合以下要求的函数:
    a) 计算打印所有参数的和乘以基数(base=3)的结果
    b) 如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和计算。

小甲鱼的答案:
  1. def mFun(*param, base=3):
  2.     result = 0
  3.     for each in param:
  4.         result += each

  5.     result *= base
  6.    
  7.     print('结果是:', result)

  8. mFun(1, 2, 3, 4, 5, base=5)
复制代码


运行结果:
结果是: 75

我的问题:
1. 我认为,题目中b)的明确表达了,如:参数最后一个数字是5,则5不进入加法,而要把这个5 作为base来做乘法计算。结果应该是(1+2+3+4)*5 = 50。小甲鱼的运行结果是75,明显在求和的时候,没有移除5,对么?

2. 我的修改如下,但运行值不对(目前是45),请问是哪里写错了
  1. def mFun(*param):
  2.     result = 0
  3.     if param[:-1] == 5:               # 如果最后一个param是 5
  4.         param = param.pop()           # 那么从param中删除这个 5,以确保这个 5不参与求和计算。
  5.         base = 5                     # 同时,给base赋值为 5
  6.         for each in param:
  7.             result += each
  8.         result = result * base
  9.             
  10.     else:
  11.         base=3
  12.         for each in param:
  13.             result += each
  14.         result = result * base

  15.     print('结果是:', result)

  16. mFun(1, 2, 3, 4, 5)
复制代码


谢谢~
最佳答案
2021-1-11 09:54:15
本帖最后由 sunrise085 于 2021-1-11 09:57 编辑

base是带有默认值的关键字参数,关键字参数必须使用关键字传入。若别关键字,就被当做是一般参数了,而这个方法中一般参数都会被打包进param中。
b)说的是如果参数中最后一个参数为(base=5),这是说最后一个参数是关键字参数base=5,不是说最后一个参数为5
其实小甲鱼的这个题目b)有点歧义,容易让人误解,应该写成:b) 如果参数中最后一个参数为(base=x),则设定基数为x,基数不参与求和计算

第二个问题
  1. def mFun(*param):
  2.     result = 0
  3.     if param[-1] == 5:               # 这里错啦!如果最后一个param是 5
  4.         param = param[:-1]           # 这里也错啦!那么从param中删除这个 5,以确保这个 5不参与求和计算。
  5.         base = 5                     # 同时,给base赋值为 5
  6.         for each in param:
  7.             result += each
  8.         result = result * base
  9.             
  10.     else:
  11.         base=3
  12.         for each in param:
  13.             result += each
  14.         result = result * base

  15.     print('结果是:', result)

  16. mFun(1, 2, 3, 4, 5)
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-11 09:38:59 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2021-1-11 09:43 编辑

base 是命名可选参数,不在 param 中,就是说,调用函数的时候,可以不写,但是,如果要写,就一定要写成 base = 5 的样子。
  1. def mFun(* param , base=3):   # 定义
  2. . . . . . . .  
  3. mFun(1,2,3,4,base=5)    # 调用
复制代码

    就是说,base 不可以从 param 中提取。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-11 09:54:15 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2021-1-11 09:57 编辑

base是带有默认值的关键字参数,关键字参数必须使用关键字传入。若别关键字,就被当做是一般参数了,而这个方法中一般参数都会被打包进param中。
b)说的是如果参数中最后一个参数为(base=5),这是说最后一个参数是关键字参数base=5,不是说最后一个参数为5
其实小甲鱼的这个题目b)有点歧义,容易让人误解,应该写成:b) 如果参数中最后一个参数为(base=x),则设定基数为x,基数不参与求和计算

第二个问题
  1. def mFun(*param):
  2.     result = 0
  3.     if param[-1] == 5:               # 这里错啦!如果最后一个param是 5
  4.         param = param[:-1]           # 这里也错啦!那么从param中删除这个 5,以确保这个 5不参与求和计算。
  5.         base = 5                     # 同时,给base赋值为 5
  6.         for each in param:
  7.             result += each
  8.         result = result * base
  9.             
  10.     else:
  11.         base=3
  12.         for each in param:
  13.             result += each
  14.         result = result * base

  15.     print('结果是:', result)

  16. mFun(1, 2, 3, 4, 5)
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-11 09:55:03 | 显示全部楼层
jackz007 发表于 2021-1-11 09:38
base 是命名可选参数,不在 param 中,就是说,调用函数的时候,可以不写,但是,如果要写,就一定要写成 b ...

哦哦,那么请问:
1. 小甲鱼code运行结果是75,我觉得是50,哪个是对的呢?
2. 我的修改后,运行值是45,错在哪里了呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-11 09:58:03 | 显示全部楼层
sunrise085 发表于 2021-1-11 09:54
base是带有默认值的关键字参数,关键字参数必须使用关键字传入。若别关键字,就被当做是一般参数了,而这个 ...

哦,我好像明白了。谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-11 10:15:11 | 显示全部楼层
本帖最后由 Peteryo01223 于 2021-1-11 10:17 编辑
sunrise085 发表于 2021-1-11 09:54
base是带有默认值的关键字参数,关键字参数必须使用关键字传入。若别关键字,就被当做是一般参数了,而这个 ...


多问一句,我想知道Python到底是如何理解我原code的:


我写的:
if param[:-1] == 5: # 这里不是从0的位置,反方向数一个值么?按说,也是对的吧?
   param = param.pop()  # 这里不是pop数列中的最后一个数么,也就是说我删除了它?按说,也是对的吧?

会跟您写的:
if param[-1] == 5:
   param = param[:-1]   

在结果上,为何有差距呢?即:一个是45, 一个是50。
我本来觉得,这两种方式,表达的是一个意思。没想通。
         
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-11 11:13:24 | 显示全部楼层
Peteryo01223 发表于 2021-1-11 10:15
多问一句,我想知道Python到底是如何理解我原code的:

param[:-1]是切片,得到的是(1,2,3,4),不是5,param[-1]才是最后一个元素
param是元组不是列表,所以没有pop方法

你的程序没有进入if,而是进入了else,计算的是1+2+3+4+5的结果,再乘以3,得到的45
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-11 11:30:05 | 显示全部楼层
sunrise085 发表于 2021-1-11 11:13
param[:-1]是切片,得到的是(1,2,3,4),不是5,param[-1]才是最后一个元素
param是元组不是列表,所以 ...

醍醐灌顶!谢谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 13:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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