Python 基础语法(2) 顺序语句默认情况下, Python 的代码执行顺序是按照从上到下的顺序, 依次执行的.print(1)print(2)print(3)执行结果一定为 “123”, 而不会出现 “321” 或者 “132” 等. 这种按照顺序执行的代码, 我们称为顺序语句.这个顺序是很关键的. 编程是一件明确无歧义的事情. 安排好任务的顺序, 计算机才能够正确的进行 执行. 就好像人生的顺序, 是上学,工作, 结婚, 生子. 一旦这里的顺序乱了, 就很麻烦.条件语句什么是条件语句条件语句能够表达 “如果 … 否则 …” 这样的语义. 这构成了计算机中基础的逻辑判定.条件语句也叫做分支语句, 表示了接下来的逻辑可能有几种走向.一个典型的例子: 如果丘处机没有路过牛家村,那么金兵不会死在郭, 杨两家手上郭, 杨两家就不会流亡北方郭夫人就不会去到大漠, 完颜洪烈就不会遇到包惜弱郭靖就不会和江南七怪救了铁木真蒙古就不会统一蒙古铁骑就不会西征欧洲就不会出现火药, 也就不会出现文艺复兴, 大航海.大炮就不会从欧洲传到日本, 日本得不到统一完颜洪烈就不会全力战, 金国内乱宋朝不会灭亡, 并诞生出资本主义. 中国成为最发达的国家. 其中 “我认真敲代码” 称为 条件. 如果条件成立(条件为真), 则会出现 “我就很容易找到工作” 这个情况. 如 果条件不成立(条件为假), 则会出现 “我就容易毕业就失业”.如果 我认真敲代码 我就很容易找到工作 否则 我就容易毕业就失业在这里插入代码片当然, 同样的逻辑, 还可以反着表达.如果 我选择躺平摆烂 我就容易毕业就失业 否则 我就很容易找到工作虽然结构变了, 但是整体表达的语义是等价的.PS: 亲爱的同学们, 你们是选择认真敲代码, 还是躺平摆烂呢?语法格式Python 中使用 if else 关键字表示条件语句.(1) ififexpression:do_something1 do_something2 next_something如果 expression 值为 True, 则执行 do_something1, do_something2,next_something如果 expression 值为 False, 则只执行 next_something, 不执行do_something1, do_something2(2) if - elseifexpression:do_something1else:do_something2如果 expression 值为 True, 则执行 do_something1如果 expression 值为 False, 则执行 do_something2(3) if - elif - elseifexpression1:do_something1elifexpression2:do_something2else: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 表示躺平摆烂.choiceinput(输入 1 表示认真学习, 输入 2 表示躺平摆烂: )ifchoice1:print(你会找到好工作!)elifchoice2:print(你可能毕业就失业了!)else:print(你的输入有误!)缩进和代码块代码块 指的是一组放在一起执行的代码.在 Python 中使用缩进表示代码块. 不同级别的缩进, 程序的执行效果是不同的.# 代码1ainput(请输入一个整数: )ifa1:print(hello)print(world)# 代码2ainput(请输入一个整数: )ifa1:print(hello)print(world)注意上述代码的区别.在代码1 中, print(“world”) 有一级缩进, 这个语句属于 if 内的代码块, 意味着条件成立, 才执行, 条件不成立, 则不执行.在代码2 中, print(“world”) 没有缩进, 这个语句是 if 外部的代码, 不属于 if 内部的代码块. 意味着条件无论是否成立, 都会执行.另外, 代码块内部还可以嵌套代码块.ainput(请输入第一个整数: )binput(请输入第二个整数: )ifa1:ifb2:print(hello)print(world)print(python)在这个代码中,print(“hello”) 具有两级缩进, 属于 if b “2” 条件成立的代码块.print(“world”) 具有一级缩进, 属于 if a “1” 条件成立的代码块.print(“python”) 没有缩进, 无论上述两个条件是否成立, 该语句都会执行.基于缩进的方式表示代码块, 带来的好处就是强制要求程序猿要写明确的缩进, 来明确代码之间的相对关系. 如果缩进书写的不对, 则直接报错.像 C / Java 这些语言, 即使完全不写缩进, 语法也不会报错. 代码可读性就比较差.同时, 带来的坏处就是, 如果缩进层次比较多, 就容易分不清楚某个语句属于哪个层级.ifa1:ifb2:ifc3:ifd4:ife5:iff6:ifg7:print(hello)print(1)print(2)请问, 上述代码中的 print(“1”) 和 print(“2”) 属于哪一级缩进?因此, 就有了 “写 Python 需要自备游标卡尺” 这个梗.练习(1) 输入一个整数, 判定是否是奇数aint(intput(请输入一个整数: ))ifa%20:print(偶数)else:print(奇数)(2) 输入一个整数, 判定是正数还是负数aint(intput(请输入一个整数: ))ifa%20:print(偶数)else:print(奇数)aint(input(请输入一个整数: ))ifa0:print(正数)elifa0:print(负数)else:print(为 0)(3) 判定年份是否是闰年yearint(input(请输入年份: ))ifyear%1000:# 判定世纪闰年ifyear%4000:print(闰年)else:print(平年)else:# 判定普通闰年ifyear%40:print(闰年)else:print(平年)yearint(input(请输入年份: ))if(year%100!0andyear%40)oryear%400:print(闰年)else:print(平年)空语句 pass代码示例: 输入一个数字, 如果数字为 1, 则打印 hello.aint(input(请输入一个整数:))ifa1:print(hello)这个代码也可以等价写成aint(input(请输入一个整数:))ifa!1:passelse:print(hello)其中 pass 表示 空语句, 并不会对程序的执行有任何影响, 只是占个位置, 保持 Python 语法格式符合要求.如果代码写作a int(input(请输入一个整数:)) if a ! 1: else: print(hello)程序是不符合 Python 语法的, 会直接报错.循环语句有些操作是需要反复执行的. 这种就需要使用循环.while 循环基本语法格式while条件:循环体条件为真, 则执行循环体代码.条件为假, 则结束循环.代码示例: 打印 1-10 的整数num1whilenum10:print(num)num1代码示例: 计算 1-100 的和sum0num1whilenum100:sumnum num1print(sum)代码示例: 计算 5 的阶乘result1n1whilen5:result*n n1print(result)代码示例: 求 1! 2! 3! 4! 5!num1sum0whilenum5:factorResult1i1whileinum:factorResult*i i1sumfactorResult num1print(sum)这个程序用到了两重循环.也就是在循环语句中也可以套循环.for 循环基本语法格式for循环变量in可迭代对象:循环体注意:python 的 for 和其他语言不同, 没有 “初始化语句”, “循环条件判定语句”, “循环变量更新语句”, 而是 更加简单所谓的 “可迭代对象”, 指的是 “内部包含多个元素, 能一个一个把元素取出来的特殊变量”代码示例: 打印 1-10foriinrange(1,11):print(i)使用 range 函数, 能够生成一个可迭代对象. 生成的范围是 [1, 11), 也就是 [1, 10]代码示例: 打印 2, 4, 6, 8, 10foriinrange(2,12,2):print(i)通过 range 的第三个参数, 可以指定迭代时候的 “步长”. 也就是一次让循环变量加几.代码示例: 打印 10-1foriinrange(10,0,-1):print(i)range 的 步长 也可以设定成负数.代码示例: 求 1 - 100 的和continuecontinue 表示结束这次循环, 进入下次循环.代码示例:模拟吃包子. 吃第 3 个包子的时候吃出了一只虫.sum0foriinrange(1,101):sumiprint(sum)breakbreak 表示结束整个循环代码示例:模拟吃包子. 吃第 3 个包子的时候吃出了半只虫.foriinrange(1,6):ifi3:continueprint(f吃完第{i}个包子)代码示例:输入若干个数字, 求平均值. 使用 “分号” 作为结尾.foriinrange(1,6):ifi3:breakprint(f吃完第{i}个包子)sum0count0whileTrue:numinput(请输入数字:)ifnum;:breaknumfloat(num)sumnum count1print(sum/count)综合案例实现 “人生重开模拟器”这是一款之前很火的文字类小游戏. 玩家输入角色的初始属性之后, 就可以开启不同的人生经历.大家可以在网上搜索 “人生重开模拟器”, 就可以玩到这个游戏的各种版本.完整的程序代码较多, 此处我们只实现其中的一部分逻辑.1. 设置初始属性在游戏中我们设定四个属性.颜值 (face)体质 (strong)智力 (iq)家境 (home)我们约定每个属性的范围为 [1, 10], 并且总和不能超过 20.如果玩家输入的初始属性不合理, 就提示输入有误, 重新输入.print(---------------------------------------------------------------------)print(| |)print(| 花有重开日, 人无再少年 |)print(| |)print(| 欢迎来到, 人生重开模拟器 |)print(| |)print(---------------------------------------------------------------------)whileTrue:print(请设定初始属性(可用总点数 20))faceint(input(设定 颜值(1-10):))strongint(input(设定 体质(1-10):))iqint(input(设定 智力(1-10):))homeint(input(设定 家境(1-10):))ifface1orface10:print(颜值设置有误!)continueifstrong1orstrong10:print(体质设置有误!)continueifiq1oriq10:print(智力设置有误!)continueifhome1orhome10:print(家境设置有误!)continueiffacestrongiqhome20:print(总点数超过了 20!)continueprint(初始属性设定完成!)break2. 设置性别通过 random.randint(1, 6) 生成一个 [1, 6] 的随机整数, 类似于掷色子.如果是单数, 则性别设为男孩如果是双数, 则性别设为女孩.男孩和女孩会遇到不同的事件.pointrandom.randint(1,6)# 掷色子ifpoint%21:genderboyprint(你是个男孩)else:gendergirlprint(你是个女孩)3. 设置出生点首先按照家境(home), 分成四个档位.10 是第一档. 加成最高[7, 9] 是第二档. 也有一些加成[4, 6] 是第三档. 加成较少[1, 3] 是第四档. 会扣掉属性再扔一次色子, 生成 [1, 3] 的随机数, 用来表示每一种细分情况.这里的代码主要就是各种 if else 构成.pointrandom.randint(1,3)# 掷色子ifhome10:print(你出生在帝都, 你的父母是高官政要)home1iq1face1elif7home9:ifpoint1:print(你出生在大城市, 你的父母是公务员)face2elifpoint2:print(你出生在大城市, 你的父母是大企业高管)home2else:print(你出生在大城市, 你的父母是大学教授)iq2elif4home6:ifpoint1:print(你出生在三线城市, 你的父母是教师)iq1elifpoint2:print(你出生在镇上, 你的父母是医生)strong1else:print(你出生在镇上, 你的父母是个体户)home1else:if1point2:print(你出生在村里, 你的父母是辛苦劳作的农民)strong1face-2elif3point4:print(你出生在穷乡僻壤, 你的父母是无业游民)home-1else:print(你出生在镇上, 你父母感情不和)strong-14. 针对每一岁, 生成人生经历按照年龄, 把人生经历分成四个阶段:幼年阶段 [1, 10]青年阶段 [11, 20]壮年阶段 [20, 50]老年阶段 50 岁以上.每个阶段都会有不同的精力和事件发生.幼年阶段可塑性强, 体质, 颜值, 智力都会有较快变化青年阶段主要是求学, 同时父母一辈会有明显变化, 智力和家境会有明显变化壮年阶段相对平稳, 属性变化不大, 主要是一些随机事件影响到属性.老年阶段体质, 颜值, 智力都会显著退化, 并且随着年龄的上升, 疾病/死亡的风险逐渐升高.此处我们以幼年为例, 简单实现一下这里的处理逻辑.使用 for 循环, 按照年龄循环起来.针对每一年, 先掷一次 [1, 3] 的色子, 根据不同的随机数值, 来触发不同的事件.根据性别, 年龄, 各种属性, 来触发不同的事件. 这里都使用 if - else 的方式来组织.不同的事件可能会对属性有正面/负面的影响.在每一年的最后, 打印这一年遇到的事情如果夭折, 则直接 sys.exit(0) 退出程序.使用 time.sleep(1) 使程序暂停执行 1s, 方便观察程序结果.forageinrange(1,11):infof你今年{age}岁, pointrandom.randint(1,3)# 性别触发事件ifgendergirlandhome3andpoint1:info你家里人重男轻女思想非常严重, 你被遗弃了!print(info)print(游戏结束!)sys.exit(0)# 体质触发的事件elifstrong6andpoint!3:info你生了一场病, ifhome5:info在父母的精心照料下恢复了健康strong1home-1else:info你的父母没精力管你, 你的身体状况更糟糕了strong-1# 颜值触发的事件elifface4andage7:info你因为长的太丑, 别的小朋友不喜欢你, ifiq5:info你决定用学习填充自己iq1else:ifgenderboy:info你和别的小朋友经常打架iq-1strong1else:info你经常被别的小朋友欺负strong-1# 智商触发的事件elifiq5:info你看起来傻傻的, ifhome8andage6:info你的父母给你送到更好的学校学习elif4home7:ifgenderboy:info你的父母鼓励你多运动, 加强身体素质strong1else:info你的父母鼓励你多打扮自己face1else:info你的父母为此经常吵架ifpoint1:strong-1elifpoint2:iq-1# 健康成长else:info你健康成长, ifpoint1:info看起来更聪明了iq1elifpoint2:info看起来更好看了face1else:info看起来更结实了strong1print(-------------------------------------------)print(info)print(fstrong{strong}, face{face}, iq{iq}, home{home})time.sleep(1)更多的逻辑, 此处就不再实现了. 大家可以按照类似的方式, 设计更多的事件, 完成 青年, 壮年, 老年 的相关逻辑.