当前位置: 首页 / 技术分享 / 正文
好程序员Python培训分享Python系列之分支和循环结构的应用

2020-06-24

北京Python培训 Python系列

  好程序员Python培训分享Python系列之分支和循环结构的应用通过上两节课的学习,大家对Python中的分支和循环结构已经有了感性的认识。分支和循环结构的重要性不言而喻,它是构造程序逻辑的基础,对于初学者来说也是相对困难的部分。大部分初学者在学习了分支和循环结构后都能理解它们的用途和用法,但是遇到实际问题的时候又无法下手;看懂别人的代码很容易,但是要自己写出同样的代码却又很难。如果你也有同样的问题和困惑,千万不要沮丧,这只是因为你才刚刚开始编程之旅,你的练习量还没有达到让你可以随心所欲的写出代码的程度,只要加强编程练习,这个问题迟早都会解决的。下面我们就为大家讲解一些经典的案例。

Python3

  经典的例子

  寻找水仙花数

  说明:水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身,例如:

图片5

  """

  找出所有水仙花数

  Version: 0.1

  Author: 骆昊

  """

  for num in range(100, 1000):

  low = num % 10

  mid = num // 10 % 10

  high = num // 100

  if num == low ** 3 + mid ** 3 + high ** 3:

  print(num)

  在上面的代码中,我们通过整除和求模运算分别找出了一个三位数的个位、十位和百位,这种小技巧在实际开发中还是常用的。用类似的方法,我们还可以实现将一个正整数反转,例如:将12345变成54321,代码如下所示。

  """

  正整数的反转

  Version: 0.1

  Author: 骆昊

  """

  num = int(input('num = '))

  reversed_num = 0

  while num > 0:

  reversed_num = reversed_num * 10 + num % 10

  num //= 10

  print(reversed_num)

  百钱百鸡问题

  说明:百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?

  """

  《百钱百鸡》问题

  Version: 0.1

  Author: 骆昊

  """

  # 假设公鸡的数量为x,x的取值范围是0到20

  for x in range(0, 21):

  # 假设母鸡的数量为y,y的取值范围是0到33

  for y in range(0, 34):

  z = 100 - x - y

  if 5 * x + 3 * y + z // 3 == 100 and z % 3 == 0:

  print(f'公鸡: {x}只, 母鸡: {y}只, 小鸡: {z}只')

  上面使用的方法叫做穷举法,也称为暴力搜索法,这种方法通过一项一项的列举备选解决方案中所有可能的候选项并检查每个候选项是否符合问题的描述,最终得到问题的解。这种方法看起来比较笨拙,但对于运算能力非常强大的计算机来说,通常都是一个可行的甚至是不错的选择,只要问题的解存在就能够找到它。

  CRAPSdubo游戏

  说明CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上dubo游戏。该游戏使用两粒shaizi,玩家通过摇两粒shaizi获得点数进行游戏。简化后的规则是:玩家diyi次摇shaizi如果摇出了7点或11点,玩家胜;玩家diyi次如果摇出2点、3点或12点,庄家胜;玩家如果摇出其他点数则玩家继续摇shaizi,如果玩家摇出了7点,庄家胜;如果玩家摇出了diyi次摇的点数,玩家胜;其他点数玩家继续摇shaizi,直到分出胜负。

  """

  Crapsdubo游戏

  我们设定游戏开始时玩家有1000元的赌注

  游戏结束的条件是玩家破产(输光所有的赌注)

  Version: 0.1

  Author: 骆昊

  """

  from random import randint

  money = 1000

  while money > 0:

  print(f'你的总资产为: {money}元')

  needs_go_on = False

  # 下注金额必须大于0小于等于玩家总资产

  while True:

  debt = int(input('请下注: '))

  if 0 < debt <= money:

  break

  # diyi次摇色子

  first_point = randint(1, 6) + randint(1, 6)

  print(f'玩家摇出了{first_point}点')

  if first_point == 7 or first_point == 11:

  print('玩家胜!')

  money += debt

  elif first_point == 2 or first_point == 3 or first_point == 12:

  print('庄家胜!')

  money -= debt

  else:

  needs_go_on = True

  # diyi次摇色子没有分出胜负游戏继续

  while needs_go_on:

  needs_go_on = False

  current_point = randint(1, 6) + randint(1, 6)

  print(f'玩家摇出了{current_point}点')

  if current == 7:

  print('庄家胜')

  money -= debt

  elif current == first:

  print('玩家胜')

  money += debt

  else:

  needs_go_on = True

  print('你破产了, 游戏结束!')

  斐波那契数列

  说明:斐波那契数列(Fibonacci sequence),通常也被称作黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)在《计算之书》中研究在理想假设条件下兔子成长率问题而引入的数列,因此这个数列也常被戏称为“兔子数列”。斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,按照这个规律,斐波那契数列的前10个数是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55。斐波那契数列在现代物理、准晶体结构、化学等领域都有直接的应用。

  """

  输出斐波那契数列前20个数

  Version: 0.1

  Author: 骆昊

  """

  # 前两个数都是1

  a, b = 1, 1

  print(a, b, end=' ')

  # 通过递推公式算出后面的18个数

  for _ in range(18):

  a, b = b, a + b

  print(b, end=' ')

  打印素数

  说明:素数指的是只能被1和自身整除的正整数(不包括1)。

  """

  输出100以内的素数

  Version: 0.1

  Author: 骆昊

  """

  for num in range(2, 100):

  # 假设num是素数

  is_prime = True

  # 在2到num-1之间找num的因子

  for factor in range(2, num):

  # 如果找到了num的因子,num就不是素数

  if num % factor == 0:

  is_prime = False

  break

  # 如果布尔值为True在num是素数

  if is_prime:

  print(num)

  简单的总结

  还是那句话:分支结构和循环结构非常重要,是构造程序逻辑的基础,一定要通过大量的练习来达到融会贯通。刚才讲到的CRAPSdubo游戏那个例子可以作为一个标准,如果你能很顺利的完成这段代码,那么分支和循环结构的知识你就已经掌握了。

好程序员公众号

  • · 剖析行业发展趋势
  • · 分享大厂面试心得
  • · 汇聚企业项目源码
  • · 下载全套高精尖教程

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2020-11-16(北京)

    预约报名

    开班时间:2020-09-14(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2020-11-16(深圳)

    预约报名

    开班时间:2020-11-09(北京)

    预约报名
  • JavaEE分布式开发 <高端班>

    开班时间:2020-12-07(北京)

    预约报名

    开班时间:2020-07-20(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2020-07-20(上海)

    开班盛况

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2019-07-22(北京)

    开班盛况

    开班时间:2019-07-15(深圳)

    开班盛况
在线咨询
免费试听
入学教程
立即报名

Copyright 2011-2020 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公安网11010802011455号