4 控制语句
4.1 选择结构
-
条件表达式中,不能出现赋值操作符=
-
单分支:if a<10 :
-
双分支:if else
-
三元条件运算符:
# 条件为真返回值 if 表达式 else 条件为假返回值
print( num if int(num)<10 else '数字太大' )
-
多分支:if - elif
几个分支间右逻辑关系,不能随便颠倒顺序
# 显示
# {}占位符别忘了,python里的表示方法要习惯
print("分数是{0},等级是{1}" ,format(score,grade) )
print("分数是:" ,score )
- 嵌套
控制好缩进量!!不然关系乱套了!!
4.2 循环结构
while
num = 0
while num <= 10 :
print(num)
num += 1
for 循环和可迭代对象遍历
for 循环通常用于可迭代对象的遍历。
for 变量 in 可迭代对象:
循环体语句
【操作】遍历一个元组或列表
for x in (10,20,30)
print(x*3) # 依次
可迭代对象
Python 包含以下几种可迭代对象:
-
序列
-
字符串
-
列表
-
元组
-
字典
range 对象
range 对象是一个迭代器对象,用来产生指定范围的数字序列。格式为:
range(start, end [,step])
默认从0 开始。默认为 1。
for i in range(10)
for i in range(3,10)
for i in range(3,10,2)
# 产生序列:0 1 2 3 4 5 6 7 8 9
# 产生序列:3 4 5 6 7 8 9
# 产生序列:3 5 7 9
# 【操作】利用 for 循环,计算 1-100 之间数字的累加和;计算 1-100之间偶数的累加计算 1-100 之间奇数的累加和。
sum_all = 0 #1-100 所有数的累加和
sum_even = 0 #1-100 偶数的累加和
sum_odd = 0 #1-100 奇数的累加和
for num in range(101):
sum_all += num
d = {'name':'gaoqi','age':18,'address':'西三旗 001 号楼'}
for x in d: \#遍历字典所有的 key
print(x)
for x in d.keys():\#遍历字典所有的 key print(x)
for x in d.values():\#遍历字典所有的 value print(x)
for x in d.items():\#遍历字典所有的"键值对" print(x)
for x in "sxt001": print(x)
嵌套循环和综合练习
利用嵌套循环打印九九乘法表
for m in range(1,10):
for n in range(1,m+1):
print('{0}*{1}={2}'.foemat(m,n,(m*n)),end='\t')
print() # 换行,因为没写end是啥,就默认是换行
# 编程时出错的地方:
# 1. range范围包头不包尾,还是1~9 这种;
# 2. for循环别忘了最后的冒号!
用列表和字典存储下表信息,并打印出表中工资高于 15000 的数据
# 只写查表的部分
for x in tb:
if x.get('salary')>15000:
print(x)
# 注意的地方:
# 1. x为 每行的字典 对象
break 语句
break 语句可用于 while 和 for 循环,用来结束整个循环。
当有嵌套循环时,break语句只能跳出最近一层的循环。
continue 语句
continue 语句用于结束本次循环,继续下一次。
多个循环嵌套时,continue也是应用于最近的一层循环。
else 语句
while、for 循环可以附带一个 else 语句(可选)。
如果 for、while 语句没有被 break 语句结束,则会执行 else 子句,否则不执行。
while 条件表达式:
循环体
else:
语句块
for 变量 in 可迭代对象:
循环体
else:
语句块
循环代码优化
虽然计算机越来越快,空间也越来越大,我们仍然要在性能问题上“斤斤计较”。
编写循环时,以下规则:
1. 减少循环内不必要的计算;
2. 嵌套循环中,减少内存的计算、向外提;
3. 局部变量查询较快,尽量使用局部变量。
# 循环代码优化测试
# import time
start = time.time()
for i in range(1000):
result = []
for m in range(10000): \
result.append(i*1000+m*100)
end = time.time()
print("耗时:{0}".format((end-start)))
start2 = time.time()
for i in range(1000):
result = [] c = i*1000
for m in range(10000):
result.append(c+m*100)
end2 = time.time()
print("耗时:{0}".format((end2-start2)))
其他优化手段
-
连接多个字符串,使用 join()而不使用+
-
列表进行元素插入和删除,尽量在列表尾部操作
使用 zip()并行迭代
我们可以通过zip()函数对多个序列进行并行迭代,
zip()函数在最短序列“用完”时就会停止。
推导式创建序列
推导式是从一个或者多个迭代器快速创建序列的一种方法。
它可以将循环和条件判断结合,
列表推导式
列表推导式生成列表对象,语法如下:
[表达式 for item in 可迭代对象 ]
{表达式 for item in 可迭代对象 if 条件判断}
字典推导式
字典的推导式生成字典对象,格式如下
{key_expression : value_expression for 表达式 in 可迭代对象}
类似于列表推导式,字典推导也可以增加 if 条件判断、多个 for 循环。
集合推导式
集合推导式生成集合,和列表推导式的语法格式类似:
{表达式 for item in 可迭代对象 }
{表达式 for item in 可迭代对象 if 条件判断}
{x for x in range(1,100) if x%9==0}
# {99, 36, 72, 9, 45, 81, 18, 54, 90, 27, 63}
生成器推导式(生成元组)
“都有推导式,元组有没有?”,能不能用小括号呢?
(x for x in range(1,100) if x%9==0)
# \<generator object \<genexpr\> at 0x0000000002BD3048\>
我们发现提示的是“一个生成器对象”。
显然,元组是没有推导式的。