这篇博客记录廖雪峰python教程的习题(一)

这篇博客介绍了学习廖雪峰Python教程的过程,涉及函数的参数、递归函数(如汉诺塔问题)、高级特性如切片、迭代、列表生成式、生成器等概念,并通过实例展示了如何解决相关问题。文章还提到了在编程过程中遇到的错误和解决方案,以及对智商的自我调侃。
摘要由CSDN通过智能技术生成

函数

函数的参数

  1. “以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积:
    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()

上面的代码运行不对,,,,明天再看

嗯,犯了三个错误:
首先,

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值