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

【Python】2. 基础语法(2)

一、顺序语句

默认情况下,Python 的代码执行顺序是按照从上到下的顺序,依次执行的。

print("1")
print("2")
print("3")

运行结果:

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

二、条件语句

1、语法格式

Python 中使用 if else 关键字表示条件语句。
(1) if

if expression:do_something1do_something2
next_something

如果 expression 值为 True,则执行 do_something1、do_something2 和 next_something。
如果 expression 值为 False,则只执行 next_something,不执行 do_something1、do_something2。
(2) if - else

if expression:do_something1
else:do_something2

如果 expression 值为 True,则执行 do_something1。
如果 expression 值为 False,则执行 do_something2。
(3) if - elif - else

if expression1:do_something1
elif expression2:do_something2
else:do_something3

如果 expression1 值为 True,则执行 do_something1。
如果 expression1 值为 False,并且 expression2 为 True 则执行 do_something2。
如果 expression1 值为 False,并且 expression2 为 False 则执行 do_something3。

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

  • if 后面的条件表达式,没有用 ( ) 括起来,而是使用 : 作为结尾。
  • if / else 命中条件后要执行的 “语句块”, 使用缩进 (通常是 4 个空格或者 1 个 tab)来表示, 而不是 { }
  • 对于多条件分支, 不是写作 else if, 而是 elif (合体了).

举例: 输入1表示愿意认真学习,输入2表示躺平摆烂。

choice = input("输入1表示认真学习,输入2表示躺平摆烂:")
if choice == "1":print("你会找到好工作!")
elif choice == "2":print("你可能毕业就失业了!")
else:print("你的输入有误!")

运行结果:

2、缩进和代码块

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

代码一:

a = input("请输入一个整数: ")
if a == "1":print("hello")print("world")

运行结果:

代码二:

a = input("请输入一个整数: ")
if a == "1":print("hello")
print("world")

运行结果:

注意上述代码的区别。

在代码1 中,print("world") 有一级缩进,这个语句属于 if 内的代码块,意味着条件成立才执行,条件不成立则不执行。
在代码2 中,print("world") 没有缩进,这个语句是 if 外部的代码,不属于 if 内部的代码块。意味着条件无论是否成立, 都会执行。

另外,代码块内部还可以嵌套代码块。

a = input("请输入第一个整数:")
b = input("请输入第二个整数:")
if a == "1":if b == "2":print("hello")print("world")
print("python")

运行结果:

在上述代码中:

  • print("hello") 具有两级缩进,属于 if b == "2" 条件成立的代码块。
  • print("world") 具有一级缩进,属于 if a == "1" 条件成立的代码块。
  • print("python") 没有缩进,无论上述两个条件是否成立,该语句都会执行。

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

像 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")

因此,就有了 “写 Python 需要自备游标卡尺” 这个梗。

3、练习

(1)输入一个整数,判定奇偶数。

a = int(input("请输入一个整数:"))
if a % 2 == 0:print("偶数")
else:print("奇数")

运行结果:

(2)输入一个整数,判断正负数。

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

运行结果:

(3)输入一个年份,判断闰平年。

year = int(input("请输入年份:"))
if (year % 100 != 0 and year %4 == 0) or year % 400:print("闰年")
else:print("平年")

运行结果:

4、空语句 pass

举例: 输入一个数字,如果数字为1就打印 hello。

a = int(input("请输入一个整数:"))
if a == 1:print("hello")

运行结果:

这个代码也可以等价写成:

a = int(input("请输入一个整数:"))
if a != 1:pass
else:print("hello")

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

三、循环语句

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

1、while 循环

基本语法格式:

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

练习1:打印1-10的整数。

num = 1
while num <= 10:print(num)num += 1

运行结果:

练习2:计算1-100的和。

sum = 0
num = 1
while num <= 100:sum += numnum += 1
print(sum)

运行结果:
在这里插入图片描述

练习3:计算5的阶乘。

result = 1
n = 1
while n <= 5:result *= nn += 1
print(result)

运行结果:
在这里插入图片描述

练习4:求1! + 2! + 3! + 4! + 5! 。

sum = 0
num = 1
# 分别求1 - 5(num)的阶乘
while num <= 5:result = 1# 求第num次的阶乘i = 1while i <= num:result *= ii += 1sum += resultnum += 1
print(sum)

运行结果:
在这里插入图片描述

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

2、for 循环

基本语法格式:

for 循环变量 in 可迭代对象:循环体

注意:

  • python 的 for 和其他语言不同,没有 “初始化语句”、“循环条件判定语句”、“循环变量更新语句”,而是更加地简单。
  • 所谓的 “可迭代对象”,指的是 “内部包含多个元素,能一个一个把元素取出来的特殊变量”。

举例: for 循环打印1-10 。

