python 最基础语句解析

表达式语句

语句分为简单语句和复合语句,简单语句由一个单独的逻辑行构成。多条简单语句可以存在于同一行内并以分号分隔。表达式语句属于简单语句。

表达式语句用于计算和写入值(大多是在交互模式下),或者调用一个过程 (过程就是不返回有意义结果的函数。在 Python 中,过程的返回值为 None)。

表达式语句会对指定的表达式进行求值。

在交互模式下,它会通过内置的 repr() 函数转换为一个字符串,该结果字符串将以单独一行的形式写入标准输出(例外情况是如果结果为 None,则该过程调用不产生任何输出)。

以下均是一个表达式语句(可包含多个表达式):

'python'
'python'
1
1
(a := 1) # 3.8 新功能,赋值表达式
1
a
1
'a\n',f'b{1}' # 两个表达式
('a\n', 'b1')
1 + 2 * 3 / 5, True and False # 两个表达式
(2.2, False)
lambda x: x**2
<function __main__.<lambda>(x)>
0 if 2>3 else (1 if 5<6 else 2)
1
[1,2,3] + [4]
[1, 2, 3, 4]
[].append(1) # 返回 None
[].append(1) is None
True
# 返回值为 None,输出并不是表达式的值
print('非表达式的值')  is None
非表达式的值





True
sum(i for i in [3,2,5])
10
list(zip('abc',[1,2,3]))[1:]
[('b', 2), ('c', 3)]

用分号分隔多个表达式语句,输出最后一个的值。

1; print('非表达式的值'); 1 + 2 * 3 / 5, True and False
非表达式的值





(2.2, False)

赋值语句

赋值语句用于将名称绑定或重新绑定到特定值,以及修改属性或可变对象的成员项。

赋值语句使用赋值操作符和增强赋值操作符。详见 操作符概述

# 将值 1 绑定到变量 a
a = 1
print('a =', a)
# 变量 a 重新绑定值 'a'
a = 'a'
print('a =', a)
a = 1
a = a

同时进行多个值多个名称绑定,值和名称数量要相等:

# 一个名称时,右边为元组
a = 1,2,3,4
a
(1, 2, 3, 4)
# 多个名称
a,b,c,d = 1,[2,3],4,5
f'a={a},b={b},c={c},d={d}'
'a=1,b=[2, 3],c=4,d=5'
# 可迭代对象拆包,则需要更多名称
a,b,c,d,e = 1,*[2,3],4,5
f'a={a},b={b},c={c},d={d},e={e}'
'a=1,b=2,c=3,d=4,e=5'

赋值一般左右两边一一对应 “同时” 赋值,但赋值给变量的多项集时可能不一样(例如列表的某一项):

x = [0,1]
i = 0
i, x[i] = 1, 2 
f'x={x},i={i}'
'x=[0, 2],i=1'

修改属性或可变对象的成员项:

# 新增属性
class A:
    x = 1
a = A()

# 右边的 a.x 是访问类属性
# 左边的 a.x 是新增实例属性, 值为类属性值 + 1
a.x = a.x + 1 
a.x, A.x
(2, 1)
# 修改列表项
a = [1,2,3]
a[0] = [0,1]
a
[[0, 1], 2, 3]
# 修改或新增字典项
d = {
    
    'a':1}
d['a'] = 10
d['b'] = 2
d
{'a': 10, 'b': 2}

赋值操作符 =,可以进行连续赋值,绑定多个名称,但赋值语句非表达式语句,不能被求值,因此不能被括号包围或分隔:

a = b = c = 1
a,b,c
(1, 1, 1)
a = (b = c = 1)
  File "<ipython-input-40-5dae496e91ce>", line 1
    a = (b = c = 1)
           ^
SyntaxError: invalid syntax

不可变容器的增强赋值操作,是重新绑定对象;可变容器的增强赋值操作是增、删、改成员项:

