IF语句及代码风格

Chap 4 条件

IF 语句

IF语句的流程

image-20231127121037497

eg:

def f(x) :
	print("A",end="")
	if x == 0 :
		print("B",end="")
		print("C",end="")
		#x不等于0时,这两行代码不会执行
	print("D")
f(1)

AD

f(0)

ABCD

实现一个函数,返回输入数字的绝对值

python内置了一个函数交abs()用于绝对值计算,所以我们将我们的函数命名为abs1、abs2

def abs1(n) :
	if n < 0 ;
		n = -n
	return n

如果只有一条语句我们也可以把这些内容写在一行里:

def abs2 :
	if n < 0 : n = -n
	return n

不建议!!!

多个返回语句

def abs3(n) :
	if n < 0 :
		return -n
	return n #如果n>0,直接执行此代码

使用布尔表达式

def abs4(n) :
	return (n < 0)*(-n) + (n>=0)8(n)

实现机制 :False == 0; True == 1

不建议!!!

if-else 语句

image-20231127171431049

x = input("x=")
x = float(x)
print("hello")
if x < 10 :
	print("wahool!")
else :
	print("ruh roh")
print("goodbye")

x = 9

hello

wahoo!

goodbye

def f(x) :
	print("A",end="")
	if x == 0 :
		print("B",end="")
		print("C",end="")
	else :
		print("D",end="")
		if x==1 : #嵌套
			print("E",end="")
		else :
			print("F",end="")
	print("G")

重新设计刚才的abs()

def abs5(n) :
	if n >= 0 :
		return n
	else :
		return -n
def abs6(n) :
	if n >= 0 :
		sign = +1
	else :
		sign = -1
	return sign * n
print("abs5(5) =", abs5(5), "and abs5(-5) =", abs5(-5))
print("abs6(5) =", abs6(5), "and abs6(-5) =", abs6(-5))

abs5(5) = 5 and abs5(-5) = 5

abs6(5) = 5 and abs6(-5) = 5

if-elif-else 语句

image-20231127172302351

def f(x):
    print("A", end="")
    if x == 0:
        print("B", end="")
        print("C", end="")
    elif x == 1:
        print("D", end="")
    else:
        print("E", end="")
        if x == 2:
            print("F", end="")
        else:
            print("G", end="")
    print("H")

可以有和多个elif,但是只能有一个ifelse

另一个更有意思的例子:

任务:实现一个函数,输入一元二次函数的各项系数,返回其解的个数。

提示:一元二次方程 ax²+bx+c=0 (a≠0)的根与根的判别式 有如下关系:Δ=b²−4ac

  • 当Δ>0时,方程有两个不相等的实数根;

  • 当Δ=0时,方程有两个相等的实数根;

  • 当Δ<0时,方程无实数根。

def numberOfRoots(a, b, c):
    # 返回 y 的实数根(零点)数量: y = a*x**2 + b*x + c
    d = b**2 - 4*a*c
    if d > 0:
        return 2
    elif d == 0:
        return 1
    else:
        return 0

print("y = 4*x**2 + 5*x + 1 has", numberOfRoots(4,5,1), "root(s).")
print("y = 4*x**2 + 4*x + 1 has", numberOfRoots(4,4,1), "root(s).")
print("y = 4*x**2 + 3*x + 1 has", numberOfRoots(4,3,1), "root(s).")

y = 4x**2 + 5x + 1 has 2 root(s).

y = 4x**2 + 4x + 1 has 1 root(s).

y = 4x**2 + 3x + 1 has 0 root(s).

学生分数登记管理系统

def getGrade(score):
    if score >= 90:
        grade = "A"
    elif score >= 80:
        grade = "B"
    elif score >= 70:
        grade = "C"
    elif score >= 60:
        grade = "D"
    else:
        grade = "F"
    return grade

print("103 -->", getGrade(103))
print(" 88 -->", getGrade(88))
print(" 70 -->", getGrade(70))
print(" 61 -->", getGrade(61))
print(" 22 -->", getGrade(22))

if-else 推导式 if-else expression

推导式本质是python语法糖。语法糖就是让代码更具有简洁性、可读性、易用性。

def abs7(n):
    return n if (n >= 0) else -n
'''
等价于:
def abs7(n):
		if n >=0:
				return n
		else:
return -n
'''
print("abs7(5) =", abs7(5), "and abs7(-5) =", abs7(-5))

abs7(5) = 5 and abs7(-5) = 5

如果推导式很简洁可以使用。千万不要使用非常复杂的推导式,不然三个月后只有上帝才能看懂啦!

match-case 语句

match 后的对象会依次与 case 后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_ 可以匹配一切。

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the internet"

mystatus=400
print(http_error(400))

Bad request

清晰的代码风格

谨慎使用否定条件 not

# 可能不清晰的:
b = True
if not b:
    print('no')
else:
    print('yes')

