Python的控制语句

回顾:Python程序的层次结构

程序由模块组成,模块是以.py结尾的文本文件。

模块包含语句。

语句包含表达式。

表达式创建和处理对象。

在传统编程教学中,通常强调编程的三大核心概念:

顺序执行(先做这个,然后做那个

选择执行(如果那个是真的,就做这个

重复执行(重复做这个

1、动态类型

Python在创建变量时无需声明类型,类型是在运行时自动确定的。

1.1 变量、对象和引用

变量创建: 首次赋值会创建对象,之后的赋值会改变对象的值。

变量类型: 变量不包含类型信息,也没有类型限制;类型依据所引用的类型而不是变量。

变量使用: 当变量出现在表达式中时,会自动将变量所引用的对象代入表达式。

 

a = 3    #将一个变量名分配给一个对象

 

当我们给变量赋值时,Python会:

1、创建一个对象,代表数值3.

2、创建一个变量名a,如果变量a之前不存在。

3、将变量a链接到新的对象a

 

Python会创建一个表,来记录变量名到对象间的链接:

变量是系统表中的条目,具有指向对象的链接空间。

对象是分配的内存片段,具有足够的空间来表示它们代表的值。

引用是从变量到对象的自动跟随的指针。

 

1.2 类型与对象相关,而不是变量名

#将变量a多次赋值

a = 3    #对象的类型是整数

a = 'spam'    #对象的类型是字符串

a = 1.23    #对象的类型是浮点数

 

1.3 对象的垃圾回收机制

x = 42

x = 'shrubbery'    #42将被回收,除非还有其他引用

x = 3.1415    #'shrubbery'被自动回收

x = [1, 2, 3]    #3.1415被自动回收

 

1.4 共享引用

a = 3

b = a

 

输入这两行语句会产生如下图所示的效果,第二行语句会让Python创建变量b,但不会将a赋值给变量b

而是替换成a引用的对象(3),最终使得ab同时引用了同一对象,即指向同一块内存。

a = 3
b = a
a = "spam"

1.5 共享引用与直接修改

L1 = [2, 3, 4]    #列表是可变对象(mutable

L2 = L1           #L1L2引用同一对象

 

L1[0] = 24   #对列表对象进行直接修改,L1L2还是引用相同的列表对象

L1        #L1发生了改变

L2        #L2同样发生了改变

 

L1L2同时引用了相同的列表对象,列表对象是可变的,当对可变对象重新赋值时,直接对该对象进行了修改,而L1L2还是指向这个被修改后的列表,所有L1L2都发生了改变。

 

1.6 浅拷贝copy.copy()与深拷贝copy.deepcopy()

如果我们不希望L1和L2同时发生改变,我们可以不要让L1和L2同学指向一个可变对象,而是使用拷贝来创建一个副本。

import copy

Y = [2, 3, 4]

X = copy.copy(Y)    #Y的顶层对象创建副本

#X = copy.deepcopy(Y) #Y的所有对象(包含嵌套的对象)创建副本

Y[0] = 24

X

 

1.7 共享引用与相对性

L = [1, 2, 3]

M = L

L == M    #"=="判断值是否相等

L is M    #"is"判断是否为同一对象

 

2 Python的语法

2.1 Python组织代码的形式

Python以缩进来组织代码,Python组织代码的规则如下:

Header line: #首行以冒号结尾

Nested statement block #接着是缩进的代码块

 

2.2 以分号分隔多个语句

如果在一行中有多个语句,可用分号隔开(所有的符号均为英文符号):

a = 1; b = 2; print(a + b)

 

2.3 以圆括号"()",方括号"[]",或花括号"{}",括起来的代码可以跨越多行

mylist = [1111,

          2222,

          3333]

 

2.4 缩进嵌套的例外

Python以缩进组织嵌套语句,但是有一个例外,嵌套语句可以跟在主语句(Header line)的冒号之后。

if x > y: print(x)

 

2.5 Python的语句

语句

作用

举例

赋值

创建引用

a, b = 'good', 'bad'

调用

运行函数

log.write("spam, ham")

打印

打印对象

print('The Killer', joke)

if测试

条件测试

if "python" in text:print(text)

for循环

迭代

for x in mylist:print(x)

while循环

通用循环

while X > Y:print('hello')

pass

占位符

while True:pass

break

终止循环

break

continue

继续循环

continue

def

定义函数和方法

def f(a, b, c=1, *d):print(a+b+c+d[0])

return

返回函数结果

def f(a, b, c=1, *d):return a+b+c+d[0]

yield

生成器函数

def gen(n):for i in n: yield i*2

global

全局变量

global x

nonlocal

局部变量

nonlocal x

import

导入模块

import sys

from

导入属性

from sys import stdin

class

创建类

class Subclass(Superclass):pass

try/except/ finally

异常捕获

try:...;except:...

raise

调试

raise EndSearch(location)

assert

断言

assert X > Y, 'X too small'

with/as

上下文管理

with open('data') as myfile:process(myfile)

del

删除引用

del variable

3 赋值语言

3.1 连续赋值

nudge = 1   #基础赋值

wink  = 2

A, B = nudge, wink  #元组赋值

A, B

[C, D] = [nudge, wink]    #列表赋值

C, D

 

3.2 交换赋值

nudge = 1

wink  = 2

nudge, wink = wink, nudge    #交换赋值,等效于T = nudge; nudge = wink; wink = T

nudge, wink

 

3.3 高级连续赋值

string = 'SPAM'

a, b, c, d = string

a, d

 

3.4 解包赋值

seq = [1, 2, 3, 4]

a, b, c, d = seq   #赋值的变量数量要与赋值的元素相等,4个变量对应4个元素

print(a, b, c, d)

 

a, b = seq  #报错,赋值变量的数量与元素数量不匹配

a, *b = seq    #a被赋值第一个元素,b被赋值剩余的元素

 

a

b

 

当使用星号变量时,左侧目标中的项数不需要与目标序列的长度匹配。星号变量会自动计算匹配的元素数量,变量a与被赋值第一个元素,剩余的元素会被赋值给变量b。星号变量可以出现在任意位置:

*a, b = seq

a

b

4 if测试和语法规则

4.1 if测试的基本形式

if test1:                 # if测试

    statements1           # 缩进的代码块

elif test2:               # 可选的elif从句

    statements2

else:                     # 可选的else从句

    statements3

 

choice = "薯条"

if choice == "汉堡":

    print("10元")

elif choice == "薯条":

    print("8元")

elif choice == "可乐":

    print("5元")

else:

    print("我们提供汉堡、薯条、可乐")

4.2 布尔测试与真值

所有对象都有内在的布尔真或假值
任何非零数字或非空对象都被视为真零数字、空对象和特殊对象None被视为假
比较和相等性测试会递归地应用于数据结构
比较和相等性测试返回True或False
布尔and和or运算符返回True或False
布尔运算符在结果已知后立即停止评估

4.3 if/else 三元表达式

A = 't' if 'spam' else 'f'     # 非空字符串为True

A

 

A = 't' if '' else 'f'    # 空字符串为False

A

 

5 whilefor循环

5.1 while循环的基本形式

while test:                     # 循环测试

    statements                  # 循环体

else:                           # 可选的else从句

    statements                  # 如果if测试不成立则运行这部分

 

while True:

    print('Ctrl-C终止循环!')

 

a=0; b=10

while a < b:

    print(a, end=' ')

    a += 1 

 

5.2 break, continue, passelse

  • break 跳出整个循环
  • continue 跳过当前循环的剩余部分,并继续执行下一次循环迭代
  • pass 不执行任何操作(相当于占位符)
  • else 代码块 如果if测试没有触发break时,会执行这部分代码

 

pass

pass

首先从简单的事情开始:pass 语句是一个无操作的占位符,当语法需要一个语句但你没有什么有用的东西可说时使用。

它通常用于编写复合语句的空体。例如,如果你想编写一个每次循环什么都不做的无限循环,可以用 pass 来实现:

 

while True: pass  # Ctrl-C终止循环

 

def func1():

    pass  # 占位稍后再补充代码

 

continue

continue

 

continue语句会忽略当前循环的剩余部分,并回到循环的顶部,继续剩下的循环。

 

x = 10

while x:

    x = x-1

    if x % 2 != 0: continue # 如果不能被2整除,则跳过当前循环(即不再执行print语句),继续下次循环。

    print(x, end=' ')

 

break

break

# break会跳出整个循环

while True:

    name = input('请输入名字:')

    if name == 'stop': break

    print('Hello', name)

else语句

else

下面的例子中,通过寻找大于1的因子来判断y是否为质数:

程序从 y 的一半开始逐步向下检查是否存在因数,如果找到一个因数,就打印因数并结束循环(触发break)。

如果循环遍历完都没有找到因数(循环正常退出,执行else语句),就打印出该数字是质数。

 

y = int(input("请输入一个数值:"))

x = y // 2                               

while x > 1:

    if y % x == 0:                        # 余数

        print(y, 'has factor', x)

        break                             # 跳过else

    x -= 1

else:                                     # 正常结束循环

    print(y, 'is prime')

 

5.3 for循环

for循环的基本形式

for target in object:                 # 将对象中的元素赋值给临时变量target

    statements                        # 使用target变量来执行重复操作

else:                                 # 可选的else部分

    statements                        # 没有触发break正常退出循环时执行

python

for x in ["汉堡", "薯条", "可乐"]:

    print(x, end=" ")

 

5.3.1 使用for循环给元组赋值

T = [(1, 2), (3, 4), (5, 6)]

for (a, b) in T:

    print(a, b)

 

5.3.2 for循环嵌套

 

# 使用for循环嵌套来生成乘法口诀表

for i in range(1, 10):  # 外层循环,控制行

    for j in range(1, 10):  # 内层循环,控制列

        print(i * j, end='\t'# 打印乘积,使用制表符对齐

    print()  # 换行

 

 

notebook链接:https://www.kaggle.com/code/jeanshendev/python-statements-and-syntax

下载本节的示例代码及文件:Python的控制语句.ipynb