s = '123'
print(id(s),s)
# 因为不可变,相当于新建了一个字符串 '1234' 重新绑定 s
s += '4' 
print(id(s),s)
2371959191728 123
2371959179632 1234
l = [1,2,3]
print(id(l),l)
# 可变,相当于在原列表 l 中增加元素 4
l += [4]
print(id(l),l)
2371958877312 [1, 2, 3]
2371958877312 [1, 2, 3, 4]
l = [1,2,3]
print(id(l),l)
l *= 0 # 清空列表
print(id(l),l)
2371958290048 [1, 2, 3]
2371958290048 []
s = {
    
    1,2,3}
print(id(s),s)
s |= {
    
    0}
print(id(s),s)
2371958464800 {1, 2, 3}
2371958464800 {0, 1, 2, 3}

带标注的赋值语句。单个语句中将变量或属性标注和可选的赋值语句合为一体。标注对提高代码的可读性非常有用,看标注而不需要看代码上下文就大概知道代码的使用。

# 标注函数参数的类型及默认值
def f(n:int=1):
    print('Hi'*n)
f(2)
HiHi
name: str = '小张'
name
'小张'

if 条件判断

if 语句用于有条件的执行。语法如下:

if assignment_expression:
    suite
elif assignment_expression: # 可选子句
    suite
... # 可以多个 elif
else: #可选子句
    suite

对于简单语句,可以写为一行,但不推荐。

它通过对表达式逐个求值直至找到一个真值。然后执行该 if 语句或子句体下的代码,从而 if 语句的其他部分不会被执行或求值。

如果所有表达式均为假值,else 子句体如果存在就会被执行。

for i in range(5):
    if i % 2 == 0:print(i)
0
2
4
for i in range(5):
    if i % 2 == 0:
        print(i)
0
2
4
i,j = 0,1
if i < 0: 
    print(i) # 不执行
elif i == 0:
    print(i) # 执行,下面的则不再执行
elif j == 1:
    print(j)
else:
    print(i,j)
0
i,j = 0,1
if i < 0: 
    print(i) # 不执行
elif i == 1:
    print(i) # 不执行
elif j == 0:
    print(j) # 不执行
else:
    print(i,j) # 执行
0 1

多个 if 语句连用,则分别判断,互不影响:

i,j = 0,1
if i < 0: 
    print(i) # 不执行
else:
    print(i,j) # 执行
if i == 0:
    print(i) # 执行
if j == 1:
    print(j) # 执行
else:
    print(i,j) # 不执行
0 1
0
1

for 循环

for 语句用于对可迭代对象中的元素进行迭代。语法如下:

for target_list in expression_list:
    suite
else: # 可选子句
    suite

对于简单语句可以写为一行,但不推荐。

表达式 expression_list 被求值一次,它应该产生一个可迭代对象。系统将为 expression_list 的结果创建一个迭代器,然后每一项会按标准赋值规则(详见见 赋值语句)被依次赋值给 target_list,每赋值一次执行一次语句下的代码。

当所有项被耗尽时,else 子句如果存在将会被执行,并终止循环。

for i in range(3):print(i)
0
1
2
for i in zip('123','abc'):
    print(i)
('1', 'a')
('2', 'b')
('3', 'c')
for i,j in zip('123','abc'):
    print(f'{i}->{j}')
else:
    print('end')
1->a
2->b
3->c
end

for 循环会对 target_list 中的变量进行赋值。这将覆盖之前对这些变量的所有赋值,包括在 for 循环体中的赋值。

变量在循环结束时不会被删除,但如果序列为空,则它们根本不会被循环所赋值。

i = 'a'
for i in range(3):
    print(i)
print(i)
0
1
2
2
for i in range(0):
    print(i)
print(i)
2

while 循环

while 语句用于在表达式保持为真的情况下重复地执行。语法如下:

while assignment_expression:
    suite
