- 有了合适的数据类型和数据结构之后,还要依赖于选择和循环结构来实现特定的业务逻辑。
- 一个完整的选择结构或循环结构可以看作是一个大的"语句",从这个角度来讲,程序中的多条"语句"是顺序执行的。
4.1 条件表达式
- 算术运算符:+、-、、/、//(整除)、%(求余)、*(乘方)。
- 关系运算符:>、<、==、<=、>=、!=、可以连续使用,如:
>>> 1<2<3 #等价于1<2 and 2<3
True
注意:关系运算符"==" (比较对象是否相等) VS 赋值运算符"="(c=a+b,将a+b的运算结果赋值给c。)
- 条件表达式中不允许使用赋值运算符
>>> if a=3:
SyntaxError: invalid syntax
>>> if(a=3) and(b=4):
SyntaxError: invalid syntax
- 逻辑运算符:and、or、not,注意短路求值(and,or可以大幅度提高程序的运行效率,减少不必要的计算与判断)
>>> 3>4 and 4<5
False
>>> 3<4 or 4<5
True
>>> 3 and 5
5
>>> 0 and 5
0
>>> 0 or 5
5
>>> not 3
False
>>> not 0
True
- 条件表达式:空列表、空元组、空集合、空字典、空字符串、空range对象或其他迭代对象<————>false
>>> if 3: #使用整数作为条件表达式
print(5)
5
>>> a = [1,2,3]
>>> if a: #使用列表作为条件表达式
print(a)
[1, 2, 3]
>>> a = []
>>> if a:
print(a)
else:
print('empty')
empty
- 使用关系表达式作为条件表达式:
使用while语句循环:
>>> i = s = 0
>>> while i <= 10:
s += i
i += 1
>>> print(s)
55
使用for语句循环,i在range()里面遍历:
>>> s = 0
>>> for i in range(0,11,1):
s += i
>>> print(s)
55
- 使用常量True作为条件表达式:
>>> i = s =0
>>> while True:
s += i
i += 1
if i>10:
break
>>> print(s)
55
注意:s += i <——> s = s+i、i += 1 <——>i = i+1
4.2 选择结构
- 常见的选择结构有* 单分支选择结构、双分支选择结构、多分支选择结构以及嵌套的分支结构等 *。
- 循环结构和异常处理结构也可以带有"else"子句,可以看作是特殊形式的选择结构。
4.2.1 单分支选择结构
语法:
if 表达式:
语句块
条件表达式是否成立??----->是----->语句块------->输出
------>否------>输出
>>> x=input('Input two number:')
Input two number:8 1
>>> a,b=map(int,x.split())
>>> if a>b:
a,b=b,a
>>> print(a,b)
1 8
4.2.2 双分支选择结构
语法:
if 表达式:
语句块1
else:
语句块2
条件表达式是否成立??----->是----->语句块1------->输出
----->否----->语句块2------->输出
>>> chTest = ['1','2','3','4','5']
>>> if chTest:
print(chTest)
else:
print('Empty')
['1', '2', '3', '4', '5']
-
Python还支持如下形式的表达式:
value1 if condition else value2
当条件表达式condition的值与True等价时,表达式的值为value1,否则表达式的值为value2.另外,在value1和value2中还可以使用复杂表达式,包括函数调用和基本输出语句。
>>> a=5
>>> print(6) if a>3 else print(5)
6
>>> print(6 if a>3 else 5)
6
>>> b =6 if a>13 else 9
>>> b
9
4.2.3 多分支选择结构
- 语法:
if 表达式1:
语句块1
elif 表达式2:
语句块2
elif 表达式3:
语句块3
......
else:
语句块n
#其中,关键字elif是else if 的缩写。
- 问题解决:使用多分支选择结构将成绩从百分制变换到等级制。
>>> def func(score):
if score > 100 or score <0:
return 'wrong score.must between 0 and 100.'
elif score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
elif score >= 60:
return 'D'
else:
return 'E'
>>> func(80)
'B'
>>> func(50)
'E'
4.2.4 选择结构的嵌套
注意:缩进必须要正确并且一致。
- 问题解决:输入百分制分数,将百分制转换成等级制:90以上A 80至90 B 70至80 C 60至70 D其余是 E。
>>> def func(score):
degree='DCBAAE'
if score >100 or score < 0:
return 'wrong score.must between 0 and 100'
else:
index=(score-60)//10
if index >=0:
return degree[index]
else:
return degree[-1]
>>> func(80)
'B'
>>> func(50)
'E'
4.3 循环结构
- Python主要有for循环和while循环两种形式的循环结构,多个循环可以嵌套使用,并且还经常和选择结构嵌套使用来实现复杂的业务逻辑。
- while循环一般用于循环次数难以提前确定的情况,当然也可以用于循环次数确定的情况;
- for循环一般用于循环次数可以提前确定的情况,尤其适用于枚举或遍历序列或迭代对象中元素的场合。
- 对于带有else子句的循环结构,如果循环因为条件表达式不成立或序列遍历结束而自然结束时则执行else结构中的语句,如果循环时因为执行了break语句而导致循环提前结束则不会执行else中的语句。
4.3.1 for循环与while循环
-
语法:
- 问题解决:输出1~100之间能被7整除但不能同时被5整除的所有整数。
思路:满足的条件: i%7 == 0 and i%5 != 0
(1)for循环:
>>> aList=[]
>>> for i in range(1,101):
if (i%7==0 and i%5!=0):
aList.append(i)
>>> print(aList)
[7, 14, 21, 28, 42, 49, 56, 63, 77, 84, 91, 98]
(2)while循环:
>>> aList=[]
>>> i=1
>>> while i<=100:
if (i%7==0 and i%5!=0):
aList.append(i)
i=i+1
else:
i=i+1
>>> print(i)
101
>>> print(aList)
[7, 14, 21, 28, 42, 49, 56, 63, 77, 84, 91, 98]
- 问题解决:计算1+2+3+...+99+100的结果。
(1)for 循环:
>>> i=1
>>> sum=0
>>> for i in range(1,101):
sum+=i
i+=1
>>> print(sum)
5050
(2)while循环:条件表达式也可以变为:i <=100
>>> i=1
>>> sum=0
>>> while i<101:
sum+=i
i+=1
>>> print(sum)
5050
4.3.2 break与continue语句
- 一旦break语句被执行,将使得break语句所属层次的循环提前结束;
>>> var = 10
>>> while var >0:
var =var-1
if var == 5:break
print('Current variable value:',var)
print('Good Bye!')
Current variable value: 9
Good Bye!
Current variable value: 8
Good Bye!
Current variable value: 7
Good Bye!
Current variable value: 6
Good Bye!
- continue语句的作用时提前结束本次循环,忽略continue之后的所有语句,提前进入下一次循环。
>>> var = 10
>>> while var >0:
var =var-1
if var == 5:continue
print('Current variable value:',var)
print('Good Bye!')
Current variable value: 9
Good Bye!
Current variable value: 8
Good Bye!
Current variable value: 7
Good Bye!
Current variable value: 6
Good Bye!
Current variable value: 4
Good Bye!
Current variable value: 3
Good Bye!
Current variable value: 2
Good Bye!
Current variable value: 1
Good Bye!
Current variable value: 0
Good Bye!
4.3.3 案例精选
-
输出"水仙花数"。所谓水仙花数是指1个3位的十进制数,其各位数字的立方和等于该数分身。例如:153是水仙花数,因为
(1)用户随便输入一个数进行判断:
>>> x=input("请输入一个自然三位数:")
请输入一个自然三位数:153
>>> a=int(x)//100
>>> b=(int(x)-a*100)//10
>>> c=int(x)-a*100-b*10
>>> if a*a*a+b*b*b+c*c*c == int(x):
print('你输入的数为水仙花数!')
else:
print('对不起,再猜一次吧!')
你输入的数为水仙花数!
(2)使用for循环,这个最容易想到:
>>> aList=[]
>>> for x in range(100,1000):
a=int(x)//100
b=(int(x)-a*100)//10
c=int(x)-a*100-b*10
if a*a*a+b*b*b+c*c*c == x:
aList.append(x)
>>> print(aList)
[153, 370, 371, 407]
(3)使用while循环,我自己没有想到,参考的网上的博客:
i=100
>>> while i>99 and i < 1000:
a=int(i)//100
b=(int(i)-a*100)//10
c=int(i)-a*100-b*10
num=a**3+b**3+c**3
if num==i:
print(i)
i+=1
153
370
371
407
作业
- 尝试多种方法编程计算1+2+3+...+100的值。
除了上面的两个常规方法,还有一种方式,但是现在还没学过。
>>> import functools
>>> import operator
>>> print(functools.reduce(operator.add,list(range(1,101))))
5050