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

一、顺序语句

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

python 复制代码
print("1")
print("2")
print("3")

运行结果:

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

二、条件语句

1、语法格式

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

(1) if

python 复制代码
if expression:
    do_something1
    do_something2
next_something

如果 expression 值为 True,则执行 do_something1、do_something2 和 next_something。

如果 expression 值为 False,则只执行 next_something,不执行 do_something1、do_something2。

(2) if - else

python 复制代码
if expression:
    do_something1
else:
    do_something2

如果 expression 值为 True,则执行 do_something1。

如果 expression 值为 False,则执行 do_something2。

(3) if - elif - else

python 复制代码
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表示躺平摆烂。

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

运行结果:

2、缩进和代码块

代码块 指的是一组放在一起执行的代码。

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

代码一:

python 复制代码
a = input("请输入一个整数: ")
if a == "1":
    print("hello")
    print("world")

运行结果:

代码二:

python 复制代码
a = input("请输入一个整数: ")
if a == "1":
    print("hello")
print("world")

运行结果:

注意上述代码的区别。

在代码1 中,print("world") 有一级缩进,这个语句属于 if 内的代码块,意味着条件成立才执行,条件不成立则不执行。

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

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

python 复制代码
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 这些语言,即使完全不写缩进,语法也不会报错,代码可读性就比较差。

同时,带来的坏处就是,如果缩进层次比较多,就容易分不清楚某个语句属于哪个层级。

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

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

3、练习

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

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

运行结果:

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

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

运行结果:

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

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

运行结果:

4、空语句 pass

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

c 复制代码
a = int(input("请输入一个整数:"))
if a == 1:
    print("hello")

运行结果:

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

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

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

三、循环语句

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

1、while 循环

基本语法格式:

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

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

c 复制代码
num = 1
while num <= 10:
    print(num)
    num += 1

运行结果:

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

c 复制代码
sum = 0
num = 1
while num <= 100:
    sum += num
    num += 1
print(sum)

运行结果:

练习3:计算5的阶乘。

c 复制代码
result = 1
n = 1
while n <= 5:
    result *= n
    n += 1
print(result)

运行结果:

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

python 复制代码
sum = 0
num = 1
# 分别求1 - 5(num)的阶乘
while num <= 5:
    result = 1
    # 求第num次的阶乘
    i = 1
    while i <= num:
        result *= i
        i += 1
    sum += result
    num += 1
print(sum)

运行结果:

这个程序用到了两重循环。

也就是在循环语句中也可以套循环。

2、for 循环

基本语法格式:

c 复制代码
for 循环变量 in 可迭代对象:
    循环体

注意:

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

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

c 复制代码
for i in range(1,11):
    print(i)

运行结果:

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

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

c 复制代码
for i in range(2,12,2):
    print(i)

运行结果:

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

练习2: 打印 10-1。

c 复制代码
for i in range(10,0,-1):
    print(i)

运行结果:

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

练习3: 求 1 - 100 的和。

c 复制代码
sum = 0
for i in range(1,101):
    sum += i
print(sum)

运行结果:

3、continue

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

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

c 复制代码
for i in range(1,6):
    if i == 3:
        continue
    print(f"吃完第{i}个包子")

运行结果:

4、break

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

c 复制代码
for i in range(1,6):
    if i == 3:
        break
    print(f"吃完第{i}个包子")

运行结果:

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

c 复制代码
sum = 0
count = 0
while True:
    num = input("请输入数字:")
    if num == ';':
        break
    num = float(num)
    sum += num
    count += 1
print(sum / count)

运行结果:

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

实现 "人生重开模拟器"。

这是一款之前很火的文字类小游戏。玩家输入角色的初始属性之后,就可以开启不同的人生经历。

大家可以在网上搜索 "人生重开模拟器",就可以玩到这个游戏的各种版本。

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

1、设置初始属性

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

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

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

c 复制代码
# 主页面
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("颜值设置有误!")
        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
    if face + strong + iq + home > 20:
        print("总点数超过了20!")
        continue

    print("初始属性设定完成!")
    break

再来运行测试:

正常运行:

某项属性输入错误:

点数之和超出总点数:

2、设置性别

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

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

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

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

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

再进行测试:

