函数
函数的参数
- “以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积:
def product(x,y):
return x*y
由于是可以接收一个或多个参数,所以想到定义函数时要用可变参数
def product(*numbers): #这个地方*numbers就是可变参数,函数内部numbers其实是作为一个tuple
sum=1
for number in numbers:
sum=sum*number
return sum
def main():
sum=product(1,2,34)
print("the product of the numbers is {}".format(sum))
main()
递归函数
这里强调一点:使用递归函数的时候,一定要有终止的条件,不然程序就会一直运行下去!!!
2. ”汉诺塔的移动可以用递归函数非常简单地实现。
请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,例如 move(3, ‘A’, ‘B’, ‘C’)
期待输出:
A –> C
A –> B
C –> B
A –> C
B –> A
B –> C
A –> C
汉诺塔的原理很简单:
当n=1时 ,直接:A—>C,只需一步。
当n=2时,我们可以先把上面的小盘子从A—>B ,然后把下面的大盘子从A—>C, 最后再把小盘子从B–>C, 一共需要三步。
当n=3时,我们可以先把上面的两个盘子按照n=2的做法先移动到B,上面已经分析出来 需要三步,(其实也是把n个盘子从一个地方移到另一个地方的一种实现,只不过这里n=2,C变为B了而已) ,然后把最下面的大盘子从A–>C,最后再把上面的两个盘子从B–>C 也是需要三步,总共需要七步。
·······
所以使用递归函数的代码为:
step=0
def move(n,a,b,c):
global step
if n==1: #这个地方就是递归函数调用终止的条件
print(a,'-->',c)
step=step+1
else:
move(n-1,a,c,b) #把上面n-1个从a-->b
move(1,a,b,c) #把最下面一个从a-->c
move(n-1,b,a,c) #把上面n-1个从b-->c
def main():
n=eval(input("please input the numbers of the plates:"))
move(n,'A','B','C') #这里的A B C 表示圆柱
print("the total steps to move the plates from a to c is {}".format(step))
main()
注: 刚开始使用step变量进行计数时发现即使把step变量定义在外边 还是会报错:
UnboundLocalError: local variable ‘step’ referenced before assignment
解决方法参考了这篇博客
高级特性
“构造一个1, 3, 5, 7, …, 99的列表”
def add_list(n):
L=[]
for i in range(1,n,2):
L.append(i)
return L
def main():
n=eval(input("please input the numbers:"))
l=add_list(n)
print(l)
main()
切片
利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
#去除一个字符串首尾空格
def main():
s=input("please input a string :")
s0=trim(s)
print("the string processed is"+s0)
def trimbegin(s):
if s[0]!=' ':
return s
else:
trimbegin(s[1:])
print(s)
def trimend(s):
if s[-1]!=' ':
return s
else:
trimend(s[:-1])
def trim(s):
s1=trimbegin(s)
s2=trimend(s1)
return s2
main()
上面的代码运行不对,,,,明天再看
嗯,犯了三个错误:
首先,