課時8:了不起的分支和迴圈2

那是個好男孩發表於2018-07-27

目錄:
一、課堂小練習

二、"懸掛else"

三、條件表示式(三元操作符)

四、斷言

五、課時08課後習題及答案

 

******************

一、課堂小練習

******************

現在來考考大家,按照100分制,90分以上成績為A,80到90為B,60到80為C,60以下為D,寫一個程式,當使用者輸入分數,自動轉換為ABCD的形式列印。

#p4_1.py
score = int(input('請輸入一個分數:'))
if 100 >= score >= 90:
    print('A')
if 90 > score >= 80:
    print('B')
if 80 > score >= 60:
    print('C')
if 60 > score >= 0:
    print('D')
if score < 0 or score > 100:
    print('輸入錯誤!')
#p4_2.py
score = int(input('請輸入您的分數:')) if 100 >= score >= 90: print('A') else: if 90 > score >= 80: print('B') else: if 80 > score >= 60: print('C') else: if 60 > score >= 0: print('D') else: print('輸入錯誤!')
#p4_3.py
score = int(input('請輸入一個分數:'))
if 100 >= score >= 90:
    print('A')
elif 90 > score >= 80:
    print('B')
elif 80 > score >= 60:
    print('C')
elif 60 > score >= 0:
    print('D')
else:
    print('輸入錯誤!')

結果分析:假如輸入的分數是98,按照第一種方法是第一次就判斷成功,接著列印字母A,但接著會進行第二、三、四、五次判斷,然後這些都不符合,退出程式。若採用第二、三種方法,那麼在第一次判斷成立並列印字母A後,接著不需要再進行任何判斷就推出程式。可見雖然是很簡單的例子,但就輸入98來說,假設第一次判斷會消耗一個CPU的時間,那麼第一種方法比第二和第三種方法多消耗了400%的時間!!!

*****************

二、"懸掛else"

*****************

什麼叫“懸掛else”?
我們舉個例子,初學C語言的朋友可能很容易被以下程式碼欺騙:

if ( hi > 2 )
    if( hi > 7 )
        printf(“好棒!好棒!”);
else
    printf(“切~”);

在這個例子中,雖然else很想和外層的if匹配,但事實上按照C語言的就近匹配原則這個else是屬於內層if的。在Python中強制使用縮排,所以在Python中製造出懸掛else的問題是不可能的。

*********************************

三、條件表示式(三元操作符)

*********************************

有了這個三元操作符的條件表示式,你可以使用一條語句來完成以下的條件判斷和賦值操作:

x, y = 4, 5
if x < y:
    small = x
else:
    small = y

例子可以改進為:

small = x if x < y else y

三元操作符語法:

a = x if 條件 else y (表示當條件為True的時候,a的值賦值為x,否則賦值為y。)

**********

四、斷言

**********

 assert這個關鍵字我們稱之為“斷言”,當這個關鍵字後邊的條件為假的時候,程式自動崩潰並丟擲AssertionError的異常。

舉個例子:

>>> assert 3<4
>>> assert 3>4
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    assert 3>4
AssertionError

一般來說我們可以用Ta在程式中置入檢查點,當需要確保程式中的某個條件一定為真才能讓程式正常工作的話,assert關鍵字就非常有用了。

*******************************

五、課時08課後習題及答案

*******************************

測試題:
0. if not (money < 100): 上邊這行程式碼相當於?
1. assert 的作用是什麼?
2. 假設有 x = 1,y = 2,z = 3,請問如何快速將三個變數的值互相交換?
3. 猜猜 (x < y and [x] or [y])[0] 實現什麼樣的功能?
4. 你聽說過成員資格運算子嗎?

動動手:
0. 視訊中小甲魚使用 if elif else 在大多數情況下效率要比全部使用 if 要高,但根據一般的統計規律,一個班的成績一般服從正態分佈,也就是說平均成績一般集中在 70~80 分之間,因此根據統計規律,我們還可以改進下程式以提高效率。

1. Python 的作者在很長一段時間不肯加入三元操作符就是怕跟C語言一樣搞出國際亂碼大賽,蛋疼的複雜度讓初學者望而生畏,不過,如果你一旦搞清楚了三元操作符的使用技巧,或許一些比較複雜的問題反而迎刃而解。
請將以下程式碼修改為三元操作符實現:

x, y, z = 6, 5, 4
if x < y:
    small = x
    if z < small:
        small = z
elif y < z:
    small = y
else:
    small = z

 

答案:

 

測試題答案:

0. if not (money < 100): 這行程式碼相當於?
if money >= 100:
 
1. assert 的作用是什麼? 
assert這個關鍵字我們稱之為“斷言”,當這個關鍵字後邊的條件為假的時候,程式自動崩潰並丟擲AssertionError的異常。
什麼情況下我們會需要這樣的程式碼呢?當我們在測試程式的時候就很好用,因為與其讓錯誤的條件導致程式今後莫名其妙地崩潰,不如在錯誤條件出現的那一瞬間我們實現“自爆”。
一般來說我們可以用Ta在程式中置入檢查點,當需要確保程式中的某個條件一定為真才能讓程式正常工作的話,assert關鍵字就非常有用了。
 
2. 假設有 x = 1,y = 2,z = 3,請問如何快速將三個變數的值互相交換? 
x, y, z = z, y, x
   
3. 猜猜 (x < y and [x] or [y])[0] 實現什麼樣的功能?
這其實是 Python 的作者還沒有為 Python 加入三元操作符之前,Python 社群的小夥伴們靈活的使用 and 和 or  搭配來實現三元操作符的功能,這裡邊有涉及到列表和切片的知識,這部分知識很快就會講解,迫不及待的朋友可以先稍微預習下。
 
4. 你聽說過成員資格運算子嗎?
Python 有一個成員資格運算子:in,用於檢查一個值是否在序列中,如果在序列中返回 True,否則返回 False。
>>> name = '小甲魚'
>>> '' in name
True
>>> '肥魚' in name
False

 

動動手答案

 

0. 視訊中小甲魚使用 if elif else 在大多數情況下效率要比全部使用 if 要高,但根據一般的統計規律,一個班的成績一般服從正態分佈,也就是說平均成績一般集中在 70~80 分之間,因此根據統計規律,我們還可以改進下程式以提高效率。

 

score = int(input('請輸入一個分數:'))
if 80 > score >= 60:
    print('C')
elif 90 > score >= 80:
    print('B')
elif 60 > score >= 0:
    print('D')
elif 100 >= score >= 90:
    print('A')
else:
    print('輸入錯誤!')
複製程式碼

 

1. Python 的作者在很長一段時間不肯加入三元操作符就是怕跟C語言一樣搞出國際亂碼大賽,蛋疼的複雜度讓初學者望而生畏,不過,如果你一旦搞清楚了三元操作符的使用技巧,或許一些比較複雜的問題反而迎刃而解。

small = x if (x < y and x < z) else (y if y < z else z)

 

相關文章