3、设置出生点

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

  • 10 是第一档,加成最高。
  • 7, 9\] 是第二档,也有一些加成。

  • 1, 3\] 是第四档,会扣掉属性。

c 复制代码
# 掷色子
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 <= 6:
    if point == 1:
        print("你出生在三线城市,你的父母是教师")
        iq += 1
    elif point == 2:
        print("你出生在镇上,你的父母是医生")
        strong += 1
    else:
        print("你出生在镇上,你的父母是个体户")
        home += 1
else:
    if 1 <= point <= 2:
        print("你出生在村里,你的父母是辛苦劳作的农民")
        strong += 1
        face -= 2
    elif 3 <= point <= 4:
        print("你出生在穷乡僻壤,你的父母是无业游民")
        home -= 1
    else:
        print("你出生在镇上,你的父母感情不和")
        strong -= 1

进行测试:

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

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

  • 1, 10\]:幼年阶段

  • 20, 50\]:壮年阶段

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

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

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

  • 使用 for 循环,按照年龄循环起来。
  • 针对每一年,先掷一次 [1, 3] 的色子,根据不同的随机数值,来触发不同的事件。
  • 根据性别、年龄、各种属性,来触发不同的事件。这里都使用 if - else 的方式来组织。
  • 不同的事件可能会对属性有正面/负面的影响。
  • 在每一年的最后,打印这一年遇到的事情。
  • 如果夭折,则直接 sys.exit(0) 退出程序。需要在开头导入import sys
  • 使用 time.sleep(1) 使程序暂停执行 1s,方便观察程序结果。需要在开头导入import time
c 复制代码
# 幼年
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 += 1
            home -= 1
        else:
            info += '你的父母没精力管你,你的身体状况更糟糕了'
            strong -= 1

    # 颜值触发的事件
    elif face < 4 and age >= 7:
        info += '你因为长的太丑,别的小朋友不喜欢你,'
        if iq > 5:
            info +='你决定用学习填充自己'
            iq += 1
        else:
            if gender == 'boy':
                info += '你和别的小朋友经常打架'
                iq -= 1
                strong += 1
            else:
                info += '你经常被别的小朋友欺负'
                strong -= 1

    # 智商触发的事件
    elif iq < 5:
        info += '你看起来傻傻的,'
        if home >= 8 and age >= 6:
            info +='你的父母给你送到更好的学校学习'
        elif 4 <= home <= 7:
            if gender == 'boy':
                info += '你的父母鼓励你多运动,加强身体素质'
                strong += 1
            else:
                info += '你的父母鼓励你多打扮自己'
                face += 1
        else:
            info += '你的父母为此经常吵架'
            if point == 1:
                strong -= 1
            elif point == 2:
                iq -= 1

    # 健康成长
    else:
        info += '你健康成长,'
        if point == 1:
            info += '看起来更聪明了'
            iq += 1
        elif point == 2:
            info += '看起来更好看了'
            face += 1
        else:
            info += '看起来更结实了'
            strong += 1

    print('-------------------------------------------')
    print(info)
    print(f'strong={strong},face={face},iq={iq},home={home}')
    time.sleep(1)

运行结果:

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

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

相关推荐
_extraordinary_1 分钟前
Java 内部类
java·开发语言
huazeci10 分钟前
PHP生成pdf方法
开发语言·pdf·php
程序员的世界你不懂18 分钟前
Appium+python自动化(七)- 认识Appium- 上
python·appium·自动化
赵大仁19 分钟前
Next.js 15 与 Apollo Client 的现代集成及性能优化
开发语言·javascript·性能优化
钢铁男儿37 分钟前
C#核心概念解析:析构函数、readonly与this关键字
开发语言·javascript·c#
ErizJ1 小时前
Golang | 搜索哨兵-对接分布式gRPC服务
开发语言·分布式·golang·grpc
黑不拉几的小白兔1 小时前
第十五届蓝桥杯大赛软件赛国赛Python 大学 C 组试做【本期题单: 设置密码、栈】
c语言·python·蓝桥杯
ZHPEN11 小时前
python打卡day38
python
一刀到底2111 小时前
java 开发中 nps的内网穿透 再git 远程访问 以及第三放支付接口本地调试中的作用
java·开发语言·git
灏瀚星空1 小时前
Tesseract 字库介绍与训练指南
经验分享·笔记·爬虫·python