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),最终使得a和b同时引用了同一对象,即指向同一块内存。

a = 3
b = a
a = "spam"

1.5 共享引用与直接修改
L1 = [2, 3, 4] #列表是可变对象(mutable)
L2 = L1 #L1,L2引用同一对象
L1[0] = 24 #对列表对象进行直接修改,L1和L2还是引用相同的列表对象
L1 #L1发生了改变
L2 #L2同样发生了改变
L1和L2同时引用了相同的列表对象,列表对象是可变的,当对可变对象重新赋值时,直接对该对象进行了修改,而L1和L2还是指向这个被修改后的列表,所有L1和L2都发生了改变。
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 while与for循环
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, pass和else
- 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