【Python基础:语法第二课】Python 流程控制详解:条件语句 + 循环语句 + 人生重开模拟器实战


🎬 个人主页艾莉丝努力练剑
专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:


文章目录

  • [1 ~> 顺序语句](#1 ~> 顺序语句)
  • [2 ~> 条件语句](#2 ~> 条件语句)
    • [2.1 什么是条件语句](#2.1 什么是条件语句)
    • [2.2 语法格式](#2.2 语法格式)
      • [2.2.1 语法格式的概念](#2.2.1 语法格式的概念)
      • [2.2.2 最佳实践](#2.2.2 最佳实践)
      • [2.2.3 为什么要有语法格式?](#2.2.3 为什么要有语法格式?)
    • [2.3 缩进和代码块](#2.3 缩进和代码块)
      • [2.3.1 缩进和代码块的概念](#2.3.1 缩进和代码块的概念)
      • [2.3.2 最佳实践(含缩进和代码块讲解)](#2.3.2 最佳实践(含缩进和代码块讲解))
    • [2.3.3 缩进是一把双刃剑](#2.3.3 缩进是一把双刃剑)
    • [2.4 条件语句练习](#2.4 条件语句练习)
      • [2.4.1 输入一个整数, 判定是否是奇数](#2.4.1 输入一个整数, 判定是否是奇数)
      • [2.4.2 输入一个整数, 判定是正数还是负数](#2.4.2 输入一个整数, 判定是正数还是负数)
      • [2.4.3 判定年份是否是闰年](#2.4.3 判定年份是否是闰年)
    • [2.5 空语句pass](#2.5 空语句pass)
    • [2.5.1 理论](#2.5.1 理论)
    • [2.5.2 最佳实践](#2.5.2 最佳实践)
    • [2.6 条件语句小结](#2.6 条件语句小结)
  • [3 ~> 循环语句](#3 ~> 循环语句)
    • [3.1 while循环](#3.1 while循环)
      • [3.1.1 条件结束符[ : ]](#3.1.1 条件结束符[ : ])
      • [3.1.2 基本格式](#3.1.2 基本格式)
      • [3.1.3 最佳实践](#3.1.3 最佳实践)
        • [3.1.3.1 打印1 ~ 10的整数](#3.1.3.1 打印1 ~ 10的整数)
        • [3.1.3.2 计算1 ~ 100的和](#3.1.3.2 计算1 ~ 100的和)
        • [3.1.3.3 计算5的阶乘](#3.1.3.3 计算5的阶乘)
        • [3.1.3.4 求和1! + 2! + 3! + 4! + 5!](#3.1.3.4 求和1! + 2! + 3! + 4! + 5!)
    • [3.2 for循环](#3.2 for循环)
      • [3.2.1 基本语法格式](#3.2.1 基本语法格式)
      • [3.2.2 Python的for循环的相关注意事项](#3.2.2 Python的for循环的相关注意事项)
      • [3.2.3 最佳实践](#3.2.3 最佳实践)
    • [3.3 continue](#3.3 continue)
      • [3.3.1 概念](#3.3.1 概念)
      • [3.3.2 最佳实践](#3.3.2 最佳实践)
    • [3.4 break](#3.4 break)
      • [3.4.1 概念](#3.4.1 概念)
      • [3.4.2 最佳实践](#3.4.2 最佳实践)
    • [3.5 循环语句总结](#3.5 循环语句总结)
  • [3 & 4 ~> 模块相关内容](#3 & 4 ~> 模块相关内容)
  • [4 ~> 小游戏:人生重开模拟器](#4 ~> 小游戏:人生重开模拟器)
    • [4.0 说明](#4.0 说明)
      • [4.0.1 前情提示](#4.0.1 前情提示)
      • [4.0.2 游戏策划吃不吃香?](#4.0.2 游戏策划吃不吃香?)
    • [4.1 设置初始属性](#4.1 设置初始属性)
      • [4.1.1 理论](#4.1.1 理论)
      • [4.1.2 实践](#4.1.2 实践)
    • [4.2 设置性别(随机)](#4.2 设置性别(随机))
      • [4.2.1 理论](#4.2.1 理论)
      • [4.2.2 最佳实践](#4.2.2 最佳实践)
    • [4.3 设置出生点](#4.3 设置出生点)
      • [4.3.1 理论](#4.3.1 理论)
      • [4.3.2 最佳实践](#4.3.2 最佳实践)
    • [4.4 针对每一年生成随机的人生经历(一年一件大事)](#4.4 针对每一年生成随机的人生经历(一年一件大事))
      • [4.4.1 理论](#4.4.1 理论)
      • [4.4.2 最佳实践](#4.4.2 最佳实践)
    • [4.5 完整代码展示及运行结果](#4.5 完整代码展示及运行结果)
      • [4.5.1 完整代码展示](#4.5.1 完整代码展示)
      • [4.5.2 效果演示](#4.5.2 效果演示)
  • 结尾


1 ~> 顺序语句

默认情况下,Python的代码执行顺序是按照从上到下的顺序依次执行的(代码编写的大前提条件)。

举个例子------

python 复制代码
print('111')
print('222')
print('333')

这个顺序是不会乱的,和人生一样,出生、上学、工作、结婚、生子......这里的顺序一旦乱了,就很麻烦,而且也不大对劲哈哈。光有这样一个顺序我们很难完成一些特殊的功能-->在此顺序的基础之上,引入了条件和循环,可以让我们的顺序有更多的执行的可能性。

执行结果一定为 "123",而不会出现 "321" 或者 "132" 等。这种按照顺序执行的代码,我们称为 顺序语句


2 ~> 条件语句

2.1 什么是条件语句

条件语句能够表达"如果 ... 否则 ..."这样的语义。这构成了计算机中基础的逻辑判定。

条件语句也叫做分支语句,表示了接下来的逻辑可能有几种走向。

bash 复制代码
如果我认真敲代码
   我就很容易找到工作
否则
   我就容易毕业就失业

虽然结构变了, 但是整体表达的语义是等价的。

bash 复制代码
# 如果 我认真敲代码     -->这是一个条件,如果条件成立,就会容易找到工作
#     我就很容易能够找到工作
# 否则
#     我就容易毕业就失业 -->条件不成立,就容易毕业就失业

# 如果 我选择躺平摆烂     -->这也是一个条件,如果条件成立,容易毕业就失业
#     我就容易毕业就失业
# 否则
#     我就很容易能够找到工作-->条件不成立,就很容易能够找到工作

# 条件语句,就是根据一个具体条件的成立与否,来决定接下来的逻辑走向

# 认真敲代码,真的很容易能够找到工作吗?
# 是的
# 对于在校大学生来说------大四的上学期开学(9月份左右)-->最黄金的时间,校招/秋招 --> 机会特别多!
# 躺平摆烂的同学,就容易毕业就失业

2.2 语法格式

2.2.1 语法格式的概念

Python 中使用 if、else 关键字表示条件语句,else if被合并成写作elif了。

bash 复制代码
# 语法格式(比较有特点,要去体会一下)
# if、if-else、if-elif-else
# if后面的条件表达式,没有(),使用:作为结尾
# if / else命中条件后要执行的"语句块",使用缩进(通常是四个空格或者一个Tab[制表符])来表示,而不是{}
# 对于多条件分支,不是写作else if,而是elif(合体了)-->这里的写法要注意和其他语言作区分



注意:Python中的条件语句写法,和很多编程语言不太一样。

if 后面的条件表达式,没有( ),使用:作为结尾;

if / else 命中条件后要执行的 "语句块",使用 缩进 (通常是4个空格或者1个 tab)来表示,而不是 { };

对于多条件分支,不是写作 else if,而是 elif (合体了)

2.2.2 最佳实践

我们举个条件语句的例子------

示例:让用户输入一个数字,如果输入1表示愿意认真学习,输入2表示像躺平摆烂------

bash 复制代码
# 举个条件语句的例子

# 让用户输入一个数字,如果输入1 表示愿意认真学习,输入2 表示像躺平摆烂

# choice = input("输入1表示愿意认真学习,输入2表示像躺平摆烂:")
#
# # 注意这里要比较的是字符串1,不是整数1
# if choice == '1':
#     print('你能够找到好工作')
# else:
#     print('你可能毕业就失业了')
# 实际开发中,用户的输入,很有可能是出乎意料的!!!
# 本来我们希望用户输入的是1或者2,但是用户实际输入了3(用户实际使用中可能会有各种出乎意料的操作)

choice = input("输入1表示愿意认真学习,输入2表示像躺平摆烂:")

# 注意这里要比较的是字符串1,不是整数1
if choice == '1':
    print('你能够找到好工作')
elif choice == '2':
    print('你可能毕业就失业了')
else:
    # 除了1和2,其它的情况都算非法情况
    print('您的输入有误!请重新输入!')
# 对于非法情况的判定,也是非常必要的!你永远不知道用户会如何进行操作!我们得尽可能考虑到所有的情况

# 代码写得不好肯定是你程序员来背锅,不可能让用户来背锅!所以,考虑要周全

2.2.3 为什么要有语法格式?

2.3 缩进和代码块

2.3.1 缩进和代码块的概念

代码块指的是:一组放在一起执行的代码。

在 Python 中使用缩进表示代码块。不同级别的缩进,程序的执行效果是不同的。

2.3.2 最佳实践(含缩进和代码块讲解)

python 复制代码
# 缩进和代码块

a = input("请输入一个整数:")
if a == '1':
    # 带有缩进的情况-->如果条件成立,那么aaaa和bbbb都会打印
    # 如果条件不成立,那么都不会打印!
    print('aaaa')
    print('bbbb')
# 没有缩进的情况-->无论条件是否有关,都要执行
# cccc是和条件无关了,条件是否成立都会打印cccc,已经是不属于条件语句中的内容了!
print('cccc')
# 如果反过来就不行了,会报错
# print('dddd')
#     print('eeee')
#     # 直接出现报错的情况:
#     # IndentationError: expected an indented block after 'if' statement on line 4
#     # expected(预期) an indented block(缩进块)
      # 它期望在"if"后面用一个缩进块
# Python中缩进是非常重要的!!!也是不能随便乱写的!
    # 另一种报错:IndentationError: unexpected indent(不预期的缩进)
    # print('ffff')
    #    print('gggg')
# 在Pyhton中,缩进表示代码块
# 在if,else,elif,while,for......需要跟上代码块的部分,都是需要使用缩进来表示的
# 在C++/Java中,对于代码缩进是没有强制要求的,缩进具体怎么写都不影响代码的编译运行结果
# 如果缩进没有好好的统一风格来写,也是对于可读性比较影响
# 在其他语言中,缩进作为一个软性要求(一般也要求把代码写得缩进尽量统一一点)
# 在Pyhton中,缩进作为一个硬性要求

# Python中的代码块还可以嵌套
# a = input("请输入第一个整数:")
# b = input("请输入第二个整数:")
#
# if a == '1':
#     # 这一整段都是if a == '1'这个语句里的内容
#     # 条件成立则执行这一段代码
#     # 这一段代码里又有了一个if
#     if b == '2':
#         # 第二个条件中的代码块
#         print("aaa")
#     print("bbb")
# print("ccc")
# # 两个条件都满足,才会打印aaaa,因为打印aaaa的语句有两级缩进,相当于是if b == '2'条件内部的代码块
# # 第一个条件满足,就会打印bbbb,因为打印bbbb的语句只有一级缩进,相当于是if a == '1'条件内部的代码块
# # 两个条件即使都不满足,也能打印cccc,因为打印cccc的语句,没有缩进,相当于和两个if都无关,因此会继续执行打印

# 当我们有多级条件嵌套的时候,当前的语句属于哪个代码块,完全取决于缩进的级别!
# 这个代码就是一个多重条件的嵌套
# 根据层次判别出当前属于哪段代码,从而理解它在什么样的情况下才会被执行到
# if a == 1:
#     if b == 2:
#         if c == 3:
#             if d == 4:
#                 if e == 5:
#                     if f == 6:
#                         if g == 7:
#                             print("hello")
#                     print("1")
#         print("2")
# 由于嵌套的层数太多了,这俩语句对应哪一级代码块,其实是并不容易观察的!!
# 因此这里的写法更容易出错--->相比于C++ / java中的{}的写法
# Python工程师的"游标"段子:看这段缩进多长就是几级缩进
# 在实际开发中还是要尽量避免写出这种嵌套关系这么复杂的代码的!!确实可读性还是比较差的!!!

2.3.3 缩进是一把双刃剑

基于缩进的方式表示代码块,带来的好处就是强制要求程序猿要写明确的缩进,来明确代码之间的相对关系。如果缩进书写的不对,则直接报错。

像 C++ / Java 这些语言,即使完全不写缩进,语法也不会报错,主要是这样代码可读性就比较差。

同时,带来的坏处就是,如果缩进层次比较多,就容易分不清楚某个语句属于哪个层级。

python 复制代码
if a == 1:
    if b == 2:
        if c == 3:
            if d == 4:
                if e == 5:
                    if f == 6:
                        if g == 7:
                   print("hello")
                    print("1")
     print("2")

请问,上述代码中的 print("1") 和 print("2") 属于哪一级缩进?

是不是很难看出来?因此,就诞生了"写 Python 需要自备游标卡尺"这个段子。

2.4 条件语句练习

2.4.1 输入一个整数, 判定是否是奇数

python 复制代码
a = input("请输入一个整数:")   # 报错:TypeError: not all arguments converted during string formatting
a = int(input("请输入一个整数:"))  # 问题解决

if a % 2 == 0:
    print("偶数")  # 除尽
else:
    print("奇数")  # 除不尽

反过来可不可以呢?这个代码在C++/Java中是不太行的------

python 复制代码
if a % 2 == 1:
    print("奇数")  # 除尽
else:
    print("偶数")  # 除不尽
bash 复制代码
# 那余一个负数呢?
# 输出:奇数
# -19 % 2 =>-1,和1是不相等的
# 在 Python 中
# -19 % 2 =>1
# 因此这个代码是ok的!

# 用户输入啥都有可能,如果输入一个字符串呢?
# 报了一个异常-->ValueError: invalid literal for int() with base 10: 'abc'
# with base 10:按照十进制来解析的
# int()转换默认是按照十进制的方式来解析的

2.4.2 输入一个整数, 判定是正数还是负数

python 复制代码
a = int(input("请输入一个整数:"))
if a > 0:
    print("正数")
elif a < 0:
    print("负数")
else:
    print("0")

2.4.3 判定年份是否是闰年

两种写法------

python 复制代码
year = int(input("请输入一个年份:"))
if year % 100 == 0:
    # 世纪闰年的判定
    if year % 400 == 0:
        print("闰年")
    else:
        print("平年")
else:
    # 普通闰年的判定
    if year % 4 == 0:
        print("闰年")
    else:
        print("平年")

另一种写法------

python 复制代码
year = int(input("请输入一个年份:"))
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
    print("闰年")
else:
    print("平年")

上面关于闰年的代码,个人感觉还是第一种方法更好。我们还是不要用代码的行数来衡量可读性

第一种方法这一段代码,目的性更明显,平铺直叙;

第二种方法这一段代码虽然代码变短了,但是中间夹杂了一些更复杂的条件判定,可读性不如第一种方法。

2.5 空语句pass

2.5.1 理论

2.5.2 最佳实践

python 复制代码
# 空语句pass

# 输入一个数字, 如果数字为 1, 则打印 hello

# 单一个if语句
# a = input("请输入一个数字:")
# if a == '1':
#     print("hello")

# 歪脑筋
a = input("请输入一个数字:")
if a == '1':
    # 啥都不做
    # 虽然希望条件满足的时候,啥都不做,但是由于Python对于语法格式尤其是缩进和代码块要求较高,
    # 所以如果啥都不写(只写个注释)是不符合语法要求的
    # 这种情况下,可以使用空语句进行占位
    pass
    # 在写条件或者循环的时候
    # 很多地方都是如此,虽然我们啥都不想做,但是也得写个pass空语句来占位!防止空着导致代码编译出错
else:
    print("hello")
# 报错:IndentationError: expected an indented block after 'if' statement on line 12
# expected an indented block after 'if':预期应该有一个带有缩进的代码块在if后面

pass表示空语句,并不会对程序的执行有任何影响,只是占个位置,保持 Python 语法格式符合要求。


2.6 条件语句小结

bash 复制代码
# 条件语句小结

# if
#
# if
# else
#
# if
# elif
# else

# if 条件:
# 代码块
# if 条件:
# 代码块1
# else:
# 代码块2
#
# if条件1:
# 代码块1
# elif 条件2:
# 代码块2
# else:
# 代码块3

# 在其他语言那里,switch也能表示多个分支,之所以没有提供
# 原因和前面说的一样,还是基于Python的设计哲学:解决一个问题只采取一种方案
# 既然if/else已经足够好用,因此我们使用这个if/else就足以解决开发中的各种问题啦

3 ~> 循环语句

有些操作是需要反复执行的,这种就需要使用循环。

3.1 while循环

3.1.1 条件结束符[ : ]

Python中":"很常用,很多时候是作为[条件结束]的这样一个概念。因为Python中没有"()",从哪到哪是一个条件需要一个区分------":"。

3.1.2 基本格式

python 复制代码
while 条件:
    循环体

条件为真,则执行循环体代码;条件为假,则结束循环。

3.1.3 最佳实践

3.1.3.1 打印1 ~ 10的整数
python 复制代码
# 打印1 ~ 10的整数

# 这是一个最简单的while循环语句
# 实际上暗藏玄机-->包含了循环最基本的条件
# 1. 循环变量的初始值
# 2. 循环的判定条件
# 3. 循环变量的更新语句
# num = 1
# while num <= 10:
#     print(num)
#     num = num + 1

# 如果把最后的num = num + 1注释掉会怎么样?-->会死循环1,要点击红色正方形终止,并且编译器会报一个警告
# 死循环报错:
# Traceback (most recent call last):
#   File "D:\Python_code\python_code\code23.py", line 24, in <module>
#     print(num)
# KeyboardInterrupt
# 由于忘记写了更新循环变量的语句
# 循环会一直执行,停不下来了,直到手动强制结束程序
# 形如这样的代码就叫做"死循环"代码
# num = 1
# while num <= 10:
#     print(num)
#     # num = num + 1
# 死循环很多时候是bug。也有些时候不是bug
# 像我们现在学习的时候写的死循环是bug,但是像服务器(7 * 24小时运行)一直等着客户端连过来
# -->因此服务器的代码中经常需要一些死循环,保证程序是在不断运行、不断工作的
3.1.3.2 计算1 ~ 100的和
python 复制代码
# 计算1 ~ 100的和
# sum变量用于表示计算的和
# sum = 0
# num = 1
# while num <= 100:
#     sum = sum + num
#     num += 1
#
# print(f'sum = {sum}')
# # 运行结果:5050
3.1.3.3 计算5的阶乘
python 复制代码
# 计算5的阶乘
# result = 1
# num = 1
# while num <= 5:
#     result *= num
#     num += 1
# print(f'result = {result}')
3.1.3.4 求和1! + 2! + 3! + 4! + 5!
python 复制代码
# 求和1! + 2! + 3! + 4! + 5!
num = 1
# sum表示最终的加和结果
sum = 0
# 两层循环,外层循环来控制加和
while num <= 5:
    # 先计算出当前num!是多少,往sum上进行累加
    # factorResult表示n!的值
    factorResult = 1
    i = 1
    # 内存循环来控制求阶乘
    while i <= num:
        factorResult *= i
        i += 1
    sum += factorResult
    num += 1

print(f'sum = {sum}')

这个程序用到了两重循环,也就是在循环语句中也可以套循环。

3.2 for循环

3.2.1 基本语法格式

python 复制代码
for 循环变量 in 可迭代对象:
    循环体

3.2.2 Python的for循环的相关注意事项

Python的 for 和其他语言不同,没有"初始化语句","循环条件判定语句","循环变量更新语句"。而是更加简单。

所谓的"可迭代对象",指的是"内部包含多个元素,能一个一个把元素取出来的特殊变量"。

Pycharm于是会自动识别出那些词是需要自动修改------

3.2.3 最佳实践

python 复制代码
# 打印1 ~ 10
# range也是Python内建函数,起到的效果就是得到一个"可迭代对象",这个可迭代对象中就包含了一系列的整数
# range(beg, end) => [beg, end),注意这里是前闭后开区间,包含前面的,不包含后面的
# for i in range(1,11):
#     print(i)

# range 还提供了第三个参数,表示"步长"默认的步长值是1
# 打印2,4,6,8,10
# for i in range(2,12,2):     # 控制步长为2
#     print(i)

# 打印从 10 到 1
# while循环
# num = 10
# while num >= 1:
#     print(num)
#     num -= 1

# for循环
# for i in range(10, 0,-1):
#     print(i)

# 求1 + 2 + 3 + ... + 100
theSum = 0     # 当前有个内建函数,sum-->当前有个Python的内建函数sum
# 咱们自己定义的变量和内建函数冲突了!虽然不影响运行,但是代码后面就无法使用内建函数sum
for i in range(1,101):
    # 使用shift+F6可以针对变量进行重命名-->会智能的分析咱们的代码,自动的把所有需要修改的名字都统一替换了
    # 比手动修改方便很多
    # 有的uu的笔记本电脑,F6比较别扭,没法直接按-->可能是亮度之类的功能键,需要搭配Fn+F6
    theSum += i

    print(f'sum = {theSum}')

3.3 continue

3.3.1 概念

continue 表示结束这次循环,进入下次循环。

3.3.2 最佳实践

代码示例1:模拟吃包子,吃 5 个包子,当我们吃第 3 个包子的时候吃出了一只虫------

python 复制代码
# 假设我要吃 5 个包子
for i in range(1,6):
    if i == 3:
        # 发现第三个包子,有一只虫
        continue
    print(f'吃第{i}个包子')

3.4 break

3.4.1 概念

break 表示结束整个循环。

3.4.2 最佳实践

代码示例2:还是要吃 5 个包子,发现第三个包子,有半只虫------

python 复制代码
# 还是要吃 5 个包子
for i in range(1,6):
    if i == 3:
        # 发现第三个包子,有半只虫
        break
    print(f'吃第{i}个包子')

代码示例3:给定若干个数字,求平均值(也不知道几个数字),使用"分号"作为结尾------

python 复制代码
# 给定若干个数字,求平均值(也不知道几个数字)
# 这个变量表示加和的结果
theSum = 0
# 这个变量表示有几个数字
count = 0
while True:     # 会不会变成死循环?光看到while True 不一定是死循环,关键是看循环体里是不是还能break
    # 没啥营养,但却要反复执行的
    num = input("请输入一个数字(分号表示输入结束):")
    if num == ";":
        # 约定当用户输入 ; 的时候,表示输入结束
        break
    num = float(num)
    theSum += num
    count += 1

print(f'平均值为:{theSum / count}')

3.5 循环语句总结

python 复制代码
# 循环语句总结
# Python表示循环,有两种方法
# while     while条件:
#               循环体

# for       for循环变量in可迭代对象(range可以生成一个包含整数序列的可迭代对象):
#              循环体

# 用conitnue、break来完成循环更加丰富的操作

# 在C++或者Java里,for循环如下所示-->
# for(初始化循环变量;循环条件;循环变量更新){
# 循环体
# }
# do while
# C语言里有个特殊操作,goto语句,通过goto也能实现循环的效果,
# 但是由于goto如果用多了,是非常难以理解的(尤其是控制goto往代码前面跳)
# 一般情况下都是不建议使用goto的

3 & 4 ~> 模块相关内容

Pycharm会自动到入模块,不需要我们手动添加。


4 ~> 小游戏:人生重开模拟器

4.0 说明

4.0.1 前情提示

学习了前面条件判断、循环部分的内容,我们来实现一下"人生重开模拟器"。

就像C语言学完二维矩阵之后写的"扫雷游戏"一样,"人生重开模拟器"也可以侧面反映出uu们Python的学习掌握情况。

这是一款很久之前很火的文字类小游戏:玩家输入角色的初始属性之后,就可以开启不同的人生经历。

uu们可以在网上搜索"人生重开模拟器",就可以玩到这个游戏的各种版本!做之前可以先去玩一玩,感受一下游戏的机制和玩法。

完整的程序代码较多,此处我们只实现其中的一部分逻辑(最后的各个年龄段的人生经历艾莉丝这里只实现幼年期的,uu们可以试着把"人生重开模拟器"中主人公各个年龄段的人生经历都实现一下哦!)

4.0.2 游戏策划吃不吃香?

4.1 设置初始属性

4.1.1 理论

我们约定每个属性的范围为[1 , 10],并且总和不能超过 20。

如果玩家输入的初始属性不合理, ,就提示输入有误,需要重新输入。

4.1.2 实践

python 复制代码
# 设置初始属性(逻辑实现)
# 分成四个部分属性:颜值,体质,智力,家境,总和不能超过20,初始情况下每一项取值都是1 ~ 10之间
while True:     # 玩家可能是手滑了,多给几次机会;while True不一定是死循环
    print("请设置初始属性(可用总点数为:20)")
    face = int(input("请输入颜值(1 - 10):"))
    strong = int(input("请输入体质(1 - 10):"))
    iq = int(input("请输入智力(1 - 10):"))
    home = int(input("请输入家境(1 - 10):"))

    # 通过条件语句对用户输入的属性进行校验检查
    # 这段逻辑,使用 elif 是否可以呢?完全可以,效果是相同的
    # 使用 elif 则是多个分支只能进一个,一旦某个条件满足了,就不会再走其它的分支了
    # 此处虽然没有使用 elif ,但是有了 continue ,一旦某个条件满足, continue 就会使循环从头再来,
    # 也就没机会执行后续的条件判定了。
    if face < 1 or face > 10:
        print("颜值设置有误!")
        # 输入有误怎么办?好的措施是让玩家再输入一次
        continue    # 立即结束此次循环,进入下一次循环
    if strong < 1 or strong > 10:
        print("体质设置有误!")
        continue    # 立即结束此次循环,进入下一次循环
    if iq < 1 or iq > 10:
        print("智力设置有误!")
        continue    # 立即结束此次循环,进入下一次循环
    if home < 1 or home > 10:
        print("家境设置有误!")
        continue    # 立即结束此次循环,进入下一次循环
    # 判断一下四个属性相加有没有超过20
    if face + strong + iq + home > 20:
        print("总的属性和超出了20,也是设置有误!")
        continue

    # 如果当前上面的条件都没有被触发,则认为玩家的属性数据是合法的
    # 此时就可以跳出循环结束输入了
    print("初始属性输入完毕!")
    print(f"颜值:{face},体质:{strong},智力:{iq},家境:{home}")
    break   # 跳出while True循环

4.2 设置性别(随机)

4.2.1 理论

通过random.randint(1 , 6) 生成一个 [1 , 6] 的随机整数,类似于掷色子。

4.2.2 最佳实践

男孩和女孩会遇到不同的事件------

python 复制代码
# 生成一下角色性别
    # random.randint(beg,end),就能生成[beg,end]之间的随机整数-->前闭后闭区间
    # random.randint-->此处的random是一个Python中的模块(比如==别人写好的代码,我们直接来用)!
    # 咱们非要使用别人写好的模块嘛?也不一定,很多功能咱们自己也不是不能实现,但是使用别人写好的。会比较筒单方便
    # 使用别人模块的优点:
    # 1.降低编程的门槛~有的东西咱们自己不会写也没事,可以直接用别人的
    # 2.使用别人的模块,就可以更快速的完成需要实现的功能
point = random.randint(1,6)     # 生成一个随机数
# print(f'point = {point}')
if point % 2 == 1:
    gender = 'boy'
    print("你是个男孩")
else:
    gender = 'girl'
    print("你是个女孩")

4.3 设置出生点

4.3.1 理论

再扔一次色子,生成 [1, 3] 的随机数,用来表示每一种细分情况。

这里的代码主要就是各种 if、else 构成。

4.3.2 最佳实践

python 复制代码
# 设置角色的出生点
# 为了简单一点,就直接生成 1~3 的随机数
point = random.randint(1,3)     # 类似投骰子
if home == 10:
    # 第一档
    print('你出生在帝都,你的父母是贵族')
    home += 1
    iq += 1
    face += 1
elif 7 <= home <= 9:
    # 第二档
    if point == 1:
        print("你出生在大城市,你的父母是高官政要")
        face += 2
    elif point == 2:
        print('你出生在大城市,你的父母是富商')
        home += 2
    else:
        print('你出生在大城市,你的父母是大学教授')
        iq += 2
elif 4 <= home <= 7:
    if point == 1:
        print('你出生在三四线城市,你的父母是公务员')
        face += 1
    elif point == 2:
        print('你出生在三四线城市,你的父母是教师')
        iq += 1
    else:
        print('你出生在三四线城市,你的父母是医生')
        strong += 1
elif 2 <= home <= 3:
    if point == 1:
        print('你出生在六七线小城市,你的父母是工人')
        strong += 1
    elif point == 2:
        print('你出生在小镇上,你的父母是服务员')
        face += 1
    else:
        print('你出生在小镇上,你的父母是个体户')
        iq += 1
else:
    if point == 1:
        print('你出生在农村,你的父母是辛苦劳作的农民')
        face -= 1
    elif point == 2:
        print('你出生在穷乡僻壤,你的父母是无业游民')
        home -= 1
    else:
        print('你出生在镇上,你的父母感情不和')
        strong -= 1
print(f'颜值:{face},家境:{home}, 智力:{iq}, 体质: {strong}')

4.4 针对每一年生成随机的人生经历(一年一件大事)

4.4.1 理论

按照年龄,把人生经历分成四个阶段------

每个阶段都会有不同的精力和事件发生------

此处艾莉丝以幼年为例,简单实现一下这里的处理逻辑------

完整思维导图如下所示------

4.4.2 最佳实践

各个年龄段的人生经历艾莉丝这里只实现幼年期的------

python 复制代码
# 人生不同阶段的人生经历
# 幼年阶段
for age in range(1, 11):
    # 把一整年的打印都整理到一个字符串中,在这一年的结尾统一打印
    info = f'你今年{age}岁。'
    # 生成一个[1,3]的随机整数
    point = random.randint(1, 3)
    # 接下来编写各种事件的代码
    # 性别触发的事件
    if gender == 'girl' and home <= 3 and point == 1:
        info += '你的家里人重男轻女思想很严重,你被遗弃了!'
        print(info)
        point('游戏结束!')
        sys.exit(0)
    # 体质触发的事件
    # 使用 elif 是为了保证每年只触发一个事件!
    elif strong <= 5 and point < 3:
        info += '你生了一场大病'
        if home >= 5:
            info += '在父母的悉心照料之下,你不久便康复了'
            strong += 1
            home -= 1
        else:
            info += '你父母没有精力管你,你的身体状况更糟糕了'
            strong -= 1
    # 颜值触发的事件
    elif face <= 4 and age > 7:
        info += '你长得太磕碜了,其他小朋友都不乐意跟你玩'
        if iq >= 5:
            info += '你决定用学习来充实自己!'
        else:
            if gender == 'boy':
                info += '你和别的小朋友经常打架!'
                strong += 1
                iq -= 1
            else:
                info += '你经常被别的小朋友欺负!'
                strong -= 1
    # 智力触发的事件
    elif iq <= 5:
        info += '你看起来傻乎乎的。'
        if home >= 8 and age >= 6:
            info += '你的父母把你送到更好的学校去学习'
            iq += 1
        elif 4 <= home <= 7:
            if gender == 'boy':
                info += '你的父母鼓励你多运动,争取成为运动员'
                strong += 1
            else:
                info += '你的父母鼓励你多打扮打扮自己'
                face += 1
        else:
            # 家境 < 4
            info += '你的父母为此经常吵架'
            if point == 1:
                strong -= 1
            elif point == 2:
                iq -= 1
            else:
                pass
    # 健康成长事件
    else:
        info += '你健康成长了!'
        if point == 1:
            info += '你的身体看起来更加结实了'
            strong += 1
        elif point == 2:
            info += '你看起来更加漂亮了'
            face += 1
        else:
            # 无事发生
            pass

    # 打印这一年发生的事情
    print(info)
    print(f'颜值:{face},体质:{strong},智力:{iq},家境:{home}')
    print('-------------------------------------------------')
    # 为了方便观察,加一个小小的暂停操作
    time.sleep(1)

4.5 完整代码展示及运行结果

4.5.1 完整代码展示

python 复制代码
# 人生重开模拟器
import random   # 神不知鬼不觉出现个import语句-->把这个删掉,下面的random语句也删掉再重写,就能再次生成import语句
import sys
import time

# 对于Pycharm来说,有一个功能:能够自动导入当前使用的模块

# 欢迎界面
print('+----------------------------------------------------+')
print('|                                                    |')
print('|                花有重开日,人无再少年                  |')
print('|                                                    |')
print('|                欢迎来到人生重开模拟器                  |')
print('|                                                    |')
print('+----------------------------------------------------+')

# 设置初始属性(逻辑实现)
# 分成四个部分属性:颜值,体质,智力,家境,总和不能超过20,初始情况下每一项取值都是1 ~ 10之间
while True:     # 玩家可能是手滑了,多给几次机会;while True不一定是死循环
    print("请设置初始属性(可用总点数为:20)")
    face = int(input("请输入颜值(1 - 10):"))
    strong = int(input("请输入体质(1 - 10):"))
    iq = int(input("请输入智力(1 - 10):"))
    home = int(input("请输入家境(1 - 10):"))

    # 通过条件语句对用户输入的属性进行校验检查
    # 这段逻辑,使用 elif 是否可以呢?完全可以,效果是相同的
    # 使用 elif 则是多个分支只能进一个,一旦某个条件满足了,就不会再走其它的分支了
    # 此处虽然没有使用 elif ,但是有了 continue ,一旦某个条件满足, continue 就会使循环从头再来,
    # 也就没机会执行后续的条件判定了。
    if face < 1 or face > 10:
        print("颜值设置有误!")
        # 输入有误怎么办?好的措施是让玩家再输入一次
        continue    # 立即结束此次循环,进入下一次循环
    if strong < 1 or strong > 10:
        print("体质设置有误!")
        continue    # 立即结束此次循环,进入下一次循环
    if iq < 1 or iq > 10:
        print("智力设置有误!")
        continue    # 立即结束此次循环,进入下一次循环
    if home < 1 or home > 10:
        print("家境设置有误!")
        continue    # 立即结束此次循环,进入下一次循环
    # 判断一下四个属性相加有没有超过20
    if face + strong + iq + home > 20:
        print("总的属性和超出了20,也是设置有误!")
        continue

    # 如果当前上面的条件都没有被触发,则认为玩家的属性数据是合法的
    # 此时就可以跳出循环结束输入了
    print("初始属性输入完毕!")
    print(f"颜值:{face},体质:{strong},智力:{iq},家境:{home}")
    break   # 跳出while True循环

    # 生成一下角色性别
    # random.randint(beg,end),就能生成[beg,end]之间的随机整数-->前闭后闭区间
    # random.randint-->此处的random是一个Python中的模块(比如==别人写好的代码,我们直接来用)!
    # 咱们非要使用别人写好的模块嘛?也不一定,很多功能咱们自己也不是不能实现,但是使用别人写好的。会比较筒单方便
    # 使用别人模块的优点:
    # 1.降低编程的门槛~有的东西咱们自己不会写也没事,可以直接用别人的
    # 2.使用别人的模块,就可以更快速的完成需要实现的功能
point = random.randint(1,6)     # 生成一个随机数
# print(f'point = {point}')
if point % 2 == 1:
    gender = 'boy'
    print("你是个男孩")
else:
    gender = 'girl'
    print("你是个女孩")

# 设置角色的出生点
# 为了简单一点,就直接生成 1~3 的随机数
point = random.randint(1,3)     # 类似投骰子
if home == 10:
    # 第一档
    print('你出生在帝都,你的父母是贵族')
    home += 1
    iq += 1
    face += 1
elif 7 <= home <= 9:
    # 第二档
    if point == 1:
        print("你出生在大城市,你的父母是高官政要")
        face += 2
    elif point == 2:
        print('你出生在大城市,你的父母是富商')
        home += 2
    else:
        print('你出生在大城市,你的父母是大学教授')
        iq += 2
elif 4 <= home <= 7:
    if point == 1:
        print('你出生在三四线城市,你的父母是公务员')
        face += 1
    elif point == 2:
        print('你出生在三四线城市,你的父母是教师')
        iq += 1
    else:
        print('你出生在三四线城市,你的父母是医生')
        strong += 1
elif 2 <= home <= 3:
    if point == 1:
        print('你出生在六七线小城市,你的父母是工人')
        strong += 1
    elif point == 2:
        print('你出生在小镇上,你的父母是服务员')
        face += 1
    else:
        print('你出生在小镇上,你的父母是个体户')
        iq += 1
else:
    if point == 1:
        print('你出生在农村,你的父母是辛苦劳作的农民')
        face -= 1
    elif point == 2:
        print('你出生在穷乡僻壤,你的父母是无业游民')
        home -= 1
    else:
        print('你出生在镇上,你的父母感情不和')
        strong -= 1
print(f'颜值:{face},家境:{home}, 智力:{iq}, 体质: {strong}')

# 人生不同阶段的人生经历
# 幼年阶段
for age in range(1, 11):
    # 把一整年的打印都整理到一个字符串中,在这一年的结尾统一打印
    info = f'你今年{age}岁。'
    # 生成一个[1,3]的随机整数
    point = random.randint(1, 3)
    # 接下来编写各种事件的代码
    # 性别触发的事件
    if gender == 'girl' and home <= 3 and point == 1:
        info += '你的家里人重男轻女思想很严重,你被遗弃了!'
        print(info)
        point('游戏结束!')
        sys.exit(0)
    # 体质触发的事件
    # 使用 elif 是为了保证每年只触发一个事件!
    elif strong <= 5 and point < 3:
        info += '你生了一场大病'
        if home >= 5:
            info += '在父母的悉心照料之下,你不久便康复了'
            strong += 1
            home -= 1
        else:
            info += '你父母没有精力管你,你的身体状况更糟糕了'
            strong -= 1
    # 颜值触发的事件
    elif face <= 4 and age > 7:
        info += '你长得太磕碜了,其他小朋友都不乐意跟你玩'
        if iq >= 5:
            info += '你决定用学习来充实自己!'
        else:
            if gender == 'boy':
                info += '你和别的小朋友经常打架!'
                strong += 1
                iq -= 1
            else:
                info += '你经常被别的小朋友欺负!'
                strong -= 1
    # 智力触发的事件
    elif iq <= 5:
        info += '你看起来傻乎乎的。'
        if home >= 8 and age >= 6:
            info += '你的父母把你送到更好的学校去学习'
            iq += 1
        elif 4 <= home <= 7:
            if gender == 'boy':
                info += '你的父母鼓励你多运动,争取成为运动员'
                strong += 1
            else:
                info += '你的父母鼓励你多打扮打扮自己'
                face += 1
        else:
            # 家境 < 4
            info += '你的父母为此经常吵架'
            if point == 1:
                strong -= 1
            elif point == 2:
                iq -= 1
            else:
                pass
    # 健康成长事件
    else:
        info += '你健康成长了!'
        if point == 1:
            info += '你的身体看起来更加结实了'
            strong += 1
        elif point == 2:
            info += '你看起来更加漂亮了'
            face += 1
        else:
            # 无事发生
            pass

    # 打印这一年发生的事情
    print(info)
    print(f'颜值:{face},体质:{strong},智力:{iq},家境:{home}')
    print('-------------------------------------------------')
    # 为了方便观察,加一个小小的暂停操作
    time.sleep(1)

4.5.2 效果演示

bash 复制代码
+----------------------------------------------------+
|                                                    |
|                花有重开日,人无再少年                  |
|                                                    |
|                欢迎来到人生重开模拟器                  |
|                                                    |
+----------------------------------------------------+
请设置初始属性(可用总点数为:20)
请输入颜值(1 - 10):5
请输入体质(1 - 10):5
请输入智力(1 - 10):5
请输入家境(1 - 10):5
初始属性输入完毕!
颜值:5,体质:5,智力:5,家境:5
你是个女孩
你出生在三四线城市,你的父母是教师
颜值:5,家境:5, 智力:6, 体质: 5
你今年1岁。你健康成长了!
颜值:5,体质:5,智力:6,家境:5
-------------------------------------------------
你今年2岁。你生了一场大病在父母的悉心照料之下,你不久便康复了
颜值:5,体质:6,智力:6,家境:4
-------------------------------------------------
你今年3岁。你健康成长了!你的身体看起来更加结实了
颜值:5,体质:7,智力:6,家境:4
-------------------------------------------------
你今年4岁。你健康成长了!你看起来更加漂亮了
颜值:6,体质:7,智力:6,家境:4
-------------------------------------------------
你今年5岁。你健康成长了!
颜值:6,体质:7,智力:6,家境:4
-------------------------------------------------
你今年6岁。你健康成长了!
颜值:6,体质:7,智力:6,家境:4
-------------------------------------------------
你今年7岁。你健康成长了!
颜值:6,体质:7,智力:6,家境:4
-------------------------------------------------
你今年8岁。你健康成长了!你看起来更加漂亮了
颜值:7,体质:7,智力:6,家境:4
-------------------------------------------------
你今年9岁。你健康成长了!你看起来更加漂亮了
颜值:8,体质:7,智力:6,家境:4
-------------------------------------------------
你今年10岁。你健康成长了!你看起来更加漂亮了
颜值:9,体质:7,智力:6,家境:4
-------------------------------------------------

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝再次感谢您的阅读!

结语:希望对学习Python相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!

往期回顾

【Python基础:语法第一课】Python 基础语法详解:变量、类型、动态特性与运算符实战,构建完整的编程基础认知体系

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა

相关推荐
丸码1 小时前
JDK1.8新特性全解析
linux·windows·python
@游子1 小时前
Python学习笔记-Day4
笔记·python·学习
Dest1ny-安全1 小时前
CTF 及网络安全相关平台汇总表
java·运维·服务器·python·安全·web安全
Amctwd1 小时前
【数据挖掘】用户行为分析中的应用与模型构建
人工智能·数据挖掘
智链RFID1 小时前
信创RFID:涉密数据共享的“安全密钥”
网络·人工智能·安全
java1234_小锋1 小时前
[免费]基于Python的深度学习人脸表情识别系统(Keras卷积神经网络+OpenCV+PyQt)【论文+源码+SQL脚本】
python·深度学习·keras·表情识别
lisw051 小时前
社区数据仓库的可持续连接性!
大数据·数据仓库·人工智能·机器学习
萧鼎1 小时前
告别 PR!用 Python + MoviePy 自动化剪辑视频
python·自动化·音视频