题目:
输入:一个整数n
求1加到这个整数的和
川川菜鸟的想法:
写一个首相加末项乘以项数除以二的等差数列求和函数
再调用函数,输出返回值
按照他的想法,我写下的代码是:
#序列和
def sum_of_sequence(n):
t = (1+n) * n / 2
return t
n = int(input())
return sum_of_sequence(n)
复述自己的错误:return只能用在函数里,不能用在主程序中
调用函数时要额外借助一个变量,承接函数返回值,并把它转换成int形式,
修改后的代码是:
#序列和
def sum_of_sequence(n):
t = (1+n) * n / 2
return t
n = int(input())
s = int(sum_of_sequence(n))
print(s)
运行正确
自己的试错实践:
1、把主函数中的变量名s换成n会怎么样?
#序列和
def sum_of_sequence(n):
t = (1+n) * n / 2
return t
n = int(input())
n = int(sum_of_sequence(n))
print(n)
输出结果:
没影响,原因及步骤:
输入值赋给n,此时n等于输入值,n被传入函数进行函数运算,返回值又被赋值给变量n,我的疑惑是,那这个n和原来那个n是一个吗?我觉得不是了,这个n是一个新的对象
kimi的回答:
- 原来的 n 和新的 n 是同一个吗?
- 从语义上来说,它们是同一个变量(因为它们共享同一个变量名 n),但它们的值是不同的。
- 原来的 n 是用户输入的值,新的 n 是函数返回的值。
- 这个过程可以理解为:原来的 n 被“覆盖”了,它现在指向了一个新的对象。
- n = int(input()) → n 的值是 5。
- sum_of_sequence(n) 被调用,函数内部的 n 是 5。
- 函数计算 (1 + 5) * 5 / 2 = 15,返回 15。
- n = int(sum_of_sequence(n)) → 全局变量 n 被重新绑定为 15。
- print(n) → 输出 15。
- 全局变量 n 和函数内部的局部变量 n 是不同的。
- 函数返回值重新绑定了全局变量 n,使其指向一个新的对象。
- 从语义上来说,全局变量 n 是同一个变量,但它的值被更新了。
目录
复述自己的错误:return只能用在函数里,不能用在主程序中
要是等差数列的公差不唯1,而是3,那么,在for循环的range里加上一个步长就好了
,主函数的n是全局变量,内层函数的n局部变量承接了全局变量的函数值,传回结果给主函数的全局变量,传回的结果指向一个新的对象。如果用s:就是新的全局变量s承接了这个值;如果用n,就是全局变量n承接了这个值,这个n和原来的n虽然变量名相同,但值被内层函数返回值覆盖,对象也不是一个,仅仅是变量名相同而已。
用sum for循环累加:
思路:初始值等于0,写个循环,一个一个加
#序列和 for循环累加
n = int(input())
sum_n = 0
for i in range(1,n+1):
sum_n += i
print(sum_n)