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

【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}')# # 运行结果:5050
3.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 基础语法详解:变量、类型、动态特性与运算符实战,构建完整的编程基础认知体系

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

Read more

半小时用OpenClaw搭一套AI量化系统:开源三件套实测分享

半小时用OpenClaw搭一套AI量化系统:开源三件套实测分享

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:见过太多人想用量化,却被各种复杂的代码和环境配置劝退。无论你是刚开始接触数据科学的学生,还是想提升自己投资工具箱的实践者,今天就把我用最近很火的OpenClaw如何搭建AI量化系统的过程完整分享给你。 自从有了OpenClaw后,说实话,个人搭建一套量化系统没你想的那么难。半小时,三行代码,不花钱。 一、先说效果:我一次跑通的回测 先别急着看代码,咱们看看效果。 用这套方案跑了一趟回测,最终跑出来的结果是 59%。当然,这是回测数据,不代表实盘收益,但足以说明这套开源工具链的潜力。 你可能要问我这个收益是怎么算的。说白了就是:系统基于历史数据,按照你设定的策略规则模拟交易,最后算出来的年化结果。 核心观点:回测收益 ≠ 实盘收益,但回测能帮你验证策略逻辑是否靠谱。 二、开源三件套:数据 + 框架 + AI 这套方案的精髓在于开源三件套的组合搭配。用个表格梳理清楚: 组件作用开源地址数据源选股基础数据供给长桥 SDK / AKshar

By Ne0inhk
AI Agent 面试八股文100问:大模型智能体高频考点全解析(附分类指南和简历模板)

AI Agent 面试八股文100问:大模型智能体高频考点全解析(附分类指南和简历模板)

AI Agent 面试八股文100问:大模型智能体高频考点全解析(附分类指南和简历模板) 如果你对学成归来的简历没有概念,可以看看以下的模板先,毕竟先看清眼前的路,比奔跑更重要: 最终的AI Agent简历模板,点我跳转! 适用人群:LLM Agent、RAG、AutoGPT、LangChain、Function Calling 等方向的求职者与开发者 随着大模型技术的飞速演进,AI Agent(智能体) 已成为工业界和学术界共同关注的焦点。无论是 AutoGPT、LangChain 还是 LlamaIndex,背后都离不开对 Agent 架构、推理机制、工具调用等核心能力的深入理解。 本文系统整理了 AI Agent 方向的 100 道高频面试问题,覆盖 基础概念、架构设计、推理决策、工具调用、记忆管理、评估方法、安全对齐、

By Ne0inhk

完全免费!用阿里开源 CoPaw 养一只属于自己的 AI 小助理(魔搭启动,亲测有效)

先说一个小插曲:前几天我写了一篇介绍 Maxclaw 的文章,当时还是免费的,结果文章发出去没多久,Minimax 就悄悄改了规则,变成 39 元一个月起步了。当然,39 元其实也不贵——毕竟你去闲鱼搜"openclaw 代安装",随便一个人工服务都要 50 块往上走。但既然有完全免费的方案,为什么不用呢? 今天这篇,就给大家介绍一个我亲自跑通的、完全免费的方案:用阿里开源的 CoPaw,在魔搭创空间里一键启动,服务器免费,Token 每天 2000 次免费调用,不用装任何本地环境,浏览器打开就能用。 CoPaw 是什么?先用一分钟搞清楚 很多人第一次听到 CoPaw 这个名字,会以为是某种宠物应用。其实它的全称是 Co Personal Agent Workstation,是阿里

By Ne0inhk
OpenClaw 实战部署:用一台旧 Surface Pro 打造 7×24 私人 AI 助手

OpenClaw 实战部署:用一台旧 Surface Pro 打造 7×24 私人 AI 助手

OpenClaw 实战部署:用一台旧 Surface Pro 打造 7×24 私人 AI 助手 OpenClaw 是 2026 年最火的开源 AI 助手平台之一——它不只是一个聊天机器人框架,而是一个完整的 AI Agent 操作系统:支持飞书 / Web / IM 多渠道接入,内置工具调用(function calling)、技能系统(Skills)、记忆管理、多 Agent 协作,还能接入任意 OpenAI 兼容的大模型。 我手上有一台 2017 年的 Surface Pro 5,Windows 已经卡得没法用。与其吃灰,不如装个 Ubuntu 把它变成一台低功耗的

By Ne0inhk