首页 > 编程语言 >Python笔记:控制流优化

Python笔记:控制流优化

时间:2023-10-01 20:13:30浏览次数:33  
标签:__ None return Python self 控制流 笔记 score True

零值判断

Python当中有个语法糖是可以直接对某个对象做空值判断:

if nums_arr:
	pass

不同类型的数据对应什么样的bool值呢?我们可以有如下的判断:

  • None 、0、False 、空列表、空元组、空字典、空集合等等都对应布尔值为假。
  • 其余的对应布尔值为真。

但是现在问题来了,对于开发者自己写的对象,布尔值应该返回什么?默认情况下返回的一定是True,但是我们可以写 __bool__ 方法来自定义:

class ScoreJudger:
	def __init__(self,score):
		self.score = score
	def __bool__(self):
		return self.score >= 60

None值比较

我们可以利用 == 运算符来判断是否等于 None

if m == None:
	pass

对于自定义的对象,有一个内置的方法叫做 __eq__ ,这个方法的作用是重载 == 运算符的作用:

def __eq__(self,other):
	# other 表示作比较的另一个对象
	return True

这样就会出现一个问题,如何严格判断是否为None?当我写出上面的函数时,我有可能在与None比较的时候无论怎样都返回True,这是不行的。解决方案就是使用 is 方法:

if l is None:
	pass

is 的特点就是不能被重载,并且在比对的时候比对的是内存地址而非值,这就使得在与None比较的时候,不是None的都不会通过 is 的检验。

分支判断优化

在使用边界条件判断等级的时候,我们往往碰到这样的情况:

if score >= 90:
	return 'S'
elif score >= 80:
	return 'A'
elif score >=70:
	return 'B'
else:
	return 'C'

这段代码不能说不好,但是在编写的时候比较繁琐,不够Pythonic,一个相对比较好的替代方案就是利用官方库 bisect 来进行查找:

from bisect import bisect
def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
    i = bisect(breakpoints, score)
    return grades[i]

print([grade(score) for score in [33, 99, 77, 70, 89, 90, 100]])

上面的代码写出了替代方案,bisect 函数的作用是利用二分查找,并且返回所处的数值段,就上面的代码来说可以依据下图理解:
![[bisect分段.png]]
若 \(i\leq60\) ,那么就返回 \(0\) ,若 \(60<i\leq70\) ,那么返回 \(0\) ,以此类推,有了这个代码,我们可以更快速地返回我们想要的分数段对应结果。

条件封装

在使用分支语句判断时,我们常常会遇到复杂的条件判断式:

class Student:
	def __init__(self,score,sex):
		self.score = score
		self.sex = sex

s1 = Student(100,'female')
s2 = Student(99,'male')
if(
   s1.sex == 'female'
   and s1.score > 60
):
	print('合格')

上面的条件表达式实际上可以封装成一个类方法来简化条件表达式。

def is_female_and_passed():
	return s1.sex == 'female' and s1.score > 60

这样在后面调用的时候就能更好地提升代码的可读性。

条件表达式的逻辑构建

德摩根定律

我们知道德摩根定律如下:

\[\neg\bigwedge_{i=1}^n p_i=\bigvee_{i=1}^{n}\neg{}p_i \]

我们在写程序的时候,左边的形式要更加容易理解一些,因此建议使用左边形式。例如 not (A and B)(not A) or (not B) 当中,前者要更易于理解。

all()和any()

实际上上图的并与且在Python当中已经有了一个语法糖就是 all()any() 的方法。他们分别表示完全的且和完全的或。使用方法就是将条件判断式放在这两个函数当中(以列表的形式):

all([True,False,True])
any([True,False,True])

标签:__,None,return,Python,self,控制流,笔记,score,True
From: https://www.cnblogs.com/han-son-xiong/p/17739200.html

相关文章

  • 20211316郭佳昊 《信息安全系统设计与实现(上)》第四周学习笔记
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • 【学习笔记】set & multiset
    PS:本文仅起一个备忘的作用。setset指的是有序的不可重集,与数学上的定义类似。常用操作:p.insert(x):在\(p\)中插入\(x\),若\(p\)中已有\(x\)则返回false,否则返回truep.erase(x):在\(p\)中删除值为\(x\)的元素,返回删除的元素个数p.erase(pos):在\(p\)中删除迭代......
  • 第四周Linux教材第七、八章学习笔记——文件操作、系统调用
    第七章7.1 文件操作级别文件操作分5个级别(从低到高):(1)硬件级别:文件操作包括:fdisk——将硬盘、U盘或SDC盘分区;             mkfs——格式化磁盘分区,为系统做好准备;             fsck——检查和维修系统;      ......
  • 考研计算机机试指南笔记
    考研计算机机试指南笔记注意:该笔记并没有数据结构和图论部分的笔记(但是机试还真就考了二叉排序树。。)所以本帖子权当抛砖引玉。考研计算机机试指南pdf自取:链接:https://pan.baidu.com/s/1wKW08rRuwjcWyVPvmLwT3A?pwd=76c8提取码:76c8常用算法排序冒泡排序日期类问题计算......
  • adoc转换html+UPF低功耗仿真例子+python转换C代码+readmemh的@使用
    adoc转换htmladoc这种格式是很多riscv文档使用的格式,该格式可以生成pdf,生成html。生成html的好处是,选中和翻译方便,复制粘贴方便。首先是gem软件要安装,这个软件似乎是ruby相关的(RubyGemsisapackagemanagerfortheRubyprogramminglanguagethatprovidesastandardform......
  • Min-Max 容斥学习笔记
    前言某次考试不会这个被打爆了,现在觉得可能有学习的必要。Min-Max容斥我们现在有一个全集\(U\),设\(\min(S)\)为集合\(S\)中的最小值,\(\max(S)\)为最大值。\[\max(S)=\sum_{T\subseteqS}(-1)^{|T|+1}\min(T)\\\min(S)=\sum_{T\subseteqS}(-1)^{|T|+1}\max(T)\\\]然......
  • 小程序笔记基础篇
    介绍结构组成结构app.jsonapp.json是当前小程序的全局配置,包括了小程序的所有页面路径、窗口外观、界面表现、底部tab等Demo项目里边的app.json配置内容如下:事件属性bingtap的语法格式在小程序中,不存在HTML中的onclick鼠标点击事件,而是通过tap事件来......
  • 学习笔记:GCN
    本文第一部分摘抄自一篇知乎上的回答如何理解GraphConvolutionalNetwork(GCN)?,第二部分是对Kipf这篇GCN论文的学习笔记。目前还没必要都那么细,就“不求甚解”,只知道咋用吧。1不止Kipf的GCNKipf在2017年发S的EMI-SUPERVISEDCLASSIFICATIONWITHGRAPHCONVOLUTIONALNETWORKS......
  • CS231N Assignment1 SVM 笔记(更新中)
    svm.ipynb为SVM实现一个完全矢量化的损失函数为其解析梯度实现完全矢量化表达式使用数值梯度检查您的实现使用验证集调整学习率和正则化使用 SGD优化损失函数可视化最终学习权重第一部分1.一些配置和库的导入#Runsomesetupcodeforthisnotebook.importrand......
  • python不能找到自己写的包怎么办
    python找不到自己写的包一般是因为路径问题导致的,我们的包在不同的目录下需要使用不同的方式导入。下面我们就来看一下遇到无法找到自己写的包的解决方法:我们可以先使用下面的方法查看当前路径:importsysprint(sys.path)然后使用下面的方法获取包所在的路径即可:fromosimp......