【Python基础:语法第二课】Python 流程控制详解:条件语句 + 循环语句 + 人生重开模拟器实战
🎬 个人主页:艾莉丝努力练剑
❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》
《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平
🎬 艾莉丝的简介:
文章目录
1 ~> 顺序语句
默认情况下,Python的代码执行顺序是按照从上到下的顺序依次执行的(代码编写的大前提条件)。
举个例子——
print('111')print('222')print('333')这个顺序是不会乱的,和人生一样,出生、上学、工作、结婚、生子……这里的顺序一旦乱了,就很麻烦,而且也不大对劲哈哈。光有这样一个顺序我们很难完成一些特殊的功能–>在此顺序的基础之上,引入了条件和循环,可以让我们的顺序有更多的执行的可能性。
执行结果一定为 “123”,而不会出现 “321” 或者 “132” 等。这种按照顺序执行的代码,我们称为 顺序语句。
2 ~> 条件语句
2.1 什么是条件语句
条件语句能够表达“如果 … 否则 …”这样的语义。这构成了计算机中基础的逻辑判定。
条件语句也叫做分支语句,表示了接下来的逻辑可能有几种走向。
如果我认真敲代码 我就很容易找到工作 否则 我就容易毕业就失业 虽然结构变了, 但是整体表达的语义是等价的。
# 如果 我认真敲代码 -->这是一个条件,如果条件成立,就会容易找到工作# 我就很容易能够找到工作# 否则# 我就容易毕业就失业 -->条件不成立,就容易毕业就失业# 如果 我选择躺平摆烂 -->这也是一个条件,如果条件成立,容易毕业就失业# 我就容易毕业就失业# 否则# 我就很容易能够找到工作-->条件不成立,就很容易能够找到工作# 条件语句,就是根据一个具体条件的成立与否,来决定接下来的逻辑走向# 认真敲代码,真的很容易能够找到工作吗?# 是的# 对于在校大学生来说——大四的上学期开学(9月份左右)-->最黄金的时间,校招/秋招 --> 机会特别多!# 躺平摆烂的同学,就容易毕业就失业2.2 语法格式
2.2.1 语法格式的概念
Python 中使用 if、else 关键字表示条件语句,else if被合并成写作elif了。
# 语法格式(比较有特点,要去体会一下)# 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表示像躺平摆烂——
# 举个条件语句的例子# 让用户输入一个数字,如果输入1 表示愿意认真学习,输入2 表示像躺平摆烂# choice = input("输入1表示愿意认真学习,输入2表示像躺平摆烂:")## # 注意这里要比较的是字符串1,不是整数1# if choice == '1':# print('你能够找到好工作')# else:# print('你可能毕业就失业了')# 实际开发中,用户的输入,很有可能是出乎意料的!!!# 本来我们希望用户输入的是1或者2,但是用户实际输入了3(用户实际使用中可能会有各种出乎意料的操作) choice = input("输入1表示愿意认真学习,输入2表示像躺平摆烂:")# 注意这里要比较的是字符串1,不是整数1if choice =='1': print('你能够找到好工作')elif choice =='2': print('你可能毕业就失业了') else: # 除了1和2,其它的情况都算非法情况 print('您的输入有误!请重新输入!')# 对于非法情况的判定,也是非常必要的!你永远不知道用户会如何进行操作!我们得尽可能考虑到所有的情况# 代码写得不好肯定是你程序员来背锅,不可能让用户来背锅!所以,考虑要周全2.2.3 为什么要有语法格式?
2.3 缩进和代码块
2.3.1 缩进和代码块的概念
代码块指的是:一组放在一起执行的代码。
在 Python 中使用缩进表示代码块。不同级别的缩进,程序的执行效果是不同的。
2.3.2 最佳实践(含缩进和代码块讲解)
# 缩进和代码块 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 这些语言,即使完全不写缩进,语法也不会报错,主要是这样代码可读性就比较差。
同时,带来的坏处就是,如果缩进层次比较多,就容易分不清楚某个语句属于哪个层级。
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 输入一个整数, 判定是否是奇数
a =input("请输入一个整数:")# 报错:TypeError: not all arguments converted during string formatting a =int(input("请输入一个整数:"))# 问题解决if a %2==0:print("偶数")# 除尽else:print("奇数")# 除不尽反过来可不可以呢?这个代码在C++/Java中是不太行的——
if a %2==1:print("奇数")# 除尽else:print("偶数")# 除不尽# 那余一个负数呢?# 输出:奇数# -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 输入一个整数, 判定是正数还是负数
a =int(input("请输入一个整数:"))if a >0:print("正数")elif a <0:print("负数")else:print("0")2.4.3 判定年份是否是闰年
两种写法——
year =int(input("请输入一个年份:"))if year %100==0:# 世纪闰年的判定if year %400==0:print("闰年")else:print("平年")else:# 普通闰年的判定if year %4==0:print("闰年")else:print("平年")另一种写法——
year =int(input("请输入一个年份:"))if year %4==0and year %100!=0or year %400==0:print("闰年")else:print("平年")上面关于闰年的代码,个人感觉还是第一种方法更好。我们还是不要用代码的行数来衡量可读性。
第一种方法这一段代码,目的性更明显,平铺直叙;
第二种方法这一段代码虽然代码变短了,但是中间夹杂了一些更复杂的条件判定,可读性不如第一种方法。
2.5 空语句pass
2.5.1 理论
2.5.2 最佳实践
# 空语句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 条件语句小结
# 条件语句小结# 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 基本格式
while 条件: 循环体 条件为真,则执行循环体代码;条件为假,则结束循环。
3.1.3 最佳实践
3.1.3.1 打印1 ~ 10的整数
# 打印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的和
# 计算1 ~ 100的和# sum变量用于表示计算的和# sum = 0# num = 1# while num <= 100:# sum = sum + num# num += 1## print(f'sum = {sum}')# # 运行结果:50503.1.3.3 计算5的阶乘
# 计算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!
# 求和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 +=1sum+= factorResult num +=1print(f'sum = {sum}')这个程序用到了两重循环,也就是在循环语句中也可以套循环。
3.2 for循环
3.2.1 基本语法格式
for 循环变量 in 可迭代对象: 循环体 3.2.2 Python的for循环的相关注意事项
Python的 for 和其他语言不同,没有“初始化语句”,“循环条件判定语句”,“循环变量更新语句”。而是更加简单。
所谓的“可迭代对象”,指的是“内部包含多个元素,能一个一个把元素取出来的特殊变量”。
Pycharm于是会自动识别出那些词是需要自动修改——

