目录
1.控制结构
1.1.顺序结构
1.2.选择结构
习题
1.3.循环结构
1.3.1. while语句
1.3.2.for语句
1.3.3.循环嵌套
1.4.break语句
1.5.continue语句
1.6.pass语句
习题
1.控制结构
在学习控制结构之前我们通过一个故事来简单的描述一下控制结构,先看一下这幅图。
小明每天放学回家必须要经过道路1,道路1上有十条马路,小明需要先顺序的走到分叉口,在面对道路2和道路3的时候他需要作出选择,当他选择道路3的时候是无法回到家的,当他选择道路2之后会走到操场,小明的爸爸规定小明在回家之前要围着操场跑3圈,因此当他围着操场循环跑了3圈之后,满足了要求才可以回到家中。
我们在编写程序解决问题的时候也通常会使用这三种结构,它们分别是顺序结构、选择结果、循环结构。
下面我们来通过执行流程图来认识一下这三种结构。
1.1.顺序结构
顺序结构是三者里比较容易理解的,它按照编写完毕的语句的顺序依次执行。
一般来说就是我们所能看到的从上到下依次执行。
举个例子:
print(' ','登高',' ','李白')
print('风急天高猿啸哀,渚清沙白鸟飞回。')
print('无边落木萧萧下,不尽长江滚滚来。')
print('万里悲秋常作客,百年多病独登台。')
print('艰难苦恨繁霜鬓,潦倒新停浊酒杯。')
输出结果为:
1 2 3 4 5 |
|
1.2.选择结构
1. if语句
简单的if语句就是使用if关键字来构成选择语句,它的形式是:
1 2 |
|
表达式可以是一个变量或者布尔值,也可以是比较表达式或逻辑表达式,如果表达式的结果为真就会执行条件语句,如果为假就跳出此判断往下继续运行。
当我们口渴的时候,我们会去喝水。通过流程图可以看出,此时会对是否口渴进行一个判断,如果口渴了则为True,则往下走执行喝水操作。
那么它的程序对应就是:
you = str(input('是否口渴,回答是或其他任何回答:'))
if you == '是':#如果回答‘是’,就会喝水。
print('喝水')
print('喝水')
我们还可以通过一条语句实现if语句,例如:
x = 1
if X > 0 : print('X是大于0的')
但是并不推荐使用这种写法,这样会影响程序的可读性,所以我们在学习过程中尽量将代码写的整洁易懂。
2. if...else
当我们面临两种选择的时候就要使用到if...else结构,它的格式为:
1 2 3 4 |
|
举个例子,当我们要判断某天是否要上班的时候,要对判断当天是否是工作日,如果是工作日,那么就要去上班,如果不是工作日,那么就不去上班。
流程图如下:
对应的程序为:
judge = str(input("今天是否工作日(回答是或否):"))
if judge == '是':
print('需要去工作')
else:
print('不用去工作')
简单的if...else语句就是通过判断if中的语句是否满足而选择性的执行相关操作。
我们再通过一个简单的例子来强化一下if...else的学习。
number = int(input())#先输入一个number
if number >= 100:#判断number是否大于或等于100
print('number是大于或等于100的')#满足条件执行此语句
else:
print('number小于100')#不满足if中的条件就执行此语句
需要注意一点是在引用else的时候else是不能单独使用的,else需要和if或while配套使用。
3. if...elif...elif...else语句
对于一个问题处于多种选择的状态下,也可以理解为判断条件有多个值的时候,if...else就不能满足我们的需求,这时候我们就要借用elif来解决问题。
elif是等同于else+if,它的使用可以帮助我们简化代码,不至于是使用过多的if...else语句。它的形式为:
1 2 3 4 5 6 7 8 |
|
我们看一下它的执行流程图。
这种形式就是当第一种情况不满足的时候会进行第二种情况的判断,如果仍然不满足会进行第三种情况的判断,如果还不满足就直接False处理。
我们来通过一个问题来分析:
我们在旅游的时候总是离不开交通工具的选择。
1)我们可以首先进行判断高铁是否可以到达,如果满足就可以直接选择乘坐高铁。
2)如果不满足上条件可以判断是否可以乘坐火车到达,如果满足就可以选择乘坐火车。
3)如果不满足上条件可以判断是否可以乘坐飞机到达,如果满足就可以选择乘坐飞机,如果不能到达我们可以最后放弃出行或者更换旅游地点。
4)可以通过这个实例对应上流程图理解一下。
下面我们通过另外一个实例来再次学习:
关于体质指标如下:
1 2 3 4 5 6 7 |
|
我们可以通过一个人的体重和身高来判断他的体质指数是否合格。
代码如下:
height = float(input('Height(m):'))#输入身高
weight = float(input('Weight(kg):'))#输入体重
BMI = (weight) / ((height) ** 2)#BMI计算公式
if BMI < 18.5:
print('过轻')
elif BMI <= 25:
print('正常')
elif BMI <= 28:
print('过重')
elif BMI <= 32:
print('肥胖')
else:
print('严重肥胖')
通过这个问题想必大家已经理解了elif的用法,在我们要分类讨论一个问题的时候使用这种方式可以更清晰的分析理解。
2. if语句的嵌套
关于if语句的嵌套,就是指满足一个if语句之后,在它的条件语句里再进行一个if语句的判断,这种形式的嵌套形式在筛选数据或者条件过滤的时候常用到。
它的形式为:
1 2 3 4 5 6 7 8 |
|
它对应的流程图:
不知道大家有没有试过使用程序去判断一个年份是不是闰年,下面我们来通过这样一个问题来了解一下if语句的嵌套。
代码如下:
year = int(input("输入一个年份: "))
if (year % 4) == 0:
if (year % 100) == 0:
if (year % 400) == 0:
print(year,"是闰年") # 是整百年但能被400整除的
else:
print(year,"不是闰年")
else:
print(year, "是闰年") # 不是整百年但能被4整除的
else:
print(year,"不是闰年")
输出结构:
1 2 3 4 |
|
这个问题的解决就是通过条件语句的嵌套来筛选得到答案,具体看一下嵌套形式以及缩进格式。当年份满足能整除4这一条件的时候可以进行第一次筛选,当年份能被4整除的同时还能被100整除的时候可以进行第二次筛选,当年份既能被4整除也能被100整除还能被400整除的时候进行第三次筛选,从而得到最终的判断。
习题
1.题目 1008: [编程入门]成绩评定
grade = int(input())
if grade >= 90:
print('A')
elif grade >= 80 and grade < 90:
print('B')
elif grade >= 70 and grade < 80:
print('C')
elif grade >= 60 and grade < 70:
print('D')
else:
print('E')
2.题目 1067: 二级C语言-分段函数
x=int(input())
if x<0:
print('%.2f' % -x)
elif x<2 :
print('%.2f' % (x+1)**0.5)
elif x<4:
print('%.2f' % (x+2)**5)
elif x>=4:
print('%.2f' % (2*x+5))
3.题目 1481: 蓝桥杯算法提高VIP-剪刀石头布
#方法一:
a,b = map(int,input().split())
def judge(a,b):
if a==b:
return 0
if (a==0 and b==2) or (a==1 and b==0) or (a==2 and b==1):
return 1
else:
return -1
print(judge(a,b))
#方法二·:
from enum import Enum
class Result(Enum):
WIN = 1
LOST = -1
DRAW = 0
a, b = map(int, input().strip().split())
if ((a==0 and b==2)or(a==1 and b==0)or(a==2 and b==1)):
print(Result.WIN.value)
elif a==b:
print(Result.DRAW.value)
else:
print(Result.LOST.value)
#方法三:
import math
ans={
"0 0":0,
"1 1":0,
"2 2":0,
"0 1":-1,
"1 2":-1,
"2 0":-1,
"1 0":1,
"2 1":1,
"0 2":1,
}
inp=input()
print(ans.get(inp))
4.题目 1002: [编程入门]三个数最大值
a, b, c = map(int, input().split())
if a > b and a > c:
print(a)
if b > a and b > c:
print(b)
if c > b and c > a:
print(c)
5.题目1005:[编程入门]温度转换
f=float(input())
c=(f-32)*5/9
print("c="+"%.2f" % c)
6.[编程入门]利润计算
I=int(input())
if I<=100000:
w=I*0.1
elif I<=200000:
w=10000+(I-100000)*0.075
elif I<=400000:
w=10000+(I-200000)*0.05+7500
elif I<=600000:
w=10000+(I-400000)*0.03+7500+10000
elif I<=1000000:
w=10000+(I-600000)*0.015+7500+10000+6000
elif I>1000000:
w=10000+(I-1000000)*0.01+7500+10000+6000+6000
print(int(w))
7. 模拟计算器
a,b,s=input().split()
a=int(a)
b=int(b)
if s=='+':
print((a+b))
if s=='-':
print((a-b))
if s=='*':
print((a*b))
if s=='/':
print((a//b))#求整数结果
if s=='%':
print((a%b))
#看看别人的高级解,构造字典
def switch(x,y,symble):
switch = {
"+":x+y,
"-":x-y,
"*":x*y,
"/":x/y,
"%":x%y,
}
return switch.get(symble,"")
a,b,s=input().split()
a,b=int(a),int(b)
print(int(switch(a,b,s)))
1.3.循环结构
循环结构就是重复的执行一条或若干语句,在日常生活中我们可以看到很多这样的例子,像修铁路、盖房子这样的工程,大多来说都是不达到目标之前都在重复的去执行相同的操作,也就是在循环的坐同一件事情。
对于循环结构,主要分为两种类型:
1)条件控制的循环
条件控制的循环是指采用一个表达式(可真可假)来控制循环的次数,我们用while语句来描述条件能控制的循环。
2)计数控制的循环
计数控制的循环是根绝指定的次数来进行循环,我们用for语句来编写计算控制的循环。
1.3.1. while语句
while语句的概念:当满足条件时进入循环,进入循环后,当条件不满足时,跳出循环。while语句的一般表达式为:
1 2 |
|
逻辑图如下图:
它的工作原理是判断条件为真时的时候就进入循环体循环一次,直到判断条件不成立,为Flase时退出循环。
下面我们仍然是通过实例来进行进一步学习。
小明的爸爸对他管教的很严格,他爸爸给他规定,每天晚上放学回到家中都需要写五道编程题,写完了才可以玩手机。
代码如下:
count = 0
while count < 5:
count += 1
if count <5:
print('现在是第',count,'道,需要继续答题')
print('小明已经完成',count,'道题目,可以玩手机了')
输出结果:
1 2 3 4 5 |
|
2. 无限循环(死循环)
对于大多数循环来说,循环体内一定要有结束循环的操作,意思就是循环内部存在让表达式的判断为假的语句,如果缺少了这样的语句,那么循环没有停下来的方法,那么就会形成无限循环,也就是死循环。
这一点我们用比喻来形容一下,假如有一辆汽车,它拥有无限的油量和电量,但是我们没有给他设置刹车和关闭功能,那么这辆车一旦启动,就会一直前行,直到产生一定后果,否则不会停下来。
举个例子来看一下:
number=10
while number<100:
print(number)
对于上面这个语句,当你执行了之后就会发现,程序在一直执行,因为没有条件能够使得number大于或等于100,因此形成了无限循环。因此在写循环语句的时候一定要注意控制条件。
1.3.2.for语句
我们在上一节提到过计数控制的循环是根据绝对值的次数来进行循环,我们通过for语句来实现计数循环,那么在for循环中一定存在控制次数的对象。
1. for循环
for循环是通过次数的大小来进行循环,通常我们会使用遍历序列或枚举以及迭代来进行循环。
for循环的结构为:
1 2 |
|
迭代变量在我们每一次循环中保存根据变量得到的值,对象既是有序的序列,可以是字符串、元组、列表,也可以是无序的序列,例如字典。而循环体则为一条或若干条会被重复执行的语句。
下面是for循环可迭代的对象类型:
index = [1,2,3,4]#列表
string = 'abcdef'#字符串
sets = (1,2,3,4)#集合
for i in index:
print(i)
for j in string:
print(i)
for k in sets:
print(i)
我们来看一下for循环语句的执行流程图:
先定义一个循环:
1 |
|
从流程图中来分析一下这个循环。
首先我们分析这个循环的结构,i为迭代对象,range(10)为对象,在这里这个对象为一个0-9的序列,它等价于[0,1,2,3,4,5,6,7,8,9]。
当进入这个循环,首先会判断0-9是否遍历完,如果还未开始,则从第一个开始遍历,第一次是直接进入循环体,然后再次回到判断,判断是否还有值未进入循环,如果存在,就取这一项再次进入循环体,直到序列中的对象全部遍历完,然后退出循环。
下面我们通过一个实例来学习一下:
index = 5
for i in range(index):
print("这是第",i,'项')
运行结果:
1 2 3 4 5 |
|
通过这个简单的例子我们简单的认识了for循环,它的原理是根据对象中因素去决定它需要迭代多少次,迭代完成后退出循环。
在for循环中中离不开range()函数的使用,下面来了解一下range()函数。
2. range()函数
range()函数是Python内置的函数,它被用于生成一系列连续的整数,它的语法格式为:
range(start, stop[, step])
start:计数的第一个值,是包含这个值,如果没有start的时候默认为0。
stop:计数的最后一位,不包含这个值,当range(1,3)的时候,等同于[1,2]是没有3这个数字的,在使用的时候一定要注意这一点。当range()中只有一个数字的时候,像range(3),对应的是[0,1,2]这样一个序列,关于这点大家多多使用就会体会到。
step:为步长,用来控制取数之间的间隔,如果省略则默认为1,如果为2,3等则步长为2,3等。步长为-1时为逆序。
通过下面例子来看了解一下range函数。
>>> list(range(10))#范围0-9
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))#范围1-10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))范围0-29,步长为5
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))范围0-9,步长为3
[0, 3, 6, 9]
>>> list(range(0, -10, -1))范围0-(-10),步长为-1
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))
[]
能够熟练的使用range()函数对我们之后的学习有很大的帮助,大家可以在自己的编辑器上多多尝试一下这个函数。
1.3.3.循环嵌套
嵌套循环和if语句的嵌套原理相似,就是在一个循环体内嵌套另外一个循环体。不同的是循环嵌套可以采用for-for嵌套、for-while嵌套、while-for嵌套、以及while-while嵌套四种形式。
1. for-for嵌套
它的形式为:
1 2 3 4 |
|
举个例子:
我们定义两个列表(一种存储数据的容器)。
list_first = [1,2,3,4,5,6,7,8,9]
list_second = [2,4,8,10,12,20]
我们要找到两个列表中相同的数据并打印出来。
代码如下:
list_first = [1,2,3,4,5,6,7,8,9]
list_second = [2,4,8,10,12,20]
for i in list_first:
for j in list_second:
if i == j:
print(i)
输出结果为:
1 2 3 |
|
2. for-while嵌套
它的形式为:
1 2 3 4 |
|
举个例子:
index = [1,32,77,121,150]
遍历输出index列表中的值,对于小于100的数,把它每次加上10,直到大于100后再输出。
代码如下:
index = [1,32,77,121]
for i in index:#遍历index
while i < 100:#如果i小于100
i += 10#每次加上10
print(i)
输出结果为:
1 2 3 4 |
|
3. while-while嵌套
结构如下:
1 2 3 4 |
|
具体就不再举例,大家可以去在试着使用这种结构去解决问题。
4. while-for嵌套
结构如下:
1 2 3 4 |
|
5. 九九乘法表(作业1570)
在循环嵌套里有一比较经典的例子——打印九九乘法表。通过这个实例可以更清晰的看到双层循环嵌套的结构。
我们先来看一下代码:
1 2 3 4 |
|
再看一下输出结果:
1 2 3 4 5 6 7 8 9 |
|
运行图:
原理:先进行第一层循环,依次为1~9。第二层循环是在第一层循环的基础上再进行依次遍历,假如第一层循环现在是5,那么第二层循环找到1~5,然后分别用1~5去乘上5,那么就完成一次循环。我们在第1层循环中打印一个换行,可以使得代码更加明了。
1.4.break语句
我们在使用选择语句或者循环语句的时候,在满足部分条件时就要进行一定的跳转,在跳转的时候Python中有break、continue和return,本节讲一下break语句和continue语句,return语句会在后续章节中介绍。
1. break语句
break语句主要用于强制退出当前循环,它可以使用在while和for的控制语句中。
打个比方,小明决定回到家之后要写十道编程题,但是写到第五道的时候累了不想写了,
这时候就要用到break来退出循环,就不会再写剩下的作业,也就不会在执行break后面的语句。
break语句大多会和if语句配套使用,跳出当前循环。来看一下break语句分别在for语句和while语句中的结构:
1 2 3 4 5 6 7 8 |
|
下面我们通过两个实例了解一下break语句分别在for语句和while语句中的用法:
1) for语句中代码如下:
for i in range(100):#循环本要进行一百次
if i == 5:#break控制在当i=5的时候退出循环
break
print(i)#当i=5的时候并没有打印,因此最后一位为4
输出结果:
1 2 3 4 5 |
|
2) while语句中代码如下:
number = 0#定义number为0
while number != 10:#当number不为10的时候进入循环
print(number)
number += 1#number在循环中每次+1,会到number=10的时候执行else语句
if number == 5:#当number=5的时候跳出循环
break
else:
print(number,'等于10')#不会执行此语句
输出结果:
1 2 3 4 5 |
|
break语句对于循环结构的控制还是很强大的,纵使再复杂的循环结构,只要当前结构中出现了break,那么余下语句就都会被终止。
1.5.continue语句
1. continue语句
相比于break语句,continue那就显得威慑力不足,它的用法是终止本次循环,跳过尚未执行的语句而进入下次循环,它和break一样可以用于for语句和while语句当中。结构与break也大致相似:
1 2 3 4 5 6 7 8 |
|
通过实例来看一下continue的用法:
number = 0
while number != 10:
number += 1
if number == 5:
continue
print(number)#在number=5的时候此项被跳过
else:
print('number=',number)
输出结果:
1 2 3 4 5 6 7 8 9 10 |
|
看输出可以发现并没有5这一项,说明continue的存在使得number=5的那次循环的print被跳过。
1.6.pass语句
接下来讲一个pass语句,pass语句没有任何功能,它是一个空语句,它一般被用于充当占位的作用,就好比很多图书馆会有人帮忙拿书本去占位置,占到的位置一般来说不会有人去坐,直到被帮忙占位的那个人来了之后,占位的这本书就被这个人所取代,pass在 Python中就起到这样一个占位的作用。
举个例子来简单的说一下:
for i in range(100):
if i == 50:
pass
可能我们会在i等于50的时候需要进行一些操作,但是当我们还没想到的时候,可以用pass先等待着,到我们想起之后再补充即可。
习题
1.1389程序员的表白
while 1:
try:
a = int(input())
for i in range(a):
print('*', end='')
for j in range(a):
print(' ', end='')
print('*', end='\n')
for k in range(a + 2):
print('*', end='')
print('\n')
except:
break
2.二级C语言-阶乘数列
def jiecheng(a):
chengji = 1
for i in range(a):
chengji = chengji * (i + 1)
return chengji
sum=0
for i in range(30):
sum = jiecheng(i + 1)+sum
print("%.2e" % sum)#科学计数法
3.二级C语言-温度转换
def ctof(c):
f=(c*9/5)+32
int(f)
return f
for i in range(-100,155,5):
#print('c=',i,'->f=',int(ctof(i)))有空格
print(f'c={i}->f={int(ctof(i))}')
4.蓝桥杯2014年第五届真题-分糖果
n=int(input())
m=list(map(int,input().split()))
ans=0 #老师补发糖果的个数
while m.count(m[0]) != n: #这里的m[0]也可以是其他小朋友,我们只要确定这个m[0]的值的个数=n,就可以确定所有小朋友的糖果数量相同
for i in range(n): #先将所有的糖果都分出去一半
m[i]=m[i]/2
temp=m[0] #第一个小朋友一半的糖果数量
for i in range(n-1): #先将最后一个小朋友剔除,最后这个小朋友再加上第一个小朋友一半的糖果
m[i]+=m[i+1] #当前小朋友与后一个小朋友的糖果相加
m[n-1]=temp+m[n-1] #最后的一个小朋友的糖果数量等于第一个小朋友的一半和自己的一半
for i in range(n):
if m[i]%2 !=0: #判断哪个小朋友手里的糖果是奇数
ans+=1 #老师补发糖果+1
m[i]+=1
print(ans)