0
点赞
收藏
分享

微信扫一扫

30天Python入门到进阶——第5天:流程控制

30天Python入门到进阶——第5天:流程控制_python

已经进行了四天的Python学习体验。到目前为止,已经能够涵盖 Python 的一些基本语法以及数据类型,以及如何使用内置函数和方法以及一些最佳实践对它们执行操作。这可能是 Python 的枯燥部分。今天短期目标是理解逻辑和条件编程,以及在 Python 中使用循环重复任务。这可是很有意思的!


流程控制

流程控制指的是代码运行逻辑、分支走向、循环控制,是真正体现我们程序执行顺序的操作。流程控制一般分为顺序执行、条件判断和循环控制。这里面体现了一种传统编程中的“因果关系”,也就是有什么样的因就产生什么样的果,有什么输入就会有相应的输出,同一个输入不管执行多少次必然得到同样的输出,所有的都是确定的、可控的。与之相对的则是最近火得一塌糊涂的人工智能,比如机器学习、神经网络和深度学习,这些不再是“因果关系”编程,而是“统计关系”编程,同一个输入每次的执行结果有可能不一样。


流程图

再简要介绍一下流程图。程序流程图和伪代码在本质上其实是一样的,只不过一个用文字表达一个用图片表达,图片画着费点事,但看着直观,文字书写方便,但不够直观。

在程序流程图绘制过程中,主要使用下图中的图标:

30天Python入门到进阶——第5天:流程控制_python教程_02

通过带方向的箭头和相应的说明文字,连接各图标,形成了流程图,例子如下:

30天Python入门到进阶——第5天:流程控制_流程控制_03

顺序执行

虽然我们有各种流程判断、循环、跳转、控制、中断等等,但从根本上程序还是逐行顺序执行的。

Python代码在执行过程中,遵循下面的基本原则:

  • 普通语句,直接执行;
  • 碰到函数,将函数体载入内存,并不直接执行
  • 碰到类,执行类内部的普通语句,但是类的方法只载入,不执行
  • 碰到if、for等控制语句,按相应控制流程执行
  • 碰到@,break,continue等,按规定语法执行
  • 碰到函数、方法调用等,转而执行函数内部代码,执行完毕继续执行原有顺序代码


if __name__ == '__main__':

很多时候,我们经常在python程序中看到这么一行语句,这里简要解释一下:

首先,​​__name__​​​是所有模块都会有的一个内置属性,一个模块的​​__name__​​​值取决于你如何调用模块。假如你有一个​​test.py​​​文件,如果在​​a.py​​​文件中使用import导入这个模块​​import test.py​​​,那么​​test.py​​​模块的​​__name__​​​属性的值就是​​test​​​,不带路径或者文件扩展名。但是很多时候,模块或者说脚本会像一个标准的程序样直接运行,也就是类似​​python test.py​​​这种方式,在这种情况下, ​​__name__​​​ 的值将是一个特别缺省值​​"__main__"​​。

根据上面的特性,可以用​​if __name__ == '__main__'​​来判断是否是在直接运行该py文件!如果是,那么if代码块下的语句就会被执行,如果不是,就不执行。该方法常用于对模块进行测试和调试,区分直接运行和被导入两种情况的不同执行方式!

我们通过下面的例子,脚本名为test.py,执行​​python test.py​​看看实际的顺序执行方式:

import os          # 1

print('<[1]> time module start') # 2


class ClassOne():
print('<[2]> ClassOne body') # 3

def __init__(self): # 10
print('<[3]> ClassOne.__init__')

def __del__(self):
print('<[4]> ClassOne.__del__') # 101

def method_x(self): # 12
print('<[5]> ClassOne.method_x')

class ClassTwo(object):
print('<[6]> ClassTwo body') # 4


class ClassThree():
print('<[7]> ClassThree body') # 5

def method_y(self): # 16
print('<[8]> ClassThree.method_y')


class ClassFour(ClassThree):
print('<[9]> ClassFour body') # 6


def func():
print("<func> function func")

if __name__ == '__main__': # 7
print('<[11]> ClassOne tests', 30 * '.') # 8
one = ClassOne() # 9
one.method_x() # 11
print('<[12]> ClassThree tests', 30 * '.') # 13
three = ClassThree() # 14
three.method_y() # 15
print('<[13]> ClassFour tests', 30 * '.') # 17
four = ClassFour()
four.method_y()