3.2.3 最佳实践
# 打印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# 咱们自己定义的变量和内建函数冲突了!虽然不影响运行,但是代码后面就无法使用内建函数sumfor i inrange(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 个包子的时候吃出了一只虫——
# 假设我要吃 5 个包子for i inrange(1,6):if i ==3:# 发现第三个包子,有一只虫continueprint(f'吃第{i}个包子')3.4 break
3.4.1 概念
break 表示结束整个循环。3.4.2 最佳实践
代码示例2:还是要吃 5 个包子,发现第三个包子,有半只虫——
# 还是要吃 5 个包子for i inrange(1,6):if i ==3:# 发现第三个包子,有半只虫breakprint(f'吃第{i}个包子')代码示例3:给定若干个数字,求平均值(也不知道几个数字),使用“分号”作为结尾——
# 给定若干个数字,求平均值(也不知道几个数字)# 这个变量表示加和的结果 theSum =0# 这个变量表示有几个数字 count =0whileTrue:# 会不会变成死循环?光看到while True 不一定是死循环,关键是看循环体里是不是还能break# 没啥营养,但却要反复执行的 num =input("请输入一个数字(分号表示输入结束):")if num ==";":# 约定当用户输入 ; 的时候,表示输入结束break num =float(num) theSum += num count +=1print(f'平均值为:{theSum / count}')3.5 循环语句总结
# 循环语句总结# 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 实践
# 设置初始属性(逻辑实现)# 分成四个部分属性:颜值,体质,智力,家境,总和不能超过20,初始情况下每一项取值都是1 ~ 10之间whileTrue:# 玩家可能是手滑了,多给几次机会;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 <1or face >10:print("颜值设置有误!")# 输入有误怎么办?好的措施是让玩家再输入一次continue# 立即结束此次循环,进入下一次循环if strong <1or strong >10:print("体质设置有误!")continue# 立即结束此次循环,进入下一次循环if iq <1or iq >10:print("智力设置有误!")continue# 立即结束此次循环,进入下一次循环if home <1or home >10:print("家境设置有误!")continue# 立即结束此次循环,进入下一次循环# 判断一下四个属性相加有没有超过20if 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 最佳实践
男孩和女孩会遇到不同的事件——
# 生成一下角色性别# 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 最佳实践
# 设置角色的出生点# 为了简单一点,就直接生成 1~3 的随机数 point = random.randint(1,3)# 类似投骰子if home ==10:# 第一档print('你出生在帝都,你的父母是贵族') home +=1 iq +=1 face +=1elif7<= home <=9:# 第二档if point ==1:print("你出生在大城市,你的父母是高官政要") face +=2elif point ==2:print('你出生在大城市,你的父母是富商') home +=2else:print('你出生在大城市,你的父母是大学教授') iq +=2elif4<= home <=7:if point ==1:print('你出生在三四线城市,你的父母是公务员') face +=1elif point ==2:print('你出生在三四线城市,你的父母是教师') iq +=1else:print('你出生在三四线城市,你的父母是医生') strong +=1elif2<= home <=3:if point ==1:print('你出生在六七线小城市,你的父母是工人') strong +=1elif point ==2:print('你出生在小镇上,你的父母是服务员') face +=1else:print('你出生在小镇上,你的父母是个体户') iq +=1else:if point ==1:print('你出生在农村,你的父母是辛苦劳作的农民') face -=1elif point ==2:print('你出生在穷乡僻壤,你的父母是无业游民') home -=1else:print('你出生在镇上,你的父母感情不和') strong -=1print(f'颜值:{face},家境:{home}, 智力:{iq}, 体质: {strong}')4.4 针对每一年生成随机的人生经历(一年一件大事)
4.4.1 理论
按照年龄,把人生经历分成四个阶段——
每个阶段都会有不同的精力和事件发生——
此处艾莉丝以幼年为例,简单实现一下这里的处理逻辑——

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