for i in range(1,11):print(i)

运行结果:

:使用 range 函数,能够生成一个可迭代对象,生成的范围是 [1, 11),是左闭右开区间。

练习1: 打印 2, 4, 6, 8, 10。

for i in range(2,12,2):print(i)

运行结果:

:通过 range 的第三个参数,可以指定迭代时候的 “步长”。也就是一次让循环变量加几。

练习2: 打印 10-1。

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

运行结果:

:range 的步长也可以设定成负数。

练习3: 求 1 - 100 的和。

sum = 0
for i in range(1,101):sum += i
print(sum)

运行结果:
在这里插入图片描述

3、continue

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

举例: 模拟吃包子,吃第3个包子的时候吃出了一只虫。

for i in range(1,6):if i == 3:continueprint(f"吃完第{i}个包子")

运行结果:

4、break

break 表示结束整个循环。
举例: 模拟吃包子,吃第 3 个包子的时候吃出了半只虫。

for i in range(1,6):if i == 3:breakprint(f"吃完第{i}个包子")

运行结果:

练习: 输入若干个数字,求其平均值,使用 ;作为结尾。

sum = 0
count = 0
while True:num = input("请输入数字:")if num == ';':breaknum = float(num)sum += numcount += 1
print(sum / count)

运行结果:

四、小游戏:人生重开模拟器

实现 “人生重开模拟器”。

这是一款之前很火的文字类小游戏。玩家输入角色的初始属性之后,就可以开启不同的人生经历。
大家可以在网上搜索 “人生重开模拟器”,就可以玩到这个游戏的各种版本。

完整的程序代码较多,此处我们只实现其中的一部分逻辑

1、设置初始属性

在游戏中我们先设定四个属性:

  • 颜值 (face)
  • 体质 (strong)
  • 智力 (iq)
  • 家境 (home)

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

# 主页面
print("+----------------------------------------------------+")
print("|                                                    |")
print("|                 花有重开日,人无再少年                |")
print("|                                                    |")
print("|                 欢迎来到,人生重开模拟器              ""|")
print("|                                                    |")
print("+----------------------------------------------------+")# 设置初始属性
while True:print("请设定初始属性(可用总点数 20)")face = int(input("设定 颜值(1-10):"))strong = int(input("设定 体质(1-10):"))iq = int(input("设定 智力(1-10):"))home = int(input("设定 家境(1-10):"))if face < 1 or face > 10:print("颜值设置有误!")continueif strong < 1 or strong > 10:print("体质设置有误!")continueif iq < 1 or iq > 10:print("智力设置有误!")continueif home < 1 or home > 10:print("家境设置有误!")continueif face + strong + iq + home > 20:print("总点数超过了20!")continueprint("初始属性设定完成!")break

再来运行测试:

正常运行:

某项属性输入错误:

点数之和超出总点数:

2、设置性别

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

  • 如果是单数,则性别设为男孩。
  • 如果是双数,则性别设为女孩。

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

注:使用random前需要导入:import random,放在文件的开头。

# 掷色子
point = random.randint(1,6)
if point % 2 == 1:gender = 'boy'print("你是个男孩")
else:gender = 'girl'print("你是个女孩")

再进行测试:

3、设置出生点

接着按照家境(home),分成四个档位。

  • 10 是第一档,加成最高。
  • [7, 9] 是第二档,也有一些加成。
  • [4, 6] 是第三档,加成较少。
  • [1, 3] 是第四档,会扣掉属性。

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

# 掷色子
point = random.randint(1,3)
if home == 10:print("你出生在帝都,你的父母是高官政要")home += 1iq += 1face += 1
elif 7 <= home <= 9:if point == 1:print("你出生在大城市,你的父母是公务员")face += 2elif point == 2:print("你出生在大城市,你的父母是大企业高管")home += 2else:print("你出生在大城市,你的父母是大学教授")iq += 2
elif 4 <= home <= 6:if point == 1:print("你出生在三线城市,你的父母是教师")iq += 1elif point == 2:print("你出生在镇上,你的父母是医生")strong += 1else:print("你出生在镇上,你的父母是个体户")home += 1
else:if 1 <= point <= 2:print("你出生在村里,你的父母是辛苦劳作的农民")strong += 1face -= 2elif 3 <= point <= 4:print("你出生在穷乡僻壤,你的父母是无业游民")home -= 1else:print("你出生在镇上,你的父母感情不和")strong -= 1

进行测试:

4、针对每一岁, 生成人生经历

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

  • [1, 10]:幼年阶段
  • [11, 20]:青年阶段
  • [20, 50]:壮年阶段
  • 50 岁以上:老年阶段

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

  • 幼年阶段可塑性强,体质、颜值、智力都会有较快变化。
  • 青年阶段主要是求学,同时父母一辈会有明显变化,智力和家境会有明显变化。
  • 壮年阶段相对平稳,属性变化不大,主要是一些随机事件影响到属性。
  • 老年阶段体质,颜值,智力都会显著退化,并且随着年龄的上升,疾病/死亡的风险逐渐升高。

