概述
我们学习完了数据类型,开启编程的第二步,学习流程控制语句。
流程控制大纲图如下:
1.条件控制,使用if...else..语句对条件结果(True/False)进行判断
2.循环语句用来执行一条或着多条语句,有while循环和for循环两种形式。
可以通常与条件控制语句结合一起使用,实现复杂的代码逻辑如
- 如果条件符合,则反复执行循环体里的语句
- 在每次执行完后都会判断一次条件是否为True
- 如果为True则继续重复执行循环体里的语句。
1. 条件分支类型
条件根据不同的结果执行不同的代码,这称为选择结构或者分支结构。
Python 中的 if else 语句可以细分为三种形式
- if 语句
- if else 语句
- if elif else 语句
1.1 单分支
单分支结构只if判断,当条件为True,执行语句,否则就不执行条件语句块
1.2 双分支
双分支结构,当条件为True时,执行语句块1。如果条件False时,则为执行语句块2.
1.3 多分支
多分支结构就是有多个条件判断。
2.循环语句
Python循环语句有while和for两种循环体。接下来会详细介绍它们的使用。
学习之前,我们先找一个小练习打印乘法表,带着去解决问题思维,去使用两个循环吧。
2.1 while循环
while循环书写格式
while 条件:
循环体
# 用while循环实现如下
row = 1
while row <= 9:
col = 1
while col <= row:
print('%d * %d = %d ' %(col,row,col*row),end='')
col += 1
print('')
row += 1
2.2 for循环
Python for 循环可以遍历任何可迭代对象,如一个列表或者一个字符串。
for循环书写格式
for 变量 in 可迭代对象:
循环体
# 用for循环实现如下
for x in range(1,10):
for y in range(1,10):
print("{0}*{1}={2}".format(x,y,(x*y)),end="\t")
print()
2.3 嵌套循环
顾明思议,就是循环里嵌循环。
for 变量 in 可迭代对象:
for 变量 in 可迭代对象:
循环体2
循环体1
while 条件:
while 条件
循环体
循环体
3. 循环中配套语句
3.1 break
break语句可用while和for循环,用来结束整个循环。
当有嵌套循环时,break语句只能跳出最近的循环。
# 输出 JueJing 的每个字母
for letter in 'JueJing':
if letter == 'n':
break
print('当前字母 :', letter)
3.2 contiue
continue语句用于结束本次循环,继续下一次。
多个循环嵌套时,continue也是应用于最近的一层循环。
# 输出 JueJing 的每个字母
for letter in 'JueJing':
if letter == 'u':
continue
print('当前字母 :', letter)
3.3 else
while,for 循环可以附带一个else语句(可选)。
如果for,while 语句没有被break语句结束,则会执行else子句,否则不执行。
语法格式如下
while 条件表达式:
循环体
else:
语句块
或者:
for 变量 in 可迭代对象:
循环体
else:
语句块
# 打印4次输入的内容,如果输入Q,则直接退出循环,如果输出4次,则执行到else提示已达到上限
for i in range(4):
i = input()
if i == "Q":
break
print(i)
else:
print("Over")
3.4 pass
Python pass 是空语句,是为了保持程序结构的完整性。
pass 不做任何事情,一般用做占位语句。
# 输出 JueJing 的每个字母
for letter in 'JueJing':
if letter == 'u':
pass
print('这是 pass 块')
print('当前字母 :', letter)
3.5 循环代码优化
虽然计算机越来越快,空间也越来越大,我们仍然要在性能问题上考虑,编写循环时,遵循下面三个原则,可以大大提高运行效率,避免不必要的低效计算
- 尽量减少循环内部不必要的计算
- 嵌套循环中,尽量减少内层循环计算,尽可能向外提
- 局部变量查询较快,尽量使用局部变量
import time
start = time.time()
for i in range(1000):
res = []
for j in range(10000):
res.append(i*1000+j*100)
end = time.time()
print("耗时:{0}".format(end-start))
start2 = time.time()
for i in range(1000):
res = []
C = i*1000
for j in range(10000):
res.append(C+j*100)
end2 = time.time()
print("耗时:{0}".format(end2-start2))
4.综合练习
Leetcode两数相加题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路:
使用双指针概念,暴力方法最简单,两个for循环嵌套使用
def twoSum_wayOne(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n=len(nums)
for x in range(n):
for y in range(x+1,n):
if nums[x]+nums[y] == target:
return [x,y]
break
else:
continue