4.4.2 最佳实践
各个年龄段的人生经历艾莉丝这里只实现幼年期的——
# 人生不同阶段的人生经历# 幼年阶段for age inrange(1,11):# 把一整年的打印都整理到一个字符串中,在这一年的结尾统一打印 info =f'你今年{age}岁。'# 生成一个[1,3]的随机整数 point = random.randint(1,3)# 接下来编写各种事件的代码# 性别触发的事件if gender =='girl'and home <=3and point ==1: info +='你的家里人重男轻女思想很严重,你被遗弃了!'print(info) point('游戏结束!') sys.exit(0)# 体质触发的事件# 使用 elif 是为了保证每年只触发一个事件!elif strong <=5and point <3: info +='你生了一场大病'if home >=5: info +='在父母的悉心照料之下,你不久便康复了' strong +=1 home -=1else: info +='你父母没有精力管你,你的身体状况更糟糕了' strong -=1# 颜值触发的事件elif face <=4and age >7: info +='你长得太磕碜了,其他小朋友都不乐意跟你玩'if iq >=5: info +='你决定用学习来充实自己!'else:if gender =='boy': info +='你和别的小朋友经常打架!' strong +=1 iq -=1else: info +='你经常被别的小朋友欺负!' strong -=1# 智力触发的事件elif iq <=5: info +='你看起来傻乎乎的。'if home >=8and age >=6: info +='你的父母把你送到更好的学校去学习' iq +=1elif4<= home <=7:if gender =='boy': info +='你的父母鼓励你多运动,争取成为运动员' strong +=1else: info +='你的父母鼓励你多打扮打扮自己' face +=1else:# 家境 < 4 info +='你的父母为此经常吵架'if point ==1: strong -=1elif point ==2: iq -=1else:pass# 健康成长事件else: info +='你健康成长了!'if point ==1: info +='你的身体看起来更加结实了' strong +=1elif point ==2: info +='你看起来更加漂亮了' face +=1else:# 无事发生pass# 打印这一年发生的事情print(info)print(f'颜值:{face},体质:{strong},智力:{iq},家境:{home}')print('-------------------------------------------------')# 为了方便观察,加一个小小的暂停操作 time.sleep(1)4.5 完整代码展示及运行结果
4.5.1 完整代码展示
# 人生重开模拟器import random # 神不知鬼不觉出现个import语句-->把这个删掉,下面的random语句也删掉再重写,就能再次生成import语句import sys import time # 对于Pycharm来说,有一个功能:能够自动导入当前使用的模块# 欢迎界面print('+----------------------------------------------------+')print('| |')print('| 花有重开日,人无再少年 |')print('| |')print('| 欢迎来到人生重开模拟器 |')print('| |')print('+----------------------------------------------------+')# 设置初始属性(逻辑实现)# 分成四个部分属性:颜值,体质,智力,家境,总和不能超过20,初始情况下每一项取值都是1 ~ 10之间whileTrue:# 玩家可能是手滑了,多给几次机会;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 <1or face >10:print("颜值设置有误!")# 输入有误怎么办?好的措施是让玩家再输入一次continue# 立即结束此次循环,进入下一次循环if strong <1or strong >10:print("体质设置有误!")continue# 立即结束此次循环,进入下一次循环if iq <1or iq >10:print("智力设置有误!")continue# 立即结束此次循环,进入下一次循环if home <1or home >10:print("家境设置有误!")continue# 立即结束此次循环,进入下一次循环# 判断一下四个属性相加有没有超过20if 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 +=1elif7<= home <=9:# 第二档if point ==1:print("你出生在大城市,你的父母是高官政要") face +=2elif point ==2:print('你出生在大城市,你的父母是富商') home +=2else:print('你出生在大城市,你的父母是大学教授') iq +=2elif4<= home <=7:if point ==1:print('你出生在三四线城市,你的父母是公务员') face +=1elif point ==2:print('你出生在三四线城市,你的父母是教师') iq +=1else:print('你出生在三四线城市,你的父母是医生') strong +=1elif2<= home <=3:if point ==1:print('你出生在六七线小城市,你的父母是工人') strong +=1elif point ==2:print('你出生在小镇上,你的父母是服务员') face +=1else:print('你出生在小镇上,你的父母是个体户') iq +=1else:if point ==1:print('你出生在农村,你的父母是辛苦劳作的农民') face -=1elif point ==2:print('你出生在穷乡僻壤,你的父母是无业游民') home -=1else:print('你出生在镇上,你的父母感情不和') strong -=1print(f'颜值:{face},家境:{home}, 智力:{iq}, 体质: {strong}')# 人生不同阶段的人生经历# 幼年阶段for age inrange(1,11):# 把一整年的打印都整理到一个字符串中,在这一年的结尾统一打印 info =f'你今年{age}岁。'# 生成一个[1,3]的随机整数 point = random.randint(1,3)# 接下来编写各种事件的代码# 性别触发的事件if gender =='girl'and home <=3and point ==1: info +='你的家里人重男轻女思想很严重,你被遗弃了!'print(info) point('游戏结束!') sys.exit(0)# 体质触发的事件# 使用 elif 是为了保证每年只触发一个事件!elif strong <=5and point <3: info +='你生了一场大病'if home >=5: info +='在父母的悉心照料之下,你不久便康复了' strong +=1 home -=1else: info +='你父母没有精力管你,你的身体状况更糟糕了' strong -=1# 颜值触发的事件elif face <=4and age >7: info +='你长得太磕碜了,其他小朋友都不乐意跟你玩'if iq >=5: info +='你决定用学习来充实自己!'else:if gender =='boy': info +='你和别的小朋友经常打架!' strong +=1 iq -=1else: info +='你经常被别的小朋友欺负!' strong -=1# 智力触发的事件elif iq <=5: info +='你看起来傻乎乎的。'if home >=8and age >=6: info +='你的父母把你送到更好的学校去学习' iq +=1elif4<= home <=7:if gender =='boy': info +='你的父母鼓励你多运动,争取成为运动员' strong +=1else: info +='你的父母鼓励你多打扮打扮自己' face +=1else:# 家境 < 4 info +='你的父母为此经常吵架'if point ==1: strong -=1elif point ==2: iq -=1else:pass# 健康成长事件else: info +='你健康成长了!'if point ==1: info +='你的身体看起来更加结实了' strong +=1elif point ==2: info +='你看起来更加漂亮了' face +=1else:# 无事发生pass# 打印这一年发生的事情print(info)print(f'颜值:{face},体质:{strong},智力:{iq},家境:{home}')print('-------------------------------------------------')# 为了方便观察,加一个小小的暂停操作 time.sleep(1)4.5.2 效果演示
+----------------------------------------------------+ ||| 花有重开日,人无再少年 |||| 欢迎来到人生重开模拟器 ||| +----------------------------------------------------+ 请设置初始属性(可用总点数为: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 基础语法详解:变量、类型、动态特性与运算符实战,构建完整的编程基础认知体系
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡૮₍ ˶ ˊ ᴥ ˋ˶₎ა