python中的条件判断语句怎么用

 python中的条件判断语句怎么用

这篇文章主要为大家展示了“python中的条件判断语句怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中的条件判断语句怎么用”这篇文章吧。

1. 避免多层分支嵌套

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

 python中的条件判断语句怎么用

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

defbuy_fruit(nerd,store):"""去水果店买苹果-先得看看店是不是在营业-如果有苹果的话,就买1个-如果钱不够,就回家取钱再来"""ifstore.is_open():ifstore.has_stocks("apple"):ifnerd.can_afford(store.price("apple",amount=1)):nerd.buy(store,"apple",amount=1)returnelse:nerd.go_home_and_get_money()returnbuy_fruit(nerd,store)else:raiseMadAtNoFruit("noappleinstore!")else:raiseMadAtNoFruit("storeisclosed!")

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

defbuy_fruit(nerd,store):ifnotstore.is_open():raiseMadAtNoFruit("storeisclosed!")ifnotstore.has_stocks("apple"):raiseMadAtNoFruit("noappleinstore!")ifnerd.can_afford(store.price("apple",amount=1)):nerd.buy(store,"apple",amount=1)returnelse:nerd.go_home_and_get_money()returnbuy_fruit(nerd,store)

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

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

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

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

ifperson.is_studentandperson.age>20andperson.is_male:pass

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

ifperson.identity()andperson.gender():pass

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

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

ifperson.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(),)

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

ifperson.is_student():imformation_func=record_imformationextra_args={'student_number':10011,'recorded':now()}else:imformation_func=update_informationextra_args={'updated':now()}information_func(name=person.name,age=person.name,address=person.address,**extra_args)

4. 合理使用三元表达式

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

language="python"ifyou.favor("dynamic")else"golang"

5. 常见技巧

5.1德摩根定律

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

#如果用户没有登录或者用户没有使用chrome,拒绝提供服务ifnotuser.has_logged_inornotuser.is_from_chrome:return"ourserviceisonlyavailableforchromeloggedinuser"

而使用德摩根定律。

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

ifnot(user.has_logged_inanduser.is_from_chrome):return"ourserviceisonlyavailableforchromeloggedinuser"

5.2自定义类的魔法方法

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

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

classUserCollection(object):def__init__(self,users):self._users=usersusers=UserCollection([piglei,raymond])iflen(users._users)>0:print("There'ssomeusersincollection!")

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

classUserCollection:def__init__(self,users):self._users=usersdef__len__(self):returnlen(self._users)users=UserCollection([piglei,raymond])#定义了__len__方法后,UserCollection对象本身就可以被用于布尔判断了ifusers:print("There'ssomeusersincollection!")

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

  • all (x) : x 中所有对象都为真时返回 True, 否则 False

  • any (x): 只要 x 中一个对象为真时返回 True, 否则 False

defall_numbers_gt_10(numbers):"""仅当序列中所有数字大于10时,返回True"""ifnotnumbers:returnFalseforninnumbers:ifn<=10:returnFalsereturnTrue

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

defall_numbers_gt_10_2(numbers):returnbool(numbers)andall(n>10forninnumbers)

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

defdo_stuff():first_thing_successed=Falsetry:#...first_thing_successed=TrueexceptExceptionase:#...return#仅当first_thing成功完成时,做第二件事iffirst_thing_successed:returndo_the_second_thing()

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

defdo_stuff():try:#...exceptExceptionase:#...returnelse:returndo_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

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

(TrueorFalse)andFalse#FalseTrueorFalseandFalse#True

此外:

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

以上是“python中的条件判断语句怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2022-03-18 22:52:12
收藏
分享
海报
0 条评论
38
上一篇:python使用数字与字符串方法技巧有哪些 下一篇:vue-cli如何实现异步请求返回mock模拟数据
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码