else: # 可选子句
    suite

对于简单语句可以写为一行,但不推荐。

这将重复地检验表达式,如果其值为真就执行其下的代码;表达式值为假则如果 else 子句存在就会被执行并终止循环。

i = 0
while i < 3: print(i); i += 1
0
1
2
i = 0
while i < 3: 
    print(i)
    i += 1
else: # i 为 3 时执行
    print(f'i={i}')
    print('end')
0
1
2
i=3
end

break 语句

break 在语法上只会出现于 for 或 while 循环所嵌套的代码。

它会终结最近的外层循环,如果循环有可选的 else 子句,也会跳过该子句。

如果一个 for 循环被 break 所终结,该循环的控制变量会保持其当前值。

当 break 将控制流传出一个带有 finally 子句的 try 语句时,该 finally 子句会先被执行然后再真正离开该循环。

for i in range(6):
    for j in range(6):
        if i**2 == j:
            print(f'i={i},j={j}')
print(f'i={i},j={j}')            
i=0,j=0
i=1,j=1
i=2,j=4
i=5,j=5
for i in range(6):
    for j in range(6):
        if i**2 == j:
            print(f'i={i},j={j}')
        break
print(f'i={i},j={j}')  
i=0,j=0
i=5,j=0
for i in range(6):
    for j in range(6):
        if i**2 == j:
            print(f'i={i},j={j}')
        break # 控制内层循环
    else: # 不会执行
        print(f'i={i},j={j}')  
i=0,j=0
for i in range(6):
    for j in range(6):
        if i**2 == j:
            print(f'i={i},j={j}')
        break
else: # 属于外层循环,会执行
    print(f'i={i},j={j}')  
i=0,j=0
i=5,j=0
for i in range(5):
    try:
        print(f'3/i={3/i}')
    except ZeroDivisionError as e:
        print(e)
    finally:
        print(f'i={i}')
division by zero
i=0
3/i=3.0
i=1
3/i=1.5
i=2
3/i=1.0
i=3
3/i=0.75
i=4
# 引发异常直接跳过 break
# 无异常则继续执行完 finally 才终止循环
for i in range(5):
    try:
        print(f'3/i={3/i}')
        break
    except ZeroDivisionError as e:
        print(e)
    finally:
        print(f'i={i}')
division by zero
i=0
3/i=3.0
i=1

continue 语句

continue 在语法上只会出现于 for 或 while 循环所嵌套的代码中。

它会继续执行最近的外层循环的下一个轮次,或者在没有下一轮次时转往 else 子句执行。

当 continue 将控制流传出一个带有 finally 子句的 try 语句时,该 finally 子句会先被执行然后再真正开始循环的下一个轮次。

for i in range(3):
    for j in range(3):
        if j == 1:
            print(f'i={i},j={j}')
        continue
i=0,j=1
i=1,j=1
i=2,j=1
for i in range(3):
    for j in range(3):
        if j == 2:
            print(f'i={i},j={j}')
        continue
    else: # 属于内层循环,每次内层循环结束都执行
        print('end')
i=0,j=2
end
i=1,j=2
end
i=2,j=2
end
for i in range(3):
    for j in range(3):
        if j == 2:
            print(f'i={i},j={j}')
        continue
else: # 属于外层循环,外层循环结束才执行
    print('end')
i=0,j=2
i=1,j=2
i=2,j=2
end
# 引发异常直接跳过 continue
# 无异常则继续执行完 finally 才继续下一次循环
for i in range(3):
    try:
        print(f'3/i={3/i}')
        continue
    except ZeroDivisionError as e:
        print(e)
    finally:
        print(f'i={i}')
    print(i) # 无异常时被跳过
else:
    print('end')
division by zero
i=0
0
3/i=3.0
i=1
3/i=1.5
i=2
end

猜你喜欢

转载自blog.csdn.net/weixin_46757087/article/details/112976799