python 中的条件判断语句的使用介绍

目录
  • 1. 避免多层分支嵌套
  • 2. 封装过于复杂的逻辑判断
  • 3. 不同分支下的重复代码
  • 4. 合理使用三元表达式
  • 5. 常见技巧
    • 5.1德摩根定律
    • 5.2自定义类的魔法方法
    • 5.3在条件判断中使用 all() / any()
    • 5.4使用 try/while/for 中 else 分支
  • 6. 常见陷阱
    • 6.1与 None 值得比较
    • 5.2and 和 or 的运算优先级

1. 避免多层分支嵌套

Python中利用缩进来替代 { }。如果多个 if 嵌套, 堪称 ” 嵌套 if 地狱 “

下面的代码直接翻译了原始条件分支,导致代码可读性和维护性很差。

def buy_fruit(nerd, store):
    """去水果店买苹果
    
    - 先得看看店是不是在营业
    - 如果有苹果的话,就买 1 个
    - 如果钱不够,就回家取钱再来
    """
    if store.is_open():
        if store.has_stocks("apple"):
            if nerd.can_afford(store.price("apple", amount=1)):
                nerd.buy(store, "apple", amount=1)
                return
            else:
                nerd.go_home_and_get_money()
                return buy_fruit(nerd, store)
        else:
            raise MadAtNoFruit("no apple in store!")
    else:
        raise MadAtNoFruit("store is closed!")

我们利用取反的方式,“提前结束” 来优化这段代码:

def buy_fruit(nerd, store):
    if not store.is_open():
        raise MadAtNoFruit("store is closed!")

    if not store.has_stocks("apple"):
        raise MadAtNoFruit("no apple in store!")

    if nerd.can_afford(store.price("apple", amount=1)):
        nerd.buy(store, "apple", amount=1)
        return
    else:
        nerd.go_home_and_get_money()
        return buy_fruit(nerd, store)

“提前结束” :指在函数内使用 return 或 raise 等语句提前在分支内结束函数。

利用逆向思维,当分支条件不满足时,我们直接结束这段代码,这样更容易阅读。

2. 封装过于复杂的逻辑判断

如果条件分支中有过多的判断条件 and | not | or, 可以将这样的部分封装起来。

if person.is_student and person.age > 20 and person.is_male:
    pass

这样封装的部分更有可解释性,更容易被人理解。
最重要的事还解决了,相同代码多次出现的问题。

if person.identity() and person.gender():
    pass

3. 不同分支下的重复代码

下面的代码很难让人直观分别出不同:

if person.is_student():
    record_imformation(
    name = person.name,
    age = person.name,
    address = person.address,
    student_number = 10011,
    recorded = now(),
    )
else:
    update_information(
    name = person.name,
    age = person.name,
    address = person.address,
    updated = now(),
    )

关注这些由分支产生的重复代码块,通过转化简化它们。

if person.is_student():
    imformation_func =  record_imformation
    extra_args = {'student_number' : 10011, 'recorded' : now() }
else:
    imformation_func = update_information
    extra_args = {'updated' : now() }

information_func(
    name = person.name,
    age = person.name,
    address = person.address,
    **extra_args
)

4. 合理使用三元表达式

使用普通的if / else 语句 代码可读性通常更好。
对于三元表达式只处理简单的逻辑分支即可。

language = "python" if you.favor("dynamic") else "golang"

5. 常见技巧

5.1德摩根定律

对于下面的代码,很难第一时间 get 到逻辑关系。

# 如果用户没有登录或者用户没有使用 chrome,拒绝提供服务
if not user.has_logged_in or not user.is_from_chrome:
    return "our service is only available for chrome logged in user"

而使用德摩根定律。

not A or not B = not (A and B), 代码读起来会容易很多。

if not (user.has_logged_in and user.is_from_chrome):
    return "our service is only available for chrome logged in user"

5.2自定义类的魔法方法

python提供了跟多自定义类的魔法方法,我们可以利用它门,让我们的代码更加pythonic

下面的代码用到了len() 函数。

class UserCollection(object):

    def __init__(self, users):
        self._users = users

users = UserCollection([piglei, raymond])

if len(users._users) > 0:
    print("There's some users in collection!")