print('<[14]> eval(231, 243, 237); padding: 0px 3px; border-radius: 4px; overflow-wrap: break-word; text-indent: 0px;">​if __name__ == '__main__':​​,判断为True,于是执行if内部的代码
  • 执行#8的print语句
  • 执行#9,实例化一个ClassOne的对象
  • 执行#10的初始化方法,打印一条语句
  • 返回执行#11的menthod_x调用
  • 返回类的定义体,找到#12,执行方法,打印语句
  • 再返回#13处,打印
  • 执行#14的实例化
  • ClassThree没有自定义初始化方法,接着执行#15
  • 回到类里找到#16的方法,执行打印语句
  • 执行#17
  • ......后面不再详述
  • 执行完最后的#100的打印语句后,按理说程序应该终止退出了,但由于ClassOne这个类定义了​​__del__​​方法,还要在最后执行它内部的代码#101这条打印语句。
  • 通过这个例子,相信你对Python的程序执行流程能够有一定的了解。其实这个过程,也是我们读别人代码的过程。


    条件判断

    条件判断是通过一条或多条判断语句的执行结果(True或者False)来决定执行的代码块。

    在Python语法中,使用if、elif和else三个关键字来进行条件判断。

    30天Python入门到进阶——第5天:流程控制_流程控制_04

    age = input('Please enter your age')
    if(int(age) >= 18):
    print('You are allowed to enter the club')
    else:
    print('Sorry! you are not allowed!')

    上面是Python中if-else条件语句的示例。它用于根据某些条件执行逻辑。如果未满足条件,则执行else块中的代码。来自JavaScript领域,我注意到的区别是if-else块周围没有花括号,而是在条件语句后使用​​:​​。条件语句中的块也缩进

    exam_score = input('Enter your exam score')
    if(int(exam_score) > 90):
    print('You have got grade A+')
    elif(int(exam_score) > 80):
    print('You have got grade A')
    else:
    print('You have got grade B')

    如果需要执行多个条件,则使用​​elif​​块。在包括JavaScript在内的许多其他编程语言中,它被称为​​else if​​块。可以有任意数量的​​else if​​块来检查不同的条件。Python使其更加紧凑。

    is_adult = True
    is_licensed = True

    if(is_adult and is_licensed): ## In JavaScript && is used instead of 'and'
    print('You are allowed to drive')
    else:
    print('You are not allowed to drive')

    上面的代码检查单个表达式中的两个条件以执行块。​​and​​关键字用于检查两个条件的计算结果是否都为​​True​​,然后仅执行块。这个语法很容易理解!Python无疑更具可读性。

    条件判断的使用原则:

    • 每个条件后面要使用冒号(:)作为判断行的结尾,表示接下来是满足条件(结果为True)后要执行的语句块。
    • 除了if分支必须有,elif和else分支都可以根据情况省略。
    • 使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。
    • 顺序判断每一个分支,任何一个分支首先被命中并执行,则其后面的所有分支被忽略,直接跳过!
    • 在Python中没有switch – case语句


    缩进

    缩进是使用空格/制表符分隔代码行的方法,以便解释器可以区分代码块并相应地执行代码。与JavaScript不同,Python不使用任何大括号,而是使用缩进来大块代码。代码编辑器通过自动缩进使我们的生活变得轻松(比如Pycharm或者VS)。

    if(10 > 8):
    print('Such a silly logic. I will get printed')
    else:
    print('I will never get printed')
    print('I am not get printed coz I am indented')

    # Now without indentation
    if(10 > 8):
    print('Such a silly logic. I will get printed')
    else:
    print('I will never get printed')
    print('I will be printed anyways coz I am not indented')
    # The above line gets printed always as interpreter treats it as a new line


    真假

    • 计算为 true 的值称为
    • 计算为 false 的值称为

    检查条件时,使用类型转换将条件内的表达式计算为布尔值。现在所有值都被认为是“真实的”,除了以下是“虚假的”:

    • ​None​
    • ​False​
    • ​0​
    • ​0.0​
    • ​0j​
    • ​Decimal(0)​
    • ​Fraction(0, 1)​
    • ​[]​​- 一个空的​​list​
    • ​{}​​- 一个空的​​dict​
    • ​()​​- 一个空的​​tuple​
    • ​''​​- 一个空的​​str​
    • ​b''​​- 一个空的​​bytes​
    • ​set()​​- 一个空的​​set​
    • 一个空的​​range​​,像​​range(0)​
    • 对象
    • ​obj.__bool__()​​返回​​False​
    • ​obj.__len__()​​返回​​0​

    username = 'santa' # bool('santa') => True
    password = 'superSecretPassword' # bool('superSecretPassword') => True
    if username and password:
    print('Details found')
    else:
    print('Not found')


    短路

    在单个语句中检查多个逻辑条件时,解释器足够聪明,可以在第一个条件失败时忽略其余的条件检查。这被称为短路。可以用一个例子更好地解释:

    knows_javascript = True
    knows_python = True

    if(knows_javascript or knows_python): # doesn't depend on value of knows_python
    print('Javscript or python developer')
    else:
    print('Some other developer')

    knows_javascript = False
    knows_python = True

    if(knows_javascript and knows_python): # doesn't depend on value of knows_python
    print('Javscript or python developer')
    else:
    print('Some other developer')

    ​or​​​是python中的一个条件运算符。


    运算符

    Python语言支持以下类型的运算符:

    • 算术运算符
    • 比较(关系)运算符
    • 赋值运算符
    • 逻辑运算符
    • 位运算符
    • 成员运算符
    • 身份运算符
    • 三目运算符


    算术运算符

    以下假设变量: a=10,b=20:

    30天Python入门到进阶——第5天:流程控制_python教程_05

    比较运算符

    以下假设变量a为10,变量b为20:

    30天Python入门到进阶——第5天:流程控制_python教程_06

    赋值运算符

    以下假设变量a为10,变量b为20:

    注意对于 ​​a /= b​​ 之类的操作,等同于​​a = a / b​​, 而不是 ​​a = b / a​​,方向一定不要搞反了。

    30天Python入门到进阶——第5天:流程控制_流程控制_07

    位运算符

    按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下: 下表中变量 a 为 60,b 为 13:

    a = 0011 1100

    b = 0000 1101

    -----------------

    a&b = 0000 1100

    a|b = 0011 1101

    a^b = 0011 0001

    ~a = 1100 0011

    30天Python入门到进阶——第5天:流程控制_流程控制_08

    逻辑运算符

    Python语言支持逻辑运算符,但是没有其它语言中的​​&&​​​和​​||​​​语法,取而代之的是更加人性化的英文单词​​and or not​​(全部都是小写字母)。除了 ​​and​​​和​​or​​​之外,Python 中几乎没有逻辑运算符,例如​​not​​​, ​​>​​​, ​​<​​​, ​​==​​​, ​​>=​​​, ​​<=​​​,​​!=​​。

    以下假设变量 a 为 10, b为 20:

    30天Python入门到进阶——第5天:流程控制_python_09

    print(10 > 100) # False
    print(10 < 100) # True
    print(10 == 10) # True
    print(10 != 50) # True
    print(2 > 1 and 2 > 0) # True
    print(not(True)) # False
    print(not False) # True

    一些奇怪的操作

    print(True == True) #True
    print('' == 1) # False
    print([] == 1) # False
    print(10 == 10.0) # True
    print([] == []) # True

    ​==​​检查双方的值。如果它们不相同,它会转换类型。

    Python 有一个严格的检查运算符​​is​​​,它检查值及其内存位置。它几乎类似于​JavaScript 中的​​===​​运算符。

    print(True is True) # True
    print('' is 1) # False
    print([] is 1) # False
    print(10 is 10.0) # False
    print([] is []) # False

    成员运算符

    ​in 与 not in​​是Python独有的运算符(全部都是小写字母),用于判断对象是否某个集合的元素之一,非常好用,并且运行速度很快。返回的结果是布尔值类型的True或者False。

    30天Python入门到进阶——第5天:流程控制_python_10

    身份运算符

    这也是Python的特色语法(全部都是小写字母)。

    30天Python入门到进阶——第5天:流程控制_python_11

    三元运算符

    在研究Python中三元运算符的语法时,起初我觉得有点混乱,但后来发现与我在JavaScript世界中熟悉的运算符相比,它很容易阅读。

    is_single = True
    message = 'You can date' if is_single else 'you cannot date'
    # result = (value 1) if (condition is truthy) else (value 2)
    print(message) # You can date

    三元运算符有时也称为条件表达式。这是在单个语句中检查条件的一种非常方便的方法。我将它与JavaScript 的​​?​​运算符语法进行了比较,以便于更好的理解。


    运算符优先级

    下表列出了从最高到最低优先级的所有运算符。优先级高的运算符优先计算或处理,同级别的按从左往右的顺序计算(赋值运算符除外,它是按从右往左的顺序)

    30天Python入门到进阶——第5天:流程控制_python_12

    总结

    这就是今天的全部内容。覆盖了流程控制中的顺序结构和条件判断模块,明天我们将学习循环模块,可能还会加入一点函数的基础知识。又度过了美好的一天,朝着学习 Python 的目标又迈出了一小步。希望你喜欢这个系列并从中获得一些价值。如果对你有点点帮助,可以点个关注和收藏,感谢你的支持,谢谢!


    举报

    相关推荐

    0 条评论