此处我们以幼年为例,简单实现一下这里的处理逻辑。

  • 使用 for 循环,按照年龄循环起来。
  • 针对每一年,先掷一次 [1, 3] 的色子,根据不同的随机数值,来触发不同的事件。
  • 根据性别、年龄、各种属性,来触发不同的事件。这里都使用 if - else 的方式来组织。
  • 不同的事件可能会对属性有正面/负面的影响。
  • 在每一年的最后,打印这一年遇到的事情。
  • 如果夭折,则直接 sys.exit(0) 退出程序。需要在开头导入import sys
  • 使用 time.sleep(1) 使程序暂停执行 1s,方便观察程序结果。需要在开头导入import time
# 幼年
for age in range(1,11):info = f'你今年{age}岁,'point = random.randint(1,3)# 性别触发的事件if gender == 'girl' and home <= 3 and point == 1:info += '你家里人重男轻女思想非常严重,你被遗弃了!'print(info)print("游戏结束!")sys.exit(0)# 体质触发的事件elif strong < 6 and point != 3:info += '你生了一场病,'if home >= 5:info += '在父母的精心照顾下恢复了健康!'strong += 1home -= 1else:info += '你的父母没精力管你,你的身体状况更糟糕了'strong -= 1# 颜值触发的事件elif face < 4 and age >= 7:info += '你因为长的太丑,别的小朋友不喜欢你,'if iq > 5:info +='你决定用学习填充自己'iq += 1else:if gender == 'boy':info += '你和别的小朋友经常打架'iq -= 1strong += 1else:info += '你经常被别的小朋友欺负'strong -= 1# 智商触发的事件elif iq < 5:info += '你看起来傻傻的,'if home >= 8 and age >= 6:info +='你的父母给你送到更好的学校学习'elif 4 <= home <= 7:if gender == 'boy':info += '你的父母鼓励你多运动,加强身体素质'strong += 1else:info += '你的父母鼓励你多打扮自己'face += 1else:info += '你的父母为此经常吵架'if point == 1:strong -= 1elif point == 2:iq -= 1# 健康成长else:info += '你健康成长,'if point == 1:info += '看起来更聪明了'iq += 1elif point == 2:info += '看起来更好看了'face += 1else:info += '看起来更结实了'strong += 1print('-------------------------------------------')print(info)print(f'strong={strong},face={face},iq={iq},home={home}')time.sleep(1)

运行结果:

更多的逻辑此处就不再实现了。大家可以按照类似的方式,设计更多的事件,完成青年、壮年、老年的相关逻辑。

点击查看小游戏完整源代码。

http://www.xdnf.cn/news/9336.html

相关文章:

  • 【运维_日常报错解决方案_docker系列】一、docker系统不起来
  • 从自动化到智能化:制造业数字化转型的五个关键跃迁
  • Vue-03 (调试工具Vue Devtools )
  • delphi xe 12.3下解决错误 ld.exe: unrecognized option ‘--no-rosegment‘
  • 试验台铁地板:技术创新与品质保障
  • 【观成科技】Ymir勒索软件组织窃密木马RustyStealer加密通信分析
  • STM32的HAL编码流程总结(上部)
  • 大模型——MCP 深度解析
  • vue2使用element中多选组件el-checkbox-group,数据与UI更新不同步
  • 【React】jsx 从声明式语法变成命令式语法
  • 5G NTN卫星通信发展现状(截止2025年3月)
  • 每日算法-250527
  • SNTP 协议详解:网络时间同步的轻量级解决方案
  • Python os 模块简介及基础使用示例
  • 如何撰写一篇优质 Python 相关的技术文档 进阶指南
  • Cmake编译yaml-cpp并在QT中测试成功操作步骤
  • AI情感陪伴在医疗领域的核心应用潜力
  • 打卡37天
  • HarmonyNext使用request.agent.download实现断点下载
  • 设计模式-开放封闭原则
  • 多相电机驱动控制学习(1)——基于双dq坐标系的六相PMSM驱动控制
  • C++23 新成员函数与字符串类型的改动
  • 算法竞赛中的基本数论
  • 实时技术对比:SSE vs WebSocket vs Long Polling
  • 分布式光伏接入引起农村电压越限,如何处理?
  • Vue中van-stepper与input值不同步问题及解决方案
  • 如何将联系人从 Android 传输到 PC(正确步骤)
  • 哈尔滨云前沿服务器托管,服务器租用
  • influxdb时序数据库
  • 如何制作全景VR图?