首页 > 编程语言 >聪明办法学Python-2023-task04&拓展01

聪明办法学Python-2023-task04&拓展01

时间:2023-11-27 17:56:30浏览次数:50  
标签:case 01 return Python else 2023 print end def

参考视频链接:【条件】 聪明办法学Python第二版_哔哩哔哩_bilibili

优雅代码编写指北_哔哩哔哩_bilibili

task04

if 语句 if statement

Conditionals Make Decisions

if 语句流程

判断成立不成立

一个例子:

def f(x):
    print("A", end="")
    if x == 0:
        print("B", end="")
        print("C", end="")
    print("D")
    
f(1)
# 不是0,跳过了if语句块
AD

一个更有意思的例子:

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

Python 内置了一个函数叫 abs() 用于绝对值计算,所以我们将函数命名成 abs1abs2……

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

写在一行

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

除非有特殊原因,否则强烈建议不要这样写

多个返回语句

def abs3(n):
    if n < 0:
        return -n
    return n

使用布尔表达式

def abs4(n):
    return (n < 0)*(-n) + (n>=0)*(n) # 这家伙长得太奇怪了
# 因为判断结果为False时在python里面等价位0,True等价于1

不要这样写!↑

if-else 语句 if-else statement

x = input("x=")
x = float(x) # 强制类型转换
print("hello")
if x < 10:
    print("wahoo!")
print("goodbye")
x=9
hello
wahoo!
goodbye

原理:

嵌套if-else

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 语句

原理:

例:

def f(x):
    print("A", end="")
    if x == 0: # 多个条件判断也可以用and和or
        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(但只有一个if对应一个else)


另一个更有意思的例子:

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

提示:一元二次方程 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 = 4*x**2 + 5*x + 1 has 2 root(s).
y = 4*x**2 + 4*x + 1 has 1 root(s).
y = 4*x**2 + 3*x + 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))

103 --> A
 88 --> B
 70 --> C
 61 --> D
 22 --> F

if-else 推导式 if-else expression

def abs7(n):  # 括号去了也行↓
    return n if (n >= 0) else -n # 推导式

# 先判断括号内的条件语句,再判断是否执行else后的语句,真:返回if前,假,返回else后语句

print("abs7(5) =", abs7(5), "and abs7(-5) =", abs7(-5))

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

上面代码本质上等价于:

def abs7(n):
   if n >= 0:
       return n
   else:
       return -n

之前作业中矩阵乘法一部分:

Matrix2 = [list(map(int, input().split(" "))) for _ in range(p)]

就类似于列表推导式

match-case 语句

3.10版本以后引入

增加了 match...case 的条件判断,不需要再使用一连串的 if-else 来判断了。

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

格式:

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _: # 可以不写
        <action_wildcard>

case _: 类似于 C 和 Java 中的 default:,当其他 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

一个 case 也可以设置多个匹配条件,条件使用 隔开,例如:

...
    case 401|403|404:
        return "Not allowed"

这里如果return改为print的话,则执行完case 400条件语句判断后会继续往下执行(如果case _语句下面还有内容的话),直到退出

清晰的代码风格 Clarity and style

请注意: 此部分讨论的内容主要针对样式而非正确性,这里的所有例子都“正确的”,但有些例子比其他例子更巧妙,我们希望大家形成一个好的代码习惯

增强代码的可读性(毕竟代码也要给别的程序员看)

否定条件(带有 else 部分)

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

yes

修改后(代码更清晰,一目了然):

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

不要用空白的 if 部分

if后面尽量跟条件判断为True的部分

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

no
# 清晰的:
b = False
if not b:
    print('no')

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')

另外一个例子

# 又混乱又有产生 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
# 更好的做法: (善用else)
x = 10
if x < 5:
    print('small')
elif x < 10:
    print('medium')
elif x < 15:
    print('large')
else:
    print('extra large')

large

再来一个例子

# 又混乱又有产生 bug 的风险:
c = 'a'
if (c >= 'A') and (c <= 'Z'):
    print('Uppercase!')
if (c >= 'a') and (c <= 'z'):
    print('lowercase!')
if (c < 'A') or ((c > 'Z') and (c < 'a')) or (c > 'z'):
    print ('not a letter!')

lowercase!
# 更好的做法:
c = 'a'
if (c >= 'A') and (c <= 'Z'):
    print('Uppercase!')
elif (c >= 'a') and (c <= 'z'):
    print('lowercase!')
else:
    print('not a letter!')

