Peteryo01223 发表于 2021-1-11 09:11:35

第17课:动动手。我的尝试

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

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

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

    result *= base
   
    print('结果是:', result)

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),请问是哪里写错了。
def mFun(*param):
    result = 0
    if param[:-1] == 5:               # 如果最后一个param是 5
      param = param.pop()         # 那么从param中删除这个 5,以确保这个 5不参与求和计算。
      base = 5                     # 同时,给base赋值为 5
      for each in param:
            result += each
      result = result * base
            
    else:
      base=3
      for each in param:
            result += each
      result = result * base

    print('结果是:', result)

mFun(1, 2, 3, 4, 5)

谢谢~

jackz007 发表于 2021-1-11 09:38:59

本帖最后由 jackz007 于 2021-1-11 09:43 编辑

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

sunrise085 发表于 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,基数不参与求和计算

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

    print('结果是:', result)

mFun(1, 2, 3, 4, 5)

Peteryo01223 发表于 2021-1-11 09:55:03

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

哦哦,那么请问:
1. 小甲鱼code运行结果是75,我觉得是50,哪个是对的呢?
2. 我的修改后,运行值是45,错在哪里了呢?

Peteryo01223 发表于 2021-1-11 09:58:03

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

哦,我好像明白了。谢谢

Peteryo01223 发表于 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。
我本来觉得,这两种方式,表达的是一个意思。没想通。
         

sunrise085 发表于 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

Peteryo01223 发表于 2021-1-11 11:30:05

sunrise085 发表于 2021-1-11 11:13
param[:-1]是切片,得到的是(1,2,3,4),不是5,param[-1]才是最后一个元素
param是元组不是列表,所以 ...

醍醐灌顶!谢谢谢
页: [1]
查看完整版本: 第17课:动动手。我的尝试