像 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后面
# 打印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的
# 设置角色的出生点
# 为了简单一点,就直接生成 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)