第四章 选择与循环

  • 有了合适的数据类型和数据结构之后,还要依赖于选择和循环结构来实现特定的业务逻辑。
  • 一个完整的选择结构或循环结构可以看作是一个大的"语句",从这个角度来讲,程序中的多条"语句"是顺序执行的。

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,320评论 0 2
  • Swift 提供了类似 C 语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行...
    穷人家的孩纸阅读 690评论 1 1
  • [The Swift Programming Language 中文版]本页包含内容: Swift提供了多种流程控...
    风林山火阅读 551评论 0 0
  • 周文帝建兴四年,周夏交战。交州节度使杜俊乘机叛乱,叛军共三十余万,且多有大象。叛军连下钦廉二州,大肆掠夺杀获。叛兵...
    阿周那黑天阅读 182评论 0 0
  • 给自己定的目标的最后一天,每天强迫自己输入和输出,向前走还有可能走出一片艳阳天。回想自己这些天,和原来不一样的...
    萌语心晴阅读 343评论 0 3