Python3入门到精通——流程控制语句

作者: Daniel Meng

GitHub: LibertyDream

博客:明月轩

本系列教程采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议

表达式

表达式(Expression)是运算符(operator)和操作数(operand)所构成的序列。是编程语言中最基本的概念之一

简单地说python中的表达式就是一行行的语句

In [1]:
1+11
Out[1]:
12
In [2]:
a = [1,2,3]
In [5]:
a = 1
b = 2
c = a and b or 0 
c = int('1') + 2 # 这些都是表达式

例子中的一行行输入都被叫做表达式。说到表达式就不能不提表达式间的优先级问题。Python不同类别运算符优先级如下图所示。

运算符优先级

注意:

  • ()的优先级最高,可以使用()来验证和修改执行顺序
  • 同等级运算符中也存在优先级问题。如逻辑运算符中not>and>or
  • 同级情况下执行顺序是从左往右顺序执行,也就是左结合。但当出现赋值=操作时会变成右结合,也就是不论是否=是当前第一优先级,都要先将=右边部分计算完成
In [6]:
a or b and c
Out[6]:
1
In [7]:
not a or b + 2 == c 
Out[7]:
False
In [9]:
(not a) or ((b + 2) == c)
Out[9]:
False
In [10]:
b = a is c

流程控制语句

  • 条件控制语句——选择性问题
  • 循环控制语句——一种解决问题的基本思想

条件控制语句

if else语句。python中的使用方式为

if 逻辑判断 :
    deal with things
    ...
else :
    deal with other things
    ...

python规范碎碎念:

  • python默认每一行是一条语句,区别于c、java等必须以;结尾的方式,python中语句结尾处的;是可选的
  • python不依赖{}来识别代码块,而是依赖缩进对齐来标识代码块,也因此python代码不能被压缩和混淆。缩进要求是4空格为基准,使用时注意ide等工具中对tab键的步进量的设置

条件判断最常应用的场景莫过于检测用户登录时的条件判断了,下面简单模拟一下。input()是一个函数可以获得用户在控制台上的输入,函数在后面单独说

In [11]:
account = 'Daniel Meng'
password = '123456'

print('please input account')

user_account = input()

print('please input password')

user_password = input()

if account == user_account and password == user_password:
    print('success')
else:
    print('fail')
please input account
meng
please input password
123
fail

python规范碎碎念:

  • python区分大小写,var和VAR不同
  • python没有常量机制,所有希望表示常量的变量应当全部用大写表示,如ACCOUNT
  • python中变量的命名如果是组合词的话通过_连接,区别于驼峰命名法等
  • python项目通常有很多个.py文件组成,一个python文件称之为一个模块,每一个模块顶部都应有一个由``` ```包裹的部分,用于解释当前模块的意义和作用
  • python中标识符前不要留空格
  • 每个python文件都应留一个空行
  • 变量应置于函数或类中,直接暴露在模块中的变量一般理解为常量
  • 为了提高可阅读性,多元运算符如=等左右应当各留空一格
In [ ]:
'''
    if-else条件语句的使用和规范
'''
ACCOUNT = 'Daniel Meng'
PASSWORD = '123456'

print('please input account')
USER_ACCOUNT = input()

print('please input password')
USER_PASSWORD = input()

if ACCOUNT == USER_ACCOUNT and PASSWORD == USER_PASSWORD :
    print('success')
else :
    print('fail')

控制语句可以独立使用,也可以嵌套

if condition:
    if expression:
        pass
else:
    if condition:
        pass
    else:
        pass

if expression:
    pass

if expression:
    pass

这里讲一下由缩进带来的代码块的概念。对于同样缩进水平的代码属于同一代码块,处于同一级别

if expression:
    code1
        code11
        code11
            code22
            code22
                code33
                code33
    code2
    code3
else:
    code1
    code2
    code3

当遇到多条件判断时,可以使用elif语法,这是else if的简写。elseelif都不能单独出现

In [14]:
a = input('请输入a的值:')
a = int(a)

if a == 1:
    print('apple')
elif a == 2:
    print('orange')
elif a == 3:
    print('banana')
else:
    print('shopping')
请输入a的值:3
banana

注意,因为python是弱类型语言,所以input()函数统一都按字符串类型捕获,之后需要自行将数据转换成自身希望的类型

python中没有c,java中的switch case语法。python中可以使用上文所述的if... elif... elif... else形式来代替。进一步的官方建议也可以使用字典的形式来实现switch语句的作用

def function_1(...):
    ...

functions = {'a': function_1,
             'b': function_2,
             'c': self.method_1, ...}

func = functions[value]
func()

循环控制语句

包括whilefor两类循环。先说while循环

while condition:
    #循环体
    do your things
    ...
orther statements

循环语句很容易发生死循环的错误。在循环体中一定要有能影响循环条件的语句

In [15]:
counter = 0

while counter <= 10:
    # 代码块
    counter += 1
    print('I am While ' + str(counter))
I am While 1
I am While 2
I am While 3
I am While 4
I am While 5
I am While 6
I am While 7
I am While 8
I am While 9
I am While 10
I am While 11

python中无论是while还是for,都可以搭配else,表示循环条件结束后进行的操作

while condition:
    do your things
    ...
else:
    pass

pass指代的是空操作

while循环多用于递归,for循环多用于遍历序列、集合或字典。也可以说while多用于循环次数不定,for用于循环次数确定的场合。

for target_list in expression_list:
    do your things
    ...

上面给出了for循环格式。其也可以搭配else操作

for target_list in expression_list:
    pass
else:
    pass

循环控制语句可以嵌套使用

In [16]:
a = [['apple','orange','banana','grape'],(1,2,3)]

for x in a:
    for y in x:
        print(y,end=' ')
else:
    print('fruit is gone')
apple orange banana grape 1 2 3 fruit is gone

else部分会在遍历完,或者说for循环完成后执行。

print()方法中可以使用第二个参数end,来控制结果输出格式,默认end = '\n'

在循环中,有时要对某些情况特殊处理,比如说临界/错误时退出,忽略某些值等。这时就会使用到breakcontinue操作了

break会终止最内层循环,如果被终止层循环配有else部分,else部分也会被略过continue则是跳过当前第n次循环,直接进行第n+1次循环

In [17]:
a = [['apple','orange','banana','grape'],(1,2,3)]

for x in a:
    for y in x:
        if y == 'banana':
            break
        elif y == 2:
            continue
        print(y)
    else:
        print('Done')
apple
orange
1
3
Done

注意例子中,因为break,所以没有输出banana、grape和else部分。因为continue,程序跳过了2,其余部分正常输出

如果有c、java等其他语言背景可能会产生疑问,上面的for更像是for each。如果是下面这种指定循环次数的经典for,python该怎么表示呢?

for(int i = 0; i < n; i++){
    do something
}

对此,python使用了range(start,end[,step])函数,它可以接受三个参数,表示以步长step为单位获取一个[start,end)范围内的序列,步长可选,默认为1

In [19]:
for x in range(0,10):
    print(x, end = ' | ')
print()
for x in range(0,10,2):
    print(x, end = ' | ')
print()
for x in range(10,0,-2):
    print(x, end = ' | ')
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
0 | 2 | 4 | 6 | 8 | 
10 | 8 | 6 | 4 | 2 |