已有183人关注
自定义函数中调用Python内置的sum函数时报错
发表在Python图书答疑 2021-09-16 《Python从入门到项目实践》第11章 用函数实现模块化程序设计
是否精华
版块置顶:
def mean(*args):	
	s = sum(args)
	return s / len(args)

#---
d = [1,2,3,4] 		
m = mean(d)

error.png


分享到:
精彩评论 9
TakeMyBreathAway
学分:29 LV2
2021-09-16
沙发

错误提示也是莫名其妙,不支持 int + list 

问题是代码中也没有做 int + list的运算.

python版本是3.9.5


公输政
学分:232 LV4
2021-09-16
板凳

Python的语言格式非常严格,你就是语言格式出错了。变量s前的空格要么是一个Tab键,要么是4个空格键。

还有不能把数组当参数传给函数,只能把数组元素当参数传给函数,你完全就是前者。


修改后的代码:

# 开发人员:公输政
def mean(*args):
    for i in range(len(args)):  # 执行for循环
        s = sum(args[i])  # 数组元素当做参数
    print(s)    # 打印变量s


d = (1, 2, 3, 4)    # 定义数组d
print('数组长度为:')
print(len(d))
print('\n')
print('数组元素的和为:')
mean(d)  # 调用mean函数

运行结果:
结果.PNG


公输政
学分:232 LV4
2021-09-16
地板

TakeMyBreathAway 发表于2021-09-16 00:55

错误提示也是莫名其妙,不支持 int + list 

问题是代码中也没有做 int + list的运算.

python版本是3.9.5


你定义的数组d的数据类型是list,数组d的元素的数据类型是int。

TakeMyBreathAway
学分:29 LV2
2021-09-16
4L

谢谢楼上的朋友 @公输政.


我知道是怎么回事了,我一会解释下,看到的帖子的朋友也能学到知识.


TakeMyBreathAway
学分:29 LV2
2021-09-16
5L

mean函数是求均值.

正确代码是这样的:

def mean(*args):	
	s = sum(*args)
	return s / len(*args)

#---
d = [1,2,3,4] 		
m = mean(d)
print(m)


在mean函数中,args把参数放入到一个元组中,形如:  ([1, 2, 3, 4],)

当调用sum(args)时就会报错 不支持 int+list的运算.

args把参数放入到一个元组中, 这个操作形参了二级指针, 用C++中的写法,加个 * 间接寻址运算符,直接读取原始数据.

测试:

def mean(*args):	
	print(args)  #([1, 2, 3, 4],)
	print(*args) # [1, 2, 3, 4]
	print(len(args))  # 1
	print(len(*args)) # 4
	s = sum(*args)
	return s / len(*args)



TakeMyBreathAway
学分:29 LV2
TakeMyBreathAway
学分:29 LV2
2021-09-16
7L

公输政 发表于2021-09-16 14:55

Python的语言格式非常严格,你就是语言格式出错了。变量s前的空格要么是一个Tab键,要么是4个空格键。

还有不能把数组当参数传给函数,只能把数组元素当参数传给函数,你完全就是前者。


修改后的代码:

# 开发人员:公输政
def mean(*args):
    for i in range(len(args)):  # 执行for循环
        s = sum(args[i])  # 数组元素当做参数
    print(s)    # 打印变量s


d = (1, 2, 3, 4)    # 定义数组d
print('数组长度为:')
print(len(d))
print('\n')
print('数组元素的和为:')
mean(d)  # 调用mean函数

运行结果:
结果.PNG


Python中一切都是对象

函数可以接收任何形式的数据类型包括数组.

TakeMyBreathAway
学分:29 LV2
2021-09-16
8L

另外在书本的P167有写 : 可以在列表的名称前加上"*"

这句话有误导,  是 必须在列表的名称前加上"*"

另外一直正确写法:

mean2.png


game99258
学分:2266 LV10
2022-08-26
9L

观察仔细

首页上一页 1 下一页尾页 9 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照