Yes

# 清晰的:
b = True
if b:
    print('yes')
else:
    print('no')

Yes

宁愿不要else,也不要if 空白

# 不清晰的:
b = False
if b:
    pass
else:
    print('no')

no

# 清晰的:
b = False
if not b:
    print('no')
# 这时使用not比较好

no

用and 来判断,代替嵌套的 if

# 混乱的:
b1 = True
b2 = True
if b1:
    if b2:
        print('both!')

both!

 清晰的:
b1 = True
b2 = True
if b1 and b2:
    print('both!')

both!

使用 else 而非 if 来控制

# 可能会引入 bug:
b = True
if b:
    print('yes')
if not b:
    print('no')

yes

# 更好的做法:
b = True
if b:
    print('yes')
else:
    print('no')

yes

善用 elif

# 又混乱又有产生 bug 的风险:
x = 10
if x < 5:
    print('small')
if (x >= 5) and (x < 10):
    print('medium')
if (x >= 10) and (x < 15):
    print('large')
if x >= 15:
    print('extra large')

large

# 更好的做法:
x = 10
if x < 5:
    print('small')
elif x < 10:
    print('medium')
elif x < 15:
    print('large')
else:
    print('extra large')

large

在Python语法中,下面两段代码是等价的。

但由于下面一段有很多缩进,管理起来很麻烦,所以我们通常选择上面这样的写法,避免缩进带来的麻烦。

if a:
		pass
elif b:
		pass
else:
		pass
if a:
		pass
else:
		if b:
				pass
		else:
				pass

不要使用一些离谱的trick(如用算数逻辑来代替布尔逻辑)

# 不清晰的:
x = 42
y = ((x > 0) and 99)
# 这里99会被当成布尔值进行运算
# python中任何大于0的数都是True
# 清晰的:
x = 42
if x > 0:
    y = 99

上面的trick是啥玩意儿?(Python的一个特性)

x = 42
x > 0 and 99
# x > 0在pyhton中实际上是1
# 当加上and 99时,会输出99

99

x = 42
x > 0 or 99
# 如果是or 99,会输出布尔值True

True

x = 42
x < 0 or 99
# 如果改成x < 0, 又会输出99

99

总结

  • Conditionals Make Decisions.
  • if-else 结构构成了 Python 分支控制,if 还能嵌套使用。
  • 合理的编写风格会让代码更易读,还能尽可能避免引入 bug。

优雅代码的编写

代码风格

  • "修饰"的前提一定是"跑通"代码,也就是说你得先确保你的code没有任何的bug
  • 这种"修饰"并不是对每一个人都强制学习内容,他并不影响你快乐学习接下来的所有课程

image-20231128125907489

缩进

  1. 如果有开始定界符,其余行的缩进需与开始定界符对齐
  2. 需要额外的4个空格(长度等于一个Tab键),以区分开传入参数,和其他内容
  3. 空格一般用于添加以上这种缩进,Tab键一般用于保持行与行之间的一致性
  4. 多行if语句衔接,需要一个额外的缩进,以区分其他内容

换行

  1. 将所有限制为最多79个字符
  2. 一般语句接受”隐式“延续,但是with语句等不支持,需要用反斜杠\来衔接
  3. 另一个这样的例子是assert语句
  4. 多行if语句的缩进详见上节
  5. 通常不鼓励使用复合语句(同一行上的多个语句)

导入规范

  • import 本地模块\包

image-20231128131333005

  1. 当我们需要导入本地自己封装好的一些模块时,需要通过import来导入
  2. 如果我们需要在m1.py文件中导入同目录下的m2.py文件,直接导入即可

关于空格

  1. 紧接在圆括号、方括号或大括号内,不需要多余空格
  2. 在逗号、分号或冒号之前,尾随逗号之后均不需要多余空格
  3. 在切片中,两个冒号必须应用相同的间距
  4. 紧接在开始函数调用的参数列表的左括号之前,不需要多余空格
  5. 赋值(或其他)运算符周围需要多个空格以使其与另一个运算符对齐

代码注释(单行注释、多行注释)

  • 注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码
  • 注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性
  • 在有处理逻辑的代码中,源程序有效注释必须在20%以上

命名规则

  • 变量名只能包含字母、数字和下划线。变量名可以字母或下划线大头,但不能以数字打头,例如:可将变量命名为message_1,但不能将其命名为1_message
  • 变量名不能包含空格,但可使用下划线来分隔其中的单词。例如:变量名greeting_message可行,但变量名greetingmessage会引发错误

命名规范

  • 不要将python关键字和函数名用作变量名,即不要使用python保留用于特殊用途的单词,如print。
  • 变量名与函数名应既简短又具有描述性。例如:name比n好

image-20231128133012618

代码规范的网站:PEP8

posted @ 2023-11-28 21:13  Rahull  阅读(26)  评论(0编辑  收藏  举报