不必要使用一些 trick(如用算数逻辑来代替布尔逻辑[非常不推荐])

# 不清晰的:
x = 42
y = ((x > 0) and 99)
# 清晰的:
x = 42
if x > 0:
    y = 99

task04总结

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

拓展01

1.代码风格介绍

右边代码明显更优雅一点,可读性较强,注释主要是给别的程序员看懂这行代码的用处

2.缩进与换行

定界符就是()[]这种

如果到下一行得和参数进行对齐

例:

不优雅的代码:

优化过的代码:

参数要与定界符平齐,参数得与函数内语句有缩进区分(一般为一个Tab键)

代码布局-换行

最好还是加上反斜杠\来衔接代码

例:

尽量去省略每个语句之间的分号

运算符尽量放参数前面(便于修改和读取)

如上方第二个图

3.导入规范

导入下一级目录的模块文件需声明目录名(用import)

4.关于空格

加入空格建议规范:

5.代码注释

6.命名规则

遵守,下面的规范尽量执行

不遵守即会报错

7.命名规范

标签:case,01,return,Python,else,2023,print,end,def
From: https://www.cnblogs.com/Lyanv/p/17859913.html

相关文章

  • 随手写了个博客多平台发布脚本:Python自动发布文章到Wordpress
    引言作为一名技术博主,提高博客发布效率是我们始终追求的目标。在这篇文章中,我将分享一个基于Python的脚本,能够实现博客多平台发布,具体来说,是自动发布文章到WordPress。通过这个简单而高效的脚本,我们能够省去繁琐的手动发布步骤,提升工作效率。技术栈在编写这个自动发布脚本的过......
  • Python之深浅拷贝
    浅copy:   1.是把列表本身独立,里面的元素是被两个列表共享的   2.当其中一个列表中的元素被改变时,另一个列表中的元素不会随之变化。   3.当列表里面还有列表时,修改内部列表的内容时,另一个列表中的内部列表也会随之变化a1=["a","b","c","aa"]b1=a1a1[0]="1"prin......
  • 【2023-11-26】要习惯好
    20:00生活如旭日东升,黎明曙光已现。你相信吗,我开始热爱生活,因为生活中充满了该做的事,问题接着问题,梦想连着梦想。                                                 ——......
  • 2019年-fibonacci数列与黄金分割
    目录题目法一、递归法二、迭代题目法一、递归deffib(n):ifn==1orn==2:return1returnfib(n-1)+fib(n-2)n=int(input())a=fib(n)b=fib(n+1)print("{:.8f}".format(a/b))只通过了60%的测试法二、迭代#动态规划#deffib(n):#dp=[0]*(n+1)#......
  • 【2023-11-25】连岳摘抄
    23:59不为明天忧虑。早上醒来,充分地好好活这一天,最近我只留心这件事。以前老爱仰赖明天、敷衍当下,现在也不会了。只是一天一天,非常珍惜地过日子。                                        ......
  • 聪明办法学python chap4 条件 5循环
    Python(四)条件if-elif-elsex=5ifx<0:print("x小于0")elifx==0:print("x等于0")else:print("x大于0")match-casedefcheck_value(value):matchvalue:case1:print("Valueis1&......
  • Python知识补充pip 安装包的工具
    Python知识补充pip安装包的工具(1)安装第三方模块pipinstall模块名pipinsyall模块名==#查看我当前模块都有哪些版本pipinsyall模块名==版本号#安装指定版本的模块(2)卸载模块pipuninstall模块名(3)临时换源pipuninstall模块名清华大学: https://pypi.tuna.......
  • Linux01
    第一章:云计算是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来虚拟化资源,将计算机资源通过网络进行虚拟化,或者用虚拟化资源进行计算。云计算是一种按使用量付费的模式,它随时随地提供便捷的、可通过网络按需访问的可配置计算资源共享池(资源包括网络、......
  • 猜数字游戏--python可把过程记录入文档
    defcaishuzi_game(x,y):importrandomx=int(random.randint(x,y))a=0try:b=int(input("请输入你要猜的数字"))except:print("输入类型错误,请重新输入整数型类型数字")b=int(input("请输入你要猜的数字"))whilea<5......
  • Linux 01
    第一章:初识Linux本章的学习目标:1.了解云计算的概念2.了解虚拟机的安装3.熟悉Linux操作系统一、云计算简介1.1什么是云计算云计算是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来虚拟化资源。“云”通常为互联网的一种比喻说法,而“计算”一词有两层含义,......