Skip to content

if-else-elif

在实际开发过程中,很多时候,我们想要控制该如何执行后面的代码,当满足某些条件的情况下而执行另一段代码

这个时候就需要用到 if语句。

if 语句

gdscript
if (条件表达式):
    print("条件满足")

如果怎么怎么样,我就这样做

条件表达式的括号可写可不写,但如果条件很长需要换行的时候就必须加上括号了

当整个条件表达式的结果为true时,才会执行if语句块中的代码,否则将不会执行

需要注意的是,当正在执行该 if 语句块中的代码时,如果因为某些原因导致该 if 的条件表达式结果为false,并不会中断该 if 语句块内代码的执行

gdscript
var a = 10
if a > 1:
    print("a > 1")
    a = 0
    print("if 语句结束") # 这条信息也会输出到控制台

如果if语句块中需要执行的代码只有一行则可以不用换行:

gdscript
if 1 + 1 == 2: print("1+1=2!")
if 4 % 2 == 0: print("4是偶数!")

缩进

在if语句中,一定要注意缩进,正如我们在 初识代码框架 章节所述,缩进会影响代码的执行逻辑


表达式形式

If语句的条件表达式中可以填入任何结果为布尔值的表达式:


表达式太长?

如果if的条件表达式太长,可以选择加上括号和缩进以增加可读性,还可以将其赋值给一个布尔值变量或封装为一个方法

具体有关方法的知识会在后面的章节讲到

gdscript
if (1 + 1 == 2 and
    2 + 2 == 4 and 
    3 + 3 == 6 and
    4 + 4 == 8
):
    print("OK")
gdscript
var is_leap_year:bool = (2025 % 4 == 0 and 2025 % 100 != 0) or (2025 % 400 == 0)
if is_leap_year:
    pass
    
func is_leap_year(year: int) -> bool:
    return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
    
if is_leap_year(2025):
    pass

else 语句

else语句用于在上方的if语句条件不满足的情况下执行某些操作

else语句不能单独出现!同一if/else/elif语句结构上方必须要有一个if或elif语句!

gdscript
if 1 + 1 == 2:
    print("1+1=2")
else:
    print("1+1!=2")

如果else语句需要执行的代码也只有一行,也可以不用换行:

gdscript
if 1 + 1 == 2:print("1+1=2")
else:print("1+1!=2")

在一个if-elif-else结构中,只能有一个else语句,且位置必须位于最末尾,因为else语句是if-elif-else的结尾:

gdscript
if 1 + 1 == 2:
    pass
else:
    pass
else: # 错误的语法
    pass
    
# 正确的语法,每个if-elif-else结构中只能有一个else
if 1 + 1 == 2:
   if 2 + 2 == 4:
        pass
   else:
       pass
else:
    pass

elif 语句

elif是else if 的简写,用于在上一个条件不满足时检查下一个条件是否满足并执行相关语句块

elif语句不能单独出现!同一if/else/elif语句结构上方必须有一个if语句或elif语句!

gdscript
if 1 + 1 == 2:
    print("1+1=2")
else:
    if 1 + 2 == 3:
        print("1+2=3")
    else:
        print("1+1!=2 and 1+2!=3")
gdscript
if 1 + 1 == 2:
    print("1+1=2")
elif 1 + 2 == 3:
    print("1+2=3")
else:
    print("1+1!=2 and 1+2!=3")

如果需要执行的语句也只有一行,也可以不用换行:

gdscript
if 1 + 1 == 2:print("1+1=2")
elif 1 + 2 == 3:print("1+2=3")
else:print("1+1!=2 and 1+2!=3")

可以连续使用多个 elif 分支,但在同一个 if-elif-else 结构中,最多只会执行其中一个代码块。即使有多个 elif 条件都满足,也只会从上往下找到第一个成立的条件,然后执行对应的代码块。执行完毕后,整个结构就结束了,后面的条件即使也成立,也不会再执行

gdscript
if 1 + 1 == 2:
    print("1+1=2")
elif 1 + 2 == 3:
    print("1+2=3")
elif 1 + 3 == 4:
    print("1+3=4")
elif 1 + 4 == 5:
    print("1+4=5")
else:
    print("1+5=6")

在上面的例子中,虽然所有条件都成立,但最终只会输出 1+1=2,其他都不会执行

elif语句可以作为整个if-elif-else结构的结尾,在某些判断逻辑中末尾不必再加else,例如不想在所有条件都不满足的情况下执行默认逻辑,就不必加上else

gdscript
if 1 + 1 == 2:
    print("1+1=2")
