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

文章目录

  • 1.顺序语句
  • 2.条件语句
    • 2.1语法格式
      • [2.1.1 if](#2.1.1 if)
      • [2.1.2 if - else](#2.1.2 if - else)
      • [2.1.3 if - elif - else](#2.1.3 if - elif - else)
    • 2.2缩进和代码块
    • [2.3 空语句 pass](#2.3 空语句 pass)
  • [3. 循环语句](#3. 循环语句)
    • [3.1 while 循环](#3.1 while 循环)
    • [3.2 for 循环](#3.2 for 循环)
    • [3.3 continue](#3.3 continue)
    • [3.4 break](#3.4 break)
  • [4. 综合案例](#4. 综合案例)
    • [4.1 设置初始属性](#4.1 设置初始属性)
    • [4.2 设置性别](#4.2 设置性别)
    • [4.3 设置出生点](#4.3 设置出生点)
    • [4.4 针对每一岁, 生成人生经历](#4.4 针对每一岁, 生成人生经历)

1.顺序语句

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

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

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

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


2.条件语句

条件语句能够表达 "如果 ... 否则 ..." 这样的语义. 这构成了计算机中基础的 逻辑判定.

条件语句 也叫做 分支语句, 表示了接下来的逻辑可能有几种走向。


2.1语法格式

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


2.1.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.1.2 if - else

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

如果 expression 值为 True, 则执行 do_something1

如果 expression 值为 False, 则执行 do_something2


2.1.3 if - elif - else

python 复制代码
if expression1:
 do_something1
elif expression2:
 do_something2
else:
 do_something3

如果 expression1 值为 True, 则执行 do_something1

如果 expression1 值为 False, 并且 expression2True 则执行 do_something2

如果 expression1 值为 False, 并且 expression2False 则执行 do_something3
注意: Python中的条件语句写法, 和很多编程语言不太一样。

if 后面的条件表达式, 没有 ( ), 使用 : 作为结尾。

if / else 命中条件后要执行的 "语句块", 使用 缩进 (通常是 4 个空格或者 1 个 tab)来表示, 而不是 { }

对于多条件分支, 不是写作 else if, 而是 elif (合体了)。


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

python 复制代码
choice = input("输入 1 表示认真学习, 输入 2 表示躺平摆烂: ")
# 注意这里输入的是字符串1,而不是整数1
if choice == "1":
    print("你会找到好工作!")
elif choice == "2":
    print("你可能毕业就失业了!")
# 不过实际开发中,用户的输入可能是出乎意料的,所以要做出一些特殊处理。
else:
    print("你的输入有误!")

2.2缩进和代码块

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

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

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

打印:

python 复制代码
请输入一个整数: 1
hello
world
python 复制代码
请输入一个整数: 0

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

打印:

python 复制代码
请输入一个整数: 1
hello
world
python 复制代码
请输入一个整数: 0
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")

请问, 上述代码中的 print("1") 和 print("2") 属于哪一级缩进?

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


练习

(1) 输入一个整数, 判定是否是奇数

python 复制代码
a = int(input("请输入一个整数: "))  # 要把字符串a转换成int类型
if a % 2 == 0: # 负数也可以判断,这个==在python里面可以这么用
    print("偶数")
else:
    print("奇数")

(2) 输入一个整数, 判定是正数还是负数

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

(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 % 100 != 0 and year % 4 == 0) or year % 400:
    print("闰年")
else:
    print("平年")

2.3 空语句 pass

代码示例: 输入一个数字, 如果数字为 1, 则打印 hello

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

这个代码也可以等价写成

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

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

如果代码写作

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

程序是不符合 Python 语法的, 会直接报错。


3. 循环语句

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

3.1 while 循环

基本语法格式

python 复制代码
while 条件:
    循环体

条件为真, 则执行循环体代码.

条件为假, 则结束循环.

代码示例: 打印 1-10 的整数

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

代码示例: 计算 1-100 的和

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

代码示例: 计算 5 的阶乘

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

代码示例: 求 1! + 2! + 3! + 4! + 5!

python 复制代码
num = 1
sum = 0
while num <= 5:
    factorResult = 1
    i = 1
    while i <= num:
        factorResult *= i
        i += 1
    sum += factorResult
    num += 1
print(sum)

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

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


3.2 for 循环

基本语法格式

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

注意:

pythonfor 和其他语言不同, 没有 "初始化语句", "循环条件判定语句", "循环变量更新语句", 而是更加简单

所谓的 "可迭代对象", 指的是 "内部包含多个元素, 能一个一个把元素取出来的特殊变量"

代码示例: 打印 1-10

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

使用 range 函数, 能够生成一个可迭代对象. 生成的范围是 [1, 11), 也就是 [1, 10]

代码示例: 打印 2, 4, 6, 8, 10

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

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

代码示例: 打印 10-1

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

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

代码示例: 求 1 - 100 的和

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

为什么sum下面会出现虚线呢?

因为当前有个内建函数也叫sum,我们可以把自己定义的sum改一下,这样就不会出现下划线了。


那么如何批量修改呢?

我们把鼠标放到sum上面,点击一下,然后键盘上同时点击shiftf6这两个键,然后会出现下面这个弹窗

修改后点击重构即可一键替换。


3.3 continue

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

代码示例: 模拟吃包子. 吃第 3 个包子的时候吃出了一只虫。

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

3.4 break

break 表示结束整个循环

代码示例: 模拟吃包子。吃第 3 个包子的时候吃出了半只虫。

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

代码示例: 输入若干个数字, 求平均值。 使用 "分号" 作为结尾。

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

4. 综合案例

实现 "人生重开模拟器"

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

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

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


4.1 设置初始属性

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

颜值 (face)

体质 (strong)

智力 (iq)

家境 (home)

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

如果玩家输入的初始属性不合理, 就提示输入有误, 重新输入。

python 复制代码
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("初始属性设定完成!")
    print(f"颜值:{face},体质:{strong},智力:{iq},家境:{home}")
    break

4.2 设置性别

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

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

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

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

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

4.3 设置出生点

首先按照家境(home), 分成四个档位。

10 是第一档. 加成最高

[7, 9] 是第二档。 也有一些加成

[4, 6] 是第三档。加成较少

[1, 3] 是第四档。 会扣掉属性.

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

这里的代码主要就是各种 if else 构成。

python 复制代码
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.4 针对每一岁, 生成人生经历

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

幼年阶段 [1, 10]

青年阶段 [11, 20]

壮年阶段 [20, 50]

老年阶段 50 岁以上.
每个阶段都会有不同的精力和事件发生.

幼年阶段可塑性强, 体质, 颜值, 智力都会有较快变化

青年阶段主要是求学, 同时父母一辈会有明显变化, 智力和家境会有明显变化.

壮年阶段相对平稳, 属性变化不大, 主要是一些随机事件影响到属性.

老年阶段体质, 颜值, 智力都会显著退化, 并且随着年龄的上升, 疾病/死亡的风险逐渐升高.
此处我们以幼年为例, 简单实现一下这里的处理逻辑.

使用 for 循环, 按照年龄循环起来.

针对每一年, 先掷一次 [1, 3] 的色子, 根据不同的随机数值, 来触发不同的事件.

根据性别, 年龄, 各种属性, 来触发不同的事件. 这里都使用 if - else 的方式来组织.

不同的事件可能会对属性有正面/负面的影响.

在每一年的最后, 打印这一年遇到的事情.

如果夭折, 则直接 sys.exit(0) 退出程序.

使用 time.sleep(1) 使程序暂停执行 1s, 方便观察程序结果.

python 复制代码
for age in range(1, 11):
    info = f'你今年 {age} 岁, ' # 把一整年的打印都整理到一个字符串中,然后在这年的结尾统一打印。
    point = random.randint(1, 3) # 生成一个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)
相关推荐
蝶开三月1 分钟前
php:使用socket函数创建WebSocket服务
网络·websocket·网络协议·php·socket
喜欢猪猪1 分钟前
Django:从入门到精通
后端·python·django
糖豆豆今天也要努力鸭7 分钟前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch
G丶AEOM15 分钟前
SSL/TLS,SSL,TLS分别是什么
网络·网络协议·网络安全
烦躁的大鼻嘎15 分钟前
【Linux】深入理解GCC/G++编译流程及库文件管理
linux·运维·服务器
乐大师16 分钟前
Deepin登录后提示“解锁登陆密钥环里的密码不匹配”
运维·服务器
儒道易行18 分钟前
【DVWA】RCE远程命令执行实战
网络·安全·网络安全
ac.char22 分钟前
在 Ubuntu 上安装 Yarn 环境
linux·运维·服务器·ubuntu
敲上瘾23 分钟前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
何大春23 分钟前
【弱监督语义分割】Self-supervised Image-specific Prototype Exploration for WSSS 论文阅读
论文阅读·人工智能·python·深度学习·论文笔记·原型模式