当前位置: 首页 > article >正文

搬砖5、Python构造程序逻辑

构造程序逻辑

学完前面的几个章节后,我觉得有必要在这里带大家做一些练习来巩固之前所学的知识,虽然迄今为止我们学习的内容只是Python的冰山一角,但是这些内容已经足够我们来构建程序中的逻辑。对于编程语言的初学者来说,在学习了Python的核心语言元素(变量、类型、运算符、表达式、分支结构、循环结构等)之后,必须做的一件事情就是尝试用所学知识去解决现实中的问题,换句话说就是锻炼自己把用人类自然语言描述的算法(解决问题的方法和步骤)翻译成Python代码的能力,而这件事情必须通过大量的练习才能达成。

我们在本章为大家整理了一些经典的案例和习题,希望通过这些例子,一方面帮助大家巩固之前所学的Python知识,另一方面帮助大家了解如何建立程序中的逻辑以及如何运用一些简单的算法解决现实中的问题。

经典的例子

  1. 寻找水仙花数

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

    """
    找出所有水仙花数
    
    Version: 0.1
    Author: YJW
    """
    
    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: YJW
    """
    
    num = int(input('num = '))
    reversed_num = 0
    while num > 0:
        reversed_num = reversed_num * 10 + num % 10
        num //= 10
    print(reversed_num)
    
  2. 百钱百鸡问题。

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

    """
    《百钱百鸡》问题
    
    Version: 0.1
    Author: YJW
    """
    
    for x in range(0, 20):
        for y in range(0, 33):
            z = 100 - x - y
            if 5 * x + 3 * y + z / 3 == 100:
                print('公鸡: %d只, 母鸡: %d只, 小鸡: %d只' % (x, y, z))
    

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

  3. CRAPS赌博游戏

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

    """
    Craps赌博游戏
    我们设定玩家开始游戏时有1000元的赌注
    游戏结束的条件是玩家输光所有的赌注
    
    Version: 0.1
    Author: YJW
    """
    from random import randint
    
    money = 1000
    while money > 0:
        print('你的总资产为:', money)
        needs_go_on = False
        while True:
            debt = int(input('请下注: '))
            if 0 < debt <= money:
                break
        first = randint(1, 6) + randint(1, 6)
        print('玩家摇出了%d点' % first)
        if first == 7 or first == 11:
            print('玩家胜!')
            money += debt
        elif first == 2 or first == 3 or first == 12:
            print('庄家胜!')
            money -= debt
        else:
            needs_go_on = True
        while needs_go_on:
            needs_go_on = False
            current = randint(1, 6) + randint(1, 6)
            print('玩家摇出了%d点' % current)
            if current == 7:
                print('庄家胜')
                money -= debt
            elif current == first:
                print('玩家胜')
                money += debt
            else:
                needs_go_on = True
    print('你破产了, 游戏结束!')
    

###有用的练习

  1. 生成斐波那契数列的前20个数。

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

  2. 找出10000以内的完美数

    说明:完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和(即因子函数)恰好等于它本身。例如:6( 6 = 1 + 2 + 3 6=1+2+3 6=1+2+3)和28( 28 = 1 + 2 + 4 + 7 + 14 28=1+2+4+7+14 28=1+2+4+7+14)就是完美数。完美数有很多神奇的特性,有兴趣的可以自行了解。

  3. 输出100以内所有的素数

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

# 转义字符

# 转义字符
# 描述
# \    (在行尾时)
# 续行符
# \    反斜杠符号
# \'	单引号
# \"	双引号
# \a
# 响铃
# \b
# 退格(Backspace)
# \e
# 转义
# \000
# 空
# \n
# 换行
# \v
# 纵向制表符
# \t
# 横向制表符
# \r
# 回车
# \f
# 换页
# \oyy
# 八进制数,yy代表的字符,例如:\o12代表换行
# \xyy
# 十六进制数,yy代表的字符,例如:\x0a代表换行
# \other
# 其它的字符以普通格式输出

# --------------------------------------------------------------------------------

# 字符串
# 相当于把字符串’地址‘赋值给变量,会有常量池,有过就不会产生变量的地址,节省空间
# s1 = "hello world"
# s2 = s1
# s3 = "hello world1"
# s1 = 'hello world2'
# print(s1)
# print(s2)
# print(s3)
#
# print(id(s1))
# print(id(s2))
# print(id(s3))
#
# print(s1 is s2)


# --------------------------------------------------------------------------------

# # 字符串切片,截取字符串中的某一段字符,
# # index:索引
# s1 = 'ABCDEFGHIJKLMNOPQ'
#
# print('第 1 :' + s1[1])  # 从前往后取
# print('第 2 :' + s1[-1])  # 从后往前取
# print('第 3 :' + str(len(s1)))  # 获取字符串的长度
#
# print('第 4 :' + s1[7:10])  # 取第7、8、9
# print('第 5 :' + s1[:3])  # 从左往右,取第0、1、3
# print('第 6 :' + s1[3:])  # 从左往右,取第3、4、5……
# print('第 7 :' + s1[-3:])  # 从左往右,取倒数第3、2、1……
# print('第 8 :' + s1[:-3])  # 从左往右,取到倒数第三个
#
# print('第 9 :' + s1[-5:-3])  # 从左往右,取到倒数第五个到倒数第三个
# print('第10 :' + s1[1:-3])  # 从左往右,从第一个取到倒数第三个
#
# print('第11 :' + s1[1:-3:2])  # 从左向右,从倒数第三个取到第一个,每两个取一个
# print('第12 :' + s1[6::-2])  # 从左向右,倒着取,相当于将数组倒向
# print('第13 :' + s1[6::-1])  # 从左向右,倒着取,相当于将数组倒向
#
# # s1[A:B:C]
# # C : 正数时从左向右取值,A值的位置要在B值的左侧
# # C : 负数时从右向左取值,A值的位置要在B值的右侧
# # A为空时,则代表起始或者末尾
# # B为空时,则代表起始或者末尾
#
# s2 = s1[:]  # 切片地址不相同
# print(id(s1))
# print(id(s2))
#
# s2 = s1[7:10]  # 切片地址不相同
# print(id(s1))
# print(id(s2))

# --------------------------------------------------------------------------------
# # 常见的用途实例说明
# path = 'http://gips3.baidu.com/it/u=1821127123,1149655687&fm=3028&app=3028&f=JPEG&fmt=auto?w=720&h=1280'
#
# i = path.find('u=')  # 从左向右查找 u=的位置,没找到返回-1
# print(i)
# print(path[i + 2:])
#
# i = path.rfind('/')  # 从右向左查找 ’/‘的位置,没找到返回-1
# print(i)
# print(path[i + 1:])
#
# i = path.count('y')  # 统计指定字符的个数
# print(i)
#
# #index 等同于find,不过,找不到会报错

# --------------------------------------------------------------------------------

# # 字符串判断
# s = 'u=1821127123,1149655687&fm=3028&app=3028&f=JPEG&fmt=auto?w=720&h=1280'
#
# result = s.startswith('u=')  # 是不是以u=开头的?
# print(result)
# result = s.startswith('==')  # 是不是以u=开头的?
# print(result)
#
# result = s.endswith('1280')  # 是不是以u=开头的?
# print(result)
# result = s.endswith('8012')  # 是不是以u=开头的?
# print(result)

# --------------------------------------------------------------------------------
# 扩展应用

'''
模拟文件上传,键盘输入上传文件的名称

扩展名是否是.jpg、.gif、.png如果不是则提示上传失败

判断上传的文件名是否大于6位以上,如果扩展名满足,长度不满足,则随机生成一个6位数的名称,打印某某某上传成功

如果名称长度和扩展名都满足,则打印某某某上传成功
'''
# import random
#
# s = 'qwertyuiopasdfghjklzxcvbnmwertyuiop123456789000000000987654321'
#
# filename = input('请输入图片格式的名称:')
# if filename.endswith('.jpg') or filename.endswith('.gif') or filename.endswith('.png'):
#     print('输入的文件名称为' + filename)
#     kuozhan = filename[filename.find('.'):]
#     name = filename[:filename.find('.')]
#     if len(name) < 6:
#         # 产生随机字母数字的组合
#         for i in range(6):
#             file = ''
#             index = random.randint(0, len(s) - 1)
#             file += s[index]
#         #将扩展名加上取
#         filename = file + kuozhan
#         print('文件名称被重置~~~~~')
#     else:
#         print('文件名称正确~~~~~')
#
#     print('上传成功,上传的文件名称为' + filename)
# else:
#     print('对不起,上传的文件格式错误!')

# --------------------------------------------------------------------------------
# import random
# s = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890'
# file = ''
# # 产生随机大小写字母数字的组合字符串
# for i in range(6):
#     index = random.randint(0, len(s) - 1)
#     file += s[index]
# print(file)
# --------------------------------------------------------------------------------
s = 'ABCDE'
result = s.isalpha()  # 是否全是字母组合
print(result)

s = 'Qqwer12'
result = s.isalnum()  # 是否全是数字+字母组合
print(result)

s = '12345'
result = s.isdigit()  # 是否全是数字组合
print(result)

s = '     '
result = s.isspace()  # 是否全是空格组成,全是空格返回Ture,否则返回Flase
print(result)


http://www.kler.cn/news/321922.html

相关文章:

  • 【JavaScript】LeetCode:41-45
  • C#-__DynamicallyInvokable
  • 【深度学习基础模型】Autoencoders (AE) 详细理解并附实现代码。
  • 大数据:快速入门Scala+Flink
  • Iceberg 基本操作和快速入门
  • 8.11 矢量图层线要素单一符号使用四(短划线)
  • Java语言的Springboot框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码
  • 安全帽检测系统丨OPENAIGC开发者大赛高校组AI创作力奖
  • 机器学习实战:使用Python和scikit-learn构建预测模型
  • [单master节点k8s部署]27.Istio流量管理(三)
  • ElementUI el-tree 树组件 增加辅助线
  • Docker与Kubernetes学习
  • 网络基础概念和 socket 编程
  • 前端——js基础
  • 三维扫描 | 解锁低成本、高效率的工作秘籍
  • WPF项目中使用Caliburn.Micro框架实现日志和主题切换
  • 论文解析_客户分组对商业银行个人信用评分模型的提升作用研究,作者张亚京-中国人民银行征信中心博士后工作站
  • 数据仓库适用的业务场景
  • 【高分系列卫星简介】
  • 系统架构设计师 SOA与微服务架构篇
  • Spark-RDD持久化
  • IDEA2020运行项目时不从配置的maven仓库找jar包,从C盘默认路径下找jar包
  • 使用 React useEffect 实现条件判断的最佳实践
  • c语言200例 64
  • 示例说明:sql语法学习
  • 9.sklearn-K-means算法
  • 人员个体检测、PID行人检测、行人检测算法样本
  • c++----继承(初阶)
  • 开源 AI 智能名片 S2B2C 商城小程序与营销工具的快速迭代
  • 其实你不懂老板的心——解释器模式