通过给类自定义魔法方法,分支条件变得更加简单。
并且可以自己控制魔法方法的返回值。

class UserCollection:

    def __init__(self, users):
        self._users = users

    def __len__(self):
        return len(self._users)

users = UserCollection([piglei, raymond])

# 定义了 __len__ 方法后,UserCollection 对象本身就可以被用于布尔判断了
if users:
    print("There's some users in collection!")

5.3在条件判断中使用 all() / any()

  • all (x) : x 中所有对象都为真时返回 True, 否则 False
  • any (x): 只要 x 中一个对象为真时返回 True, 否则 False
def all_numbers_gt_10(numbers):
    """仅当序列中所有数字大于 10 时,返回 True
    """
    if not numbers:
        return False

    for n in numbers:
        if n <= 10:
            return False
    return True

使用all ( )内建函数,再配合生成器表达式。

def all_numbers_gt_10_2(numbers):
    return bool(numbers) and all(n > 10 for n in numbers)

5.4使用 try/while/for 中 else 分支

def do_stuff():
    first_thing_successed = False
    try:
        # ...
        first_thing_successed = True
    except Exception as e:
        # ...
        return

    # 仅当 first_thing 成功完成时,做第二件事
    if first_thing_successed:
        return do_the_second_thing()

其实,我们可以用更简单的方法达到同样的效果:

def do_stuff():
    try:
        # ...
    except Exception as e:
        # ...
        return
    else:
        return do_the_second_thing()

try 的语句块后面加上 else 分支。
类似的 for / while 也支持 else 分支。

6. 常见陷阱

6.1与 None 值得比较

在 python 中, == 与 is 两种比较方法有根本的区别。

  • == : 仅比较两者的值是否一致
  • is : 比较两者是否指向内存中的同一份地址。

但是 None 在 python 中是一个单例对象,如果要判断某个变量是否为 None 要用 is, 只有 is 才严格意义上表示某个变量是否为None

5.2and 和 or 的运算优先级

and 的优先级大于 or

即使执行的优先级如我们想要的一致,也要采取额外括号的方式让代码更清晰。

(True or False) and False # False
True or False and False # True

此外:

c and a or b 不是总能给出正确的结果。只有当 a 与 b 的布尔值为真时,这个表达式才正常工作,因为逻辑运算的短路特性。