elif 1 + 2 == 3:
    print("1+2=3")

嵌套语句

if语句支持嵌套,以实现复杂的逻辑

gdscript
var year: int = 2025
# 判断闰年
if year % 4 == 0:    # 四年一闰
    if year % 100 == 0:    
        if year % 400 == 0:    # 四百年再闰
            print("%s年是闰年" % year)
        else:    # 百年不闰
            print("%s年不是闰年" % year)
    else:
        print("%s年是闰年" % year)
else:
    print("%s年不是闰年" % year)

像某些嵌套结构的if语句可以通过组合条件表达式来实现同样的逻辑,代码也会更加简洁

gdscript
var year: int = 2025
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
    print("%s年是闰年" % year)
else:
    print("%s年不是闰年" % year)

注意点

  • 嵌套结构中最容易出错的地方就是缩进不一致。每一级嵌套都要统一使用相同的缩进量(如每级 4 个空格或 1 个制表符),否则代码可能会报错或者逻辑混乱

  • 当嵌套过多只是为了判断多个条件是否同时成立,可以考虑使用 and / or /not把它们组合成一个条件表达式。这样代码不仅更简洁,逻辑也更直观

  • if嵌套时,else要和if成对出现,并且遵守临近原则,else关键字总和自己最近的if语句相匹配

  • 一般建议控制在 3 层以内。如果发现代码有 4 层甚至 5 层嵌套,就要开始考虑是否可以提取成函数、或通过提前 returncontinuebreak 等方式减少嵌套层级。否则会极大程度降低可读性和可维护性

三元表达式

有时你可能希望基于布尔表达式来赋予不同的初始值,为此,三元表达式将派上用场

gdscript
var x = (表达式满足时赋予的值) if (条件表达式) else (表达式不满足时赋予的值)

比如下面这个例子:

gdscript
y += 3 if y < 10 else -1

它相当于:

gdscript
if y < 10:
    y += 3
else:
    y += -1

可以通过嵌套三元 if 表达式来处理的超过两种可能性的情况。

嵌套时,推荐把三元 if 表达式拆分为多行进行表达以保证代码的可读性

gdscript
var count = 0
var fruit = (
    "apple" if count == 2 else 
    "pear" if count == 1 else 
    "banana" if count == 0 else 
    "orange"
)
print(fruit) # 输出"banana"

不过即使进行了换行处理,嵌套三元表达式的可读性仍然不如使用常规的 if-elif-else 结构清晰。下面是与上述代码等价的写法,更推荐用于处理复杂条件:

gdscript
var count: int = 0
var fruit: String

if count == 2:
    fruit = "apple"
elif count == 1:
    fruit = "pear"
elif count == 0:
    fruit = "banana"
else:
    fruit = "orange"
  • 三元表达式适合处理简单的两种情况。超过两层嵌套建议改用 if 语句,保持代码清爽

练习

  1. 请阅读以下代码,思考每个变量的值会是什么

    gdscript
    var age := 16
    var has_coupon := true
    var favorite_color := "blue"
    var fruit: String
    
    # 经典 if-elif-else 结构
    if age < 10:
        fruit = "banana"
    elif age < 18:
        if has_coupon:
            fruit = "apple"
        else:
            fruit = "pear"
    else:
        fruit = "grape"
    
    # 使用三元表达式重新赋值
    fruit = "mango" if favorite_color == "yellow" else fruit
    
    print("你获得的水果是: %s" % fruit)
  2. 下面代码的输出结果是什么,如果number的值为8结果又是什么?

    gdscript
    var number := 13
    var result: String
    
    if number == 0:
        result = "zero"
    elif number % 2 == 0:
        result = "even"
    else:
        result = "odd"
    
    print(result)
  3. 这段代码会输出多少?那如果has_coupon = true 又会是多少?

    gdscript
    var has_coupon := false
    var total_price := 100
    var final_price := total_price * (0.8 if has_coupon else 1.0)
    
    print(final_price)
  4. 现在是雨天,心情很好,那你会吃到什么糖?

    gdscript
    var mood := "happy"
    var weather := "rainy"
    var candy: String
    
    if mood == "happy":
        if weather == "sunny":
            candy = "lollipop"
        else:
            candy = "chocolate"
    else:
        candy = "gummy bear"
    
    print("你今天适合吃:", candy)
  5. 输出是什么?

    gdscript
    var level := 2
    var rank := (
        "SSS" if level == 5
        else "SS" if level == 4
        else "S" if level == 3
        else "A" if level == 2
        else "B"
    )
    
    print("你获得的评价是:", rank)