到此这篇关于 python 中的条件判断语句的使用介绍的文章就介绍到这了,更多相关 python 条件判断语句内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈Python的条件判断语句if/else语句

    计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户的年龄,根据年龄打印不同的内容... Python程序中,能让计算机自己作出判断的语句就是if语句: 例: age = 25 if age >= 18: print "your age is %d, you are a adult." % age 根据python的缩进规则,如果if语句的条件判断为True,就执行缩进的内容,即print执行,否则,什么也不会做. 当然,也可以给if添加一个else语句,

  • Python中的条件判断语句与循环语句用法小结

    if语句 >>通用格式 if语句一般形式如下: if <test1>: <statements1> elif <test2>: <statements2> else: <statements3> 另外需要注意的是,Python中是没有switch/case语句的 while循环 while语句是Python语言中最通用的迭代结构,简而言之,只要顶端测试一直计算到真值,就会重复执行一个语句块. >>一般格式 while &l

  • Python中的条件判断语句基础学习教程

    if语句用来检验一个条件, 如果 条件为真,我们运行一块语句(称为 if-块 ), 否则 我们处理另外一块语句(称为 else-块 ). else 从句是可选的. 使用if语句: #!/usr/bin/python # Filename: if.py number = 23 guess = int(raw_input('Enter an integer : ')) if guess == number: print 'Congratulations, you guessed it.' # New

  • Python中条件判断语句的简单使用方法

    最简单的条件语句: if expression: expr_true_suite 如上,if是关键字,expression是条件表达式,条件表达式支持多重条件判断,可以用布尔操作符and.or和not连接,expr_true_suite是代码块,expression为true时执行,代码块如果只有一行,上面的整个条件语句便可全部写到一行,但可读性差. 带elif和else的条件语句: if expression1: expr1_true_suite elif expression2: expr2

  • Python学习之if 条件判断语句

    目录 1.基本 if 条件语句: 2.嵌套 if 语句 3.if 和 elif 搭配使用: 4.if 语句中 pass 总结 if 语句是判断语句 常常搭配else一起使用 if 后面紧跟的是判断条件然后以":"结尾,下一行缩进后则是输出的结果 else 则与对应的if持平不用再次缩进因为他们是互相呼应的 elif 则是补充的判断语句,会出现在 if 与 else 之间,并且它与对应 if 与 else 持平不用再次缩进, elif 是一个缩写的词语elif = else if  ,稍

  • 详解Python中的条件判断语句

    一个else语句可以使用if语句结合起来.如果在if语句中的条件表达式解析为0或false值,那么else语句包含代码执行. else语句是可选的声明,并if语句下面最多只有一个else语句. 语法: if ... else语句的语法是: if expression: statement(s) else: statement(s) 例子: #!/usr/bin/python var1 = 100 if var1: print "1 - Got a true expression value&qu

  •  python 中的条件判断语句的使用介绍

    目录 1. 避免多层分支嵌套 2. 封装过于复杂的逻辑判断 3. 不同分支下的重复代码 4. 合理使用三元表达式 5. 常见技巧 5.1德摩根定律 5.2自定义类的魔法方法 5.3在条件判断中使用 all() / any() 5.4使用 try/while/for 中 else 分支 6. 常见陷阱 6.1与 None 值得比较 5.2and 和 or 的运算优先级 1. 避免多层分支嵌套 Python中利用缩进来替代 { }.如果多个 if 嵌套, 堪称 ” 嵌套 if 地狱 “ 下面的代码直

  • 对Python中的条件判断、循环以及循环的终止方法详解

    条件判断 条件语句是用来判断给定条件是否满足,并根据判断所得结果从而决定所要执行的操作,通常的逻辑思路如下图: 单次判断 形式 if <判断条件>: <执行> else: <执行> 例子 age = int(input("输入你的年龄:")) if age < 18: print("未成年") else: print("已成年") 多次判断 形式 if <判断条件1>: <执行1>

  • Python中的if判断语句中包含or问题

    目录 Python if判断语句中包含or python中if相关语句 1.if语句 2.if-else语句 3.if-elif-else(多重判断)语句 4.if嵌套语句 5.猜拳小游戏 6.三目运算符 Python if判断语句中包含or i= 0 if i == 1 or 5: print(i) 此时并非是判断i是否等于1或者5,而是(if i == 1) or (5): 所以这个if判断语句前半段 i==1为false, 则继续判断后半句:后半段为5,此时5为非零,即为true.所以整体

  • 详解C++编程中的条件判断语句if-else与switch的用法

    if-else 语句 控制条件分支. 语法 if ( expression ) statement1 [else statement2] 备注 如果 expression 的值不为零,执行 statement1 .如果选项 else 存在,如果 expression 的值为零,执行 statement2. 表达式必须是算术或指针类型,或者必须是定义明确的整型或指针类型转换的类类型.有关转换器的信息,请参见标准转换. 在两个形式的 if 语句和 expression 语句中计算,可以具有除结构以外

  • JavaScript中的条件判断语句使用详解

    在写一个程序,可能有一种情况,当你需要采用一个路径出给定两个路径.所以,需要使用条件语句,让程序来做出正确的决策和执行正确的行动. JavaScript支持其用于执行根据不同的条件不同的操作条件语句.在这里,我们将解释if..else语句. JavaScript支持if..else语句的形式如下: if 语句 if...else 语句 if...else if... 语句. if 语句: if语句是基本的控制语句,它允许JavaScript来作出决定,有条件地执行语句. 语法: if (expr

  • 全面掌握Java中的循环控制语句与条件判断语句的使用

    循环控制 可能存在一种情况,当我们需要执行的代码块数次,通常被称为一个循环. Java有非常灵活的三循环机制.可以使用以下三种循环之一: while 循环 do...while 循环 for 循环 截至Java5,对增强的for循环进行了介绍.这主要是用于数组. while 循环 while循环是一个控制结构,可以重复的特定任务次数. 语法 while循环的语法是: while(Boolean_expression) { //Statements } 在执行时,如果布尔表达式的结果为真,则循环中

随机推荐