Python全棧工程師 (exercises)


# 1:給定一個數,判斷他是正數,負數,還是0
a = int(input("請輸入一該個整數"))
if a == 0:
    print(a, "是0")
elif a > 0:
    print(a, "是正數")
else:
    print(a, "是負數")

# 練習2:輸入一個季度的數字 輸出該季度有那幾個月
b = int(input("請輸入一個季度:1.春季2.夏季3.秋季4.冬季"))
if b > 4:
    print(b, "不是季節")
elif b < 0:
    print(b, "不是季節")
else:
    if b == 1:
        print(b, "春季有:一月,二月,三月")
    elif b == 2:
        print(b, "夏季有:四月,五月,六月")
    elif b == 3:
        print(b, "秋季有:七月,八月,九月")
    else:
        print(b, "冬季有:十月,十一月,十二月")

# 聯系3:輸入一個月份 輸出這個月份在那個季度
c = int(input("請輸入一個月份判斷在那個季度"))
if c < 0:
    print(c, "不是月份")
elif c > 12:
        print(c, "不是月份")
elif c < 4:
    print(c, "在春季")
elif c < 7:
    print(c, "在夏季")
elif c < 10:
    print(c, "在秋季")
elif c <= 12:
    print(c, "在冬季")
    
# 練習4:3公里內10元 超出1.9元/公里  超過15公里 每公里加50%回空費 3.15元/公里
# 輸入公里  打印車費


d = int(input("請輸入行駛公里數:"))
if d <= 3:
    print("車費:10元")
elif d > 4:
    if d < 15:
        g = (d - 3) * 1.9 + 10
        print(d, "公里:", g, "")
    else:
        f = (d - 15) * 3.15 * 1.5 + 12 * 1.9 + 10
        print(d, "公里:", f, "")
elif d < 0:
    print("公里數輸入錯誤")


練習:
  1. 一個商店賣西瓜,7元一個,您帶20元錢能買到幾個西瓜? 剩多少元?
  2. 一個學生畢業薪資10000元,每個漲薪 20%,請問十年后這個學生的薪資是多少?

1. 打印如下圖形:
   *******
   *     *
   *     *
   *******
2. 已知矩形的長邊長為6cm,短邊長為4cm,用表達式求
    1) 周長是多少?
    2) 面積是多少?


練習:
  1. 指定一個圓的半徑是r = 9cm
    1) 計算圓的周長
    2) 計算圓的面積

  2. 交量交換練習:
     已知有兩個變量:
       a 綁定 10000
       b 綁定 20000
     問,在不創建任何新數據對象的情況下,如何讓a 和 b 交換綁定的對象
     a = 10000
     b = 20000
     ....
     print(a)  # 20000
     print(b)  # 10000


練習:
  1. 中國古代的秤是16兩一斤,請問古代對216兩是古代的幾斤幾兩,寫程序打印出來?

  2. 從凌晨 0:0:0 計時,到現在已經過了63320秒,
    請問現在是幾時,幾分,幾秒,寫程序打印出來
  提示:
    可以用地板除和求余實現

  3. 溫度轉換:
    攝氏溫度 = 5.0/9.0*(華氏溫度-32)

    請問100華氏溫度是多少攝氏溫度.寫程序算出來
    思考:
      如果知道當前溫度是攝氏溫度度,能否算出華氏溫度是多少?


練習:
  將數字3.14 用變量pi綁定
  將pi變量轉為整數,用變量i綁定
  將 pi 變量 與 i變量相減,結果用f變量綁定
    1. 判斷f是否等於 0.14? 為什么?
    2. 刪除所有的變量
    (用交互模式來實現)


練習:
  1. 輸入兩個整數, 分別用變量x, y綁定
    1) 計算這兩個數的和,並打印結果
    2) 計算這兩個數的積,並打印結果
    3) 計算x的y次方並打印結果
    如:
      請輸入x: 10
      請輸入y: 20
    打印如下:
      10 + 20 = 30
      10 * 20 = 200
      10 ** 20 = ...
  2. 今天是小明20周歲的生日,假設每年有365天,計算它過了多少個星期天,余多少天
  3. 分三次輸入當前的小時,分鍾和秒數,在終端打印時此距離凌晨0:0:0 秒過了多少秒

練習:
  任意輸入一個數
    1) 判斷這個數是否大於100
    2) 判斷這個數是否小於0
    3)判斷這個數是否在80~100之間


練習:
  1. 輸入一個季度 1~4的整數.輸出這個季度有哪兒幾個月,如果輸入的不是1~4的整數,則提示用戶您輸錯了

  2. 輸入一年中的月份(1~12) 輸出這個月在哪兒個季度,如果輸入的是其它數,則提示您輸錯了


思考:
  score = input('請輸入學生成績:') or '0'
  score = int(score)
  請問這個or是在做什么?

練習:
  1. 北京出租車計價:
    收費標准:
      3公里以內收費13元
      基本單價: 2.3元/公里 (超出3公里以外)
      空駛費:超過15公里后,每公里加收單價的50%的空駛費(即3.45元/公里)
    要求:
      輸入公里數,打印出費用金額(以元為單位四舍五入)
  2. 輸入一個學生的三科成績(三個整數):
    打印出最高分是多少?
    打印出最低分是多少?
    打印出平均分是多少?
  3. BMI指數(Body Mass Index) 以稱身體質量指數
     BMI值計算公式:
        BMI = 體重(公斤) / 身高的平方(米)
     例如:
       一個人69公斤,身高是173公分
       BMI = 69 / 1.73**2 = 23.05
    標准表:
      BMI < 18.5   體重過輕
      18.5 <= BMI < 24 體重正常
      BMI > 24  體重過重
    要求: 輸入身高的體重,打印出BMI的值並打印體重狀況


思考:
  如果一個字符串同時包含如下字符該怎么辦?
     '   "  '''  """ 

練習:
  試求出以下字符串含有多少個字符?
  '1234abcd'  # 8
  '5\'4"'     # 4
  '\"A\x34\U00006041'  # 4
  '\b\n\td\r'
  '\\nn\\x41'

練習:
  寫一個程序,打印一個高度為4行的矩形方框
    要求輸入一個整形數字,此整數代表矩形的寬度,輸出此矩形
  如:
    請輸入矩形寬度: 10
    ##########
    #        #
    #        #
    ##########
    請輸入矩形寬度: 5
    #####
    #      #
    #      #
    #####


練習:
  輸入一個字符串,打印如下內容:
    1. 打印這個字符串的第一個字符
    2. 打印這個字符串的最后一個字符
    3. 如果這個字符串的長度是奇數,打印中間這個字符
    注:
      求字符串的長度的函數len(s)


練習:
  1. 寫一個程序,輸入一個字符串,把字符串的第一個字符和最后一個字符去掉后,打印出處理后的字符串

  2. 輸入任意一個字符串,判斷這個字符串是否是回文
    回文示例:
      上海自來水來自海上
      ABCCBA
      12321
    (回文是指中心對稱的文字)


練習:
  1. 寫一個程序,輸入一段字符串,如果字符串不為空,把第一個字符的編碼值打印出來
  2. 寫一個程序,輸入一個整數值(0~65535), 打印出這個數值所對應的字符

練習:
  1. 輸入一個字符串用變量s綁定
     1) 判斷您輸入的字符串有幾個空格
     2) 將原字符串的左右空白字符去掉, 打印出剩余的字符個數
     3)判斷您輸入的是否是數字
     4) 如果是數字,判斷這個數字是否大於100
  2. 輸入三行文字,讓這三行文字在一個方框內居中顯示
     如輸入:
       hello!
       I'm studing python!
       I like python
    顯示如下
      +---------------------+
      |       hello!        |
      | I'm studing python! |
      |    I like python    |
      +---------------------+
    注:請不要輸入中文


練習:
  輸入三行文字,讓這三行文字依次以20個字符的寬度右對齊輸出
  如:
    請輸入第1行: hello world
    請輸入第2行: aaa
    請輸入第3行: ABCDEFG
  輸出結果如下:
            hello world
                    aaa
                ABCDEFG

  做完上面的題后思考:
     能否以最長的字符串的長度進行右對齊顯示(左側填充空格)


問題:
  輸入一個整數n, 寫程序打印如下:
     這是第 1 行
     這是第 2 行
     這是第 3 行
     ...
     這是第 n 行
  問題:
    如何讓一條語句重復執行多次?
    用:
      print("這是第", i, '行')  
    能否實現


練習:
  1. 輸入一行字符串,將字符串中Unicode編碼值最大的一個字符打印出來(不允許用max函數)
    (提示: while語句內可以嵌入 if 語句進行判斷)

  2. 打印 從零開始的浮點數,每個數增加 0.5, 打印出10以內的這樣的數:
     0.0
     0.5
     1.0
     1.5
     ...
     9.5


練習:
1. 打印 1 ~ 20的整數

2. 打印從10開始 到 0(不包含0)之間的整數

3. 打印 1 ~ 20的整數,打印在一行內

4. 打印 1 ~ 20的整數,每行打印5個,打印四行如:
  1 2 3 4 5
  6 7 8 9 10
  11 12 .....
  .....
  提示: while中可以嵌入if語句來換行

5. 輸入一個整數n, 打印出一個長方形
   n 代表長方形的寬度的字符數和高的行數
   例如:
     請輸入:4
    打印:
      ####
      #  #
      #  #
      ####
     請輸入:6
    打印:
      ######
      #    #
      #    #
      #    #
      #    #
      ######

練習:
  輸入一個數,打印指定寬度的正方形
  如:
    輸入: 5
  打印如下正方形:
    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
  如:
    輸入: 3
  打印如下正方形:
    1 2 3
    1 2 3
    1 2 3



練習:
  1. 寫程序,計算:
    1 + 2 + 3 + 4 + ..... + 99 + 100的和

  2. 寫程序,任意輸入一個數n,計算:
    1 + 2 + 3 + 4 + ..... + (n-1) + n的和

  問題:
    如果在循環過程中不想再繼續此循環語句的執行了,怎么辦?


練習:
  1. 任意輸入一些數,當輸入負數時結束輸入
    當輸入完成后,打印您輸入的這些數的和是多少?

  2. 寫程序求:
    Sn = 1 + 1/2 + 1/4 + 1/8 + .... + 1/(2**n)
    求當n等同於100時,sn的值是多少?
  3. 用while語句實現打印三角形,輸入一個整數,表示三角形的寬度和高度,打印出相應的直角三角形:
    如:
      請輸入三角形的寬度: 4
      1) 打印如下:
        *
        **
        ***
        ****
      2) 打印如下:
           *
          **
         ***
        ****
      3) 打印如下:
        ****
         ***
          **
           *
      4) 打印如下:
        ****
        ***
        **
        *

練習:
  任意輸入一段字符串
    1) 計算您輸入的字符'A' 的個數,並打印出來
    2) 計算出空格的個數,並打印出來
      (要求用for語句,不允許使用, S.count方法)

  思考用while語句能否實現上述功能

練習:
  用for 語句打印1~20 打印在一行內


練習:
  求 100以內有哪兒些整數與自身+1的乘積再對11求余的結果等於8?

      x * (x+1) % 11 == 8  x附合條件

  1. 寫程序計算  1 + 3 + 5 + 7 + ...+ 99的和
    (要求用for語句和while語句兩種方式實現)

  2. 用while語句實現打印:
     1 3 5 7 9. .... 19 
     打印在一行內

  3. 將上題用for語句來實現

練習:
  用for 語句實現下題 :
    1. 輸入一個數w代表正方形的寬度,打印如下正方形:
      如輸入:5
        1 2 3 4 5
        1 2 3 4 5
        1 2 3 4 5
        1 2 3 4 5
        1 2 3 4 5
    2. 寫程序來改寫上題:
      如輸入: 5
      打印如下:
        1 2 3 4 5
        2 3 4 5 6
        3 4 5 6 7
        4 5 6 7 8
        5 6 7 8 9
      如輸入: 3
      打印如下:
        1 2 3
        2 3 4
        3 4 5

練習:
  1. 輸入一個整數用begin綁定,
  再輸入一個整數用end綁定
  打印從begin開始,到end結束內的全部奇數(不包含end)

  2. 將上述練習改寫為 用while語句實現

  3. 求 1~100 之間所有不被 5, 7, 11 整除的數的和
    (可以考慮用continue實現)


練習:
  1 輸入三行文字,將這三行文字, 保存於一個列表L中,並打印
    如:
      請輸入: abc<回車>
      請輸入: 123<回車>
      請輸入: 你好<回車>
    生成列表如下:
      L = ['abc', '123', '你好']
      print(L)  打印

練習:
  1. 輸入任意行文字,存於列表L中,當不輸入任何內容直接回車后結束輸入
   1) 打印L列表中的內容
   2) 計算您共輸入了幾行內容
   3) 計算您共輸入了多少個字符

  2. 輸入一個整數(代表樹干的高度)
     打印出如下一棵樹
     輸入: 2
     打印:
      *
     ***
      *
      *
     輸入:3
       *
      ***
     *****
       *
       *
       *
  3. 寫一個程序,任意輸入一個整數,判斷這個數是否是素數(prime)
    素數(也叫質數), 是只能被1和自身整除的正整數:
      如: 2 3 5 7 11 等
    提示:
      用排除法: 當判斷x是否是素數是,只要讓x分別除以:
        2, 3, 4, 5, .... x-1, 只要整除了,那x不是素數,否則x是素數
  4.算出100~1000以內的水仙化數(Naricissistic Number)
    水仙花數是指百位的3次方 加上 十位的3次方 加上 個位的3次方等於原數的數
    如:
      153 = 1**3 + 5**3 + 3**3
    答案:
      153, 370, ....

練習:
  已知有列表:
    L = [3, 5]

    1) 用索引和切片等操作,將原列表改變為:
    L = [1, 2, 3, 4, 5, 6]
    
    2) 將列表反轉,刪除最后一個元素后打印此列表
       ...
       print(L)  # [6, 5, 4, 3, 2]


練習:
  1. 寫程序,讓用戶輸入一些整數,當輸入-1時結束輸入,將這些數存於列表L中
    1)  打印用戶共輸入了幾個數?
    2)  打印您輸入的數的最大數是多少
    3)  打印您輸入的數的最小數是多少
    4)  打印您輸入的這些數的平均值是多少?

練習:
  輸入多行文字,存入列表中,
  每次輸入回車后算一行
    任意輸入多行,當輸入回車(即輸入空行時結束輸入)
  1) 按原輸入內容在屏幕上輸出內容
  2) 打印出您共輸入了多少行文字
  3) 打印出您共輸入了多少個字符

練習:
  1. 有字符串"hello"
    請用此字符串生成:
      'h e l l o' 和 'h-e-l-l-o'
    答案:
      s = "hello"
      a = ' '.join(s)  # a = 'h e l l o'
      b = '-'.join(s)  # b = 'h-e-l-l-o'

  2. 寫一個程序,讓用戶輸入很多正整數,當輸入小於零的數時結束輸入,
    1) 打印這些數中最大的一個數
    2) 打印這些數中第二大的一個數
    3) 刪除最小的一個數
    4) 打印剩余數的和

練習:
  用列表推導式生成1~100內奇數的列表
  結果是: [1, 3, 5, 7, ..... 99]

  L = [x for x in range(1, 100, 2)]

  示例:
    生成1~00內的奇數的列表:
  L = [x for x in range(1, 100) if x % 2 == 1]

練習:
  生成一個數值為 1 ~ 9的平方的列表,去掉所有的奇數的平方
    L = [x**2 for x in range(1, 10)]

    # L = [4, 16, 36, 64]


練習:
  1. 已知有一個字符串
     s = '100,200,300,500,800'
     將其轉化為整數的列表存於L列表中
     L = [100, 200, 300, 500, 800]

  2. 生成前40個斐波那契數(Fibonacci)
      1  1  2  3  5  8  13  .....
      要求將這些數保存在列表中
      打印這些數

  3. 有一些數存於列表中:
    L = [1, 3, 2, 1, 6, 4, 2, ..... 98, 82]
    將列表中出現的數字存入到另一個列表L2中
      要求: 重復出現多次的數字在L2列表中只保留一份(去重)

寫程序,實現以下要求:
  1) 將如下數據形成一個字典seasons:
    '鍵'    '值'
     1      '春季有1, 2, 3月'
     2      '夏季有4, 5, 6月'
     3      '秋季有7, 8, 9月'
     4      '冬季有10,11,12月'
  2) 讓用戶輸入一個整數,代表一個季度,打印這個季度對應的信息,如果用戶輸入的信息不在字典內,則打印信息不存在

練習:
  輸入一段字符串,打印出這個字符串中出現過的字符的出現次數
  如:
    輸入:
      abcdabcaba
    打印:
      a: 4次
      b: 3次
      d: 1次
      c: 2次
    注:
       不要求打印的順序

練習:
  有字符串的列表如下:
    L = ['tarena', 'xiaozhang', 'tyke']
    用上述列表生成如下字典:
      d = {'tarena': 6, 'xiaozhang': 9, 'tyke':4}
    注:
      字典的值為鍵的長度

練習:
  1. 已知有兩個等長的列表 list1  和 list2
  以list1中的元素為鍵,以list2中的元素為值,生成相應的字典
  list1 = [1001, 1002, 1003, 1004]
  list2 = ['Tom', 'Jerry', 'Spike', 'Tyke']
  生成的字典為:
    {1001: 'Tom', 1002:'Jerry', .....}

  2. 輸入任意個學生的姓名,年齡,成績,每個學生的信息存入字典中,然后放入至列表中,每個學生的信息需要手動輸入
  當輸入姓名為空時結束輸入:
    如:
      請輸入姓名:  xiaozhang
      請輸入年齡:  20
      請輸入成績:  100
      請輸入姓名:  xiaoli
      請輸入年齡:  18
      請輸入成績:  98
      請輸入姓名:  <回車> 結束輸入
    要求內部存儲格式如下:
    [{'name':'xiaozhang', 'age':20, 'score':100}, 
     {'name':'xiaoli', 'age':18, 'score':98}]
    打印所有學生的信息如下:
    +---------------+----------+----------+
    |     name      |   age    |   score  |
    +---------------+----------+----------+
    |   xiaozhang   |    20    |   100    |
    |     xiaoli    |    18    |    98    |
    +---------------+----------+----------+

集合練習:
  經理有: 曹操,劉備,孫權
  技術員有: 曹操,孫權,張飛,關羽
  用集合求:
    1) 即是經理,也是技術員的有誰?
    2) 是經理,但不是技術員的人員都有誰?
    3) 是技術員,不是經理的都有誰
    4) 張飛是經理嗎?
    5) 身兼一職的人都有誰?
    6) 經理和技術員共有幾個人?

練習:
  任意輸入一些數字,存於列表L中。當輸入負數時結束輸入
  1) 打印這些數的和 
  2) 打印這些數有多少種(去重)
  3) 除重復的數字后,打印這些剩余數字的和

  提示,可以用集合去重

練習:
  1. 寫一個函數myadd, 此函數中的參數列表里有兩個參數x, y
    此函數的功能是打印 x + y 的和

    def myadd(....):
        ....  # 注: .... 部是是我們要填寫代碼的地方

    myadd(100, 200)  # 300
    print("ABC", "123")  # ABC123

  2. 寫一個函數 mysum, 傳入一個參數x代表終止整數,
     打印出 1 + 2 + 3 + 4 + ..... + x的和
    def mysum(x):
        ....

    mysum(100)  # 5050
    mysum(4)   # 10





return 語句
  語法:
    return [表達式]
    注: []  代表可省略
  作用:
    用於函數中,結束當前函數的執行,返回到調用該函數的地方,同時返回一個對象的引用關系

  return 語句說明
    1. return 語句后跟的表達式可以省略,省略后相 當於return None
    2. 如果函數內沒有return 語句,則函數執行完最后一條語句后返回None(相當於在最后加了一條return None語句)
  示例見:
    return.py


練習:
  1. 寫一個函數 mymax, 給函數傳遞兩個參數,返回兩個實參中最大的一個
    def mymax(a, b):
         ....

    v = mymax(100, 200)
    print('v =', v)  # v = 200
    print(mymax('ABC', 'abc'))  # abc

  2. 寫一個函數 input_number
      def input_number():
          ....

      此函數用來獲取用戶循環輸入的整數,當用戶輸入負數時結束輸入。將用戶輸入的數字以列表的形式返回,再用內建函數max, min, sum取出戶輸入的最大值,最小值及和

      L = input_number()
      print(L)  # 打印此列表
      print("用戶輸入的最大數是:", max(L))
      print("用戶輸入的最小數是:", min(L))
      print("用戶輸入的數的和是:", sum(L))


練習:
   1. 寫一個函數 print_odd, 打印從begin開始,到end結束(不包含end)內的全部的奇數
      def print_odd(begin, end):
          ....

      print_odd(1, 10)  # 打印 1 3 5 7 9d
      ptint_odd(10, 20) # 打印 11 13 15 17 19

   2. 定義兩個函數:
      sum3(a, b, c) 用於返回三個數的和
      pow3(x)  用於返回x的三次方
      用以上函數計算:
        1. 計算1的立方 + 2的立方 + 3的立方的和
          即:  1**3 + 2**3 + 3**3的和 
        2. 計算1 + 2 + 3 的和的立方,
          即:(1+2+3)**3

  3. 改寫之前的學生信息管理程序
     改為兩個函數:
       1. 寫一個函數 input_student() 用於返回學生信息的字典的列表(以前格式一樣)
       2. 寫一個函數 output_student(lst)
         此函數傳入一個列表lst,即字典的列表
         此函數把lst的內容以表格形式打印出來
      def input_student():
           ....

      def output_student(lst):
           ...

      L = input_student()  # 獲取學生信息的列表
      output_student(L)  # 把L 以列表的形式打印 

練習:
  寫一個函數minmax(a, b, c)  有三個參數,這回這三個參數中的最小值和最大值,
  要求,形成元組,最小值在前,最大值在后,如:

  def minmax(a, b, c):
      ...

  t = minmax(11, 33, 22)
  print(t)  # (11, 33)  # <<< 打印元組
  xiao, da = minmax(6, 5, 4)
  print('最小值:', xiao, '最大值:', da)

練習:
  寫一個函數 myadd, 此函數可以計算兩個數的和,也可以計算三個數的和

  def myadd(......):
     ....
  print(myadd(10, 20))  # 30
  print(myadd(100, 200, 300))  # 600

  2. 寫一個函數,print_odd, 此函數可以傳遞一個實參,也可以傳遞兩個實參,當傳遞一個實參時代表結束值
  當傳遞兩個實參時,第一個實參代表起始值,第二個實參代表結束值
     打印出以此區間內的全部奇數,不包含結束數:

  print_odd(10)  # 1 3 5 7 9
  print_odd(11, 20)  # 11 13 15 17 19     

練習:
  寫一個函數, mysum可以傳入任意個實參的數字,返回所有實參的和

  def mysum(*args):
     ...
  print(mysum(1, 2, 3, 4))  # 10
  print(mysum(10, 20, 30))  # 60

練習:
  寫一個函數,mymax類似於 內鍵的函數max
    詳見:
      >>> help(max)
   仿造 max 寫一信mymax函數,功能與max完全相同
   (要求不允許調用max函數)
   print(mymax([6, 8, 3, 5]))  # 8
   print(mymax(100, 200))  # 200
   print(mymax(1, 3, 5, 9, 7))  # 9


思考題:
  查看 >>>help(print)猜想print函烽的參數列表 是如何定義的?

練習:
  創建一個全局變量 L = []
  寫一個函數:
    def input_number():
        ....
    此函數每次調用將從鍵盤讀入一些數字追加到列表L中 

  如:
    L = []
    def input_number():
        ....
    input_number()
    print(L)  # [ .... 這些是您從鍵盤輸入的數..]







練習:
  1. 寫一個函數isprime(x) 判斷x是否為素數。如果是素數,返回True,否則返回False

  2. 寫一個函數prime_m2n(m, n) 返回從m開始,到n結束(不包含n)范圍內的素數,返回這些素數的列表並打印
    如:
      L = prime_m2n(5, 10)
      print(L)  [5, 7]

  3. 寫一個函數pimes(n) 返回小於n的全部素數的列表,並打印這些素數
    如:
      L = primes(10)
      print(L)  # [2, 3, 5, 7]
    1) 打印100 以內的全部素數
    2) 打印200 以內的全部素數的和
  
  4. 編寫函數 fn(n) 此函數返回下列級數的和:
      fn(n) = 1/(1*2) + 1/(2*3) + .... 
      + 1/(n*(n-1)) 的和

    print(fn(100))


練習:
  寫一個計算公式的解釋執行器
    已知有如下一些函數:
        def myadd(x, y):
            return x + y
        def mysub(x, y):
            return x - y
        def mymul(x, y):
            return x * y
    寫一個函數,傳入字符串,返回相應的函數
        def get_op(s):
            # 此函數根據字符串來返回相應的函數.
            # 如果傳入字符串"加" 則返回myadd函數
            # ....        '乘',則返回mymul函數
            ... 此處自己實現 
    主程序如下:
        while True:
          s = input("請輸入計算公式: ")# 10 加 20
          L = s.split()
          a = int(L[0])
          b = int(L[2])
          fn = get_op(L[1])
          print("結果是:", fn(a, b))  # 30
練習:
  寫一個函數叫hello(name),部分代碼如下:
  count = 0
  def hello(name):
      print('你好', name)
      ... 此處代碼省略,需要同學們自己填寫
      ... 此處代碼需要改變全局變量來記錄此函數曾經被調用過多少次.
  
  hello('小張')
  hello('小李')
  print('hello 函數被調用', count, '次')  # 2次

練習:
  1. 寫一個lambda 表達式,判斷這個數的2次方+1是否能被5整除,如果能被整除返回True, 否則返回False
     例:
        fa = lambda x: .....
        print(fa(2))  # True
        print(fa(4))  # False

  2. 寫一個lambda表達式,求兩個變量的最大值
     例如:
        def mymax(x, y):
           ...
        mymax = lambda ...
        print(mymax(100, 200))  # 200


練習:
  1. 給出一個整數n,寫一個函數myfac來計算n!(n的階乘)
    n! = 1 * 2 * 3 * 4 * ..... * n
    如:
      print(myfac(5))  # 120
  2. 給出一個整數n,寫一個函數計算myfn(n):
      1 + 2**2 + 3**3 + .... + n**n的和
    如:
      print(myfn(10)) # ???
  3. 完全數:
     1 + 2 + 3 = 6 (6為完全數)
     1,2,3都為6的因數(因數是能被一個數x整除的整數為y,則y為x的因數)
     1 x 6 = 6
     2 x 3 = 6
     完全數是指除自身以外的所有因數相加之和等於自身的數
     求 4~5個完全數並打印出來
     答案:
       6
       28
       496
       ......



4 實現帶有界面的學生信息管理系統
  程序啟動時先彈出操作菜單:
    +-------------------------+
    | 1)  添加學生信息          |
    | 2)  顯示學生信息          |
    | 3)  刪除學生信息          |
    | 4)  修改學生成績          |
    | q)  退出                 |
    +-------------------------+
    請選擇: 1
  要求 :
      每個選擇都要有一個函數來實現


練習:
  1. 用map函數求:
    1**3 + 2**3 + 3 ** 3 + .... 9**3 的和

  2. 用map函數求:
    1**4 + 2**4 + 3 ** 4 + .... 20**4 的和

  提示: sum(map(.....)) 


練習:
  1. 將 1 ~ 20 的偶數用filter生成可迭代對象后將可迭代對象生成的數放入到列表L中

  2. 寫一個函數is_prime(x) 判斷x是否是素數
    用filter函數打印出: 20 ~ 30之間的全部素數


練習:
  names = ['Tom', 'Jerry', 'Spike', 'Tyke']
  排序的依據為字符串的反序:
           'moT'   yrreJ    ekipS    ekyT
  結果:
    ['Spike', 'Tyke', 'Tom', 'Jerry']


練習:
  寫函數 mysum(n)用遞歸方式實現求和
    def mysum(n):
        # 用遞歸方式求和
        ...

    print(mysum(100))  # 5050
    

思考題:
  已知五位朋友在一起
    第五位朋友比第四位朋友大2歲
    第四位朋友比第三位朋友大2歲
    第三位朋友比第二位朋友大2歲
    第二位朋友比第一位朋友大2歲
    第一位朋友說它10歲


練習:
  1. 已知五位朋友在一起
    第五位朋友比第四位朋友大2歲
    第四位朋友比第三位朋友大2歲
    第三位朋友比第二位朋友大2歲
    第二位朋友比第一位朋友大2歲
    第一位朋友說它10歲
    寫程序打印出第五位朋友 和第三位朋友 的年齡
  2. 已知有列表:
    L = [[3, 5, 8], 10, [[13, 14], 15, 18], 20]
    1) 寫一個函數print_list(lst) 打印出所有元素
      print(L)  # 打印 3 5 8 10 13 14 ....
    2) 寫一個函數sum_list(lst) 返回這個列表中所有元素的和
      print(sum_list(L))  # 86
    注:
      type(x) 可以返回一個變量的類型
      如:
         >>> type(20) is int # True
         >>> type([1, 2, 3]) is list # True

  3. 改寫之前的學生信息管理程序
    要求添加四個功能:
      | 5) 按學生成績高-低顯示學生信息 |
      | 6) 按學生成績低-高顯示學生信息 |
      | 7) 按學生年齡高-低顯示學生信息 |
      | 8) 按學生年齡低-高顯示學生信息 |


練習:
  1. 輸入一個圓的半徑,打印出這個圓的面積
  2. 輸入一個圓的面積,打印出這個圓的半徑 

  (要求用math模塊內的函數和數據實現)

練習:
  寫一個程序,輸入你的出生日期,
    1) 算出你已經出生多少天?
    2) 算出你出生的那天是星期幾?


練習:
  1. 請編寫函數fun 其功能是計算下列多項式的和:
    fn = 1 + 1/1! + 1/2! + 1/3! + 1/4! + .. + 1/n!
    (建義用數學模塊的factorial實現)
  求當n 等於100時,fn的值
  看一下fn(100)的值是什么
  2. 寫一個程序,以電子時鍾格式:
    HH:MM:SS格式顯示時間
    要求每隔一秒變化一次

  3 寫函數f(n)求下多項式的和
  fn = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 .... 1/(2*n-1)的和

  求當n取值為1000000時,
    1) 打印 f(1000000) 的值
    2) 打印 f(1000000) * 4的值,看看是什么

練習:
  1. 猜數字游戲
    隨機生成一個 0~100之間的一個整數,用變量x綁定
    讓用戶輸入一個數y,輸出猜數字的結果:
      1) 如果y大於x則提示: "您猜大了"
      2) 如果y小於x則提示: "您猜小了"
      3) 如果y等於生成的數x,則提供示用戶"恭喜您猜對了 "並退出猜數字
    循環重復上述步聚,直到猜對為止。
    猜對了,顯示用戶猜數字的次數,然后退出程序

練習:
  1. 寫一個鬧鍾程序,啟動時設置定時時間,
    到時間后打印一句"時間到...." 然后退出程序

  2. 模擬斗地主發牌,撲克牌共54張
      黑桃('\u2660'), 梅花('\u2663'), 方塊('\u2665'), 紅桃('\u2666')
      A2-10JQK
      大王、小王
    三個人玩,每人發17張牌,底牌留三張
    輸入回車, 打印出第1個人的17張牌
    輸入回車, 打印出第2個人的17張牌
    輸入回車, 打印出第3個人的17張牌
    輸入回車, 打印三張底牌
  3. 修改學生信息管理程序,將原student_info.py 拆分為模塊
    要求:
      1. 主事件循環放在main.py中
      2. show_menu 函數放在menu.py中
      3. 與學生操作相關的函數放在 student_info.py中


練習:
  寫一個函數 get_score() 來獲取學生成績,
    要求用戶輸入 1~100的整數,輸果輸入出現異常,返此函數返回0,
    否則返回用戶輸入的成績
  示例:
    def get_score():
        ...
    score = get_score()
    print("學生的成績是:", score)

python中全部的錯誤類型:
    參見文檔:
      python_base_docs_html/Python全部的異常類型.html

練習:
  寫一個函數 get_age()用來獲取一個人的年齡信息
  此函數規定用戶只能輸入1~140之間的整數,如果用戶輸入其它的數則直接觸發ValueError類型的錯誤通知
     如果用戶輸入的年齡大於140,則觸發
       ValueError("年齡超出了正常值")
     如果用戶輸入的年齡小於1,則觸發
       ValueError("年齡太小...")
  def get_age():
      ...
  try:
      age = get_age()
      print("用戶輸入的年齡是:", age)
  except ValueError as err:
      print('用戶輸入的不是1~140的整數,獲取年齡失敗')
      print("原因是:", err)

練習:
  1. 一個球從100米高空落下,每次落地后反彈高度是原高度的一半,再落下,
     1) 寫程序算出皮球在第10次落地后反彈高度是多高?
     2) 打印出球共經過多少米的路程

  2. 分解質因數, 輸入一個正整數,分解質因數,
    如:
      輸入: 90
    則打印:
      '90=2*3*3*5'
      (質因數是指最小能被原數整除的素數(不包括1))

  3. 修改原學生信息管理程序,加入異常處理語句,讓程序在任何情況下都能夠按邏輯正常執行.
     例如:
       輸入成績和年齡時,如果用戶輸入非法字符串也不會導致程序崩潰
  

練習:
  有一個集合:
    s = {'唐僧', '悟空', '八戒', '沙僧'}
    用 for語句來遍歷所有元素如下:
      for x in s:
          print(x)
      else:
          print('遍歷結束')
    請將上面的for語句改寫為 用while語句和迭代器實現


練習:
  寫一個生成器函數 myeven(start, stop)
  此函數用來生成從 start開始到stop結束(不包含)區間內的一系列偶數
  def myeven(start, stop):
      ....

  evens = list(myeven(10, 20))
  print(evens)  # [10, 12, 14, 16, 18]
  for x in myeven(21, 30):
      print(x)  # 22, 24, 26, 28

  L = [x**2 for x in myeven(3, 10)]
  print(L)  # 16 36 64

練習:
  已知有一個列表L
      L = [2, 3, 5, 7]
    用生成器表達式從此列表中拿到數,生成 列表中數據的平方

    gen = ......  # 此處用生成器表達式實現
    L2 = list(gen)  # L2 = [4, 9, 25, 49]

思考:
   L = [2, 3, 5, 7]
   L2 = [x ** 2 for x in L]  # 列表推導式
   it = iter(L2)
   print(next(it))  # 4
   L[1] = 10
   print(next(it))  # 9

   L = [2, 3, 5, 7]
   G3 = (x ** 2 for x in L)  # 生成器表達式
   it = iter(G3)
   print(next(it))  # 4
   L[1] = 10
   print(next(it))  # 100

練習:
  寫一個程序,讀入任意行的文字,當輸入空行時結束輸入
  打印帶有行號的輸入結果:
    如:
      請輸入: hello<回車>
      請輸入: world<回車>
      請輸入: tarena<回車>
      請輸入: <回車> # 直接回車結束輸入
    輸出如下:
      第1行: hello
      第2行: world
      第3行: tarena

練習:
  寫一個程序,從鍵盤輸入一段字符串存入s變量
    1. 將此字符串轉為字節串用變量b綁定,並打印出b
    2. 打印字符串s的長度和字節串b的長度
    3. 將b字節串再轉換為字符串用變量s2 綁定,判斷 s2 和 s是否相同?



練習:
  1. 寫一個生成器函數primes生成素數,
  此生成器函數為 primes(begin, end)
  如: [x for x in primes(10, 20)] 將得到列表
     [11, 13, 17, 19]
  2. 寫一個生成器函數,生成斐波那契數列的前n個數
     1 1 2 3 5 8 13
      def fibonacci(n):
          ...
          yield...
    1) 輸出前20個數:
      for x in fibonacci(20):
          print(x)
    2) 打印前40個數的和:
       print(sum(fibonacci(40)))
  3. 寫程序打印楊輝三角(只打印6層)
        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1
   1 5 10 10 5 1

練習:
  自己寫一個文件 'info.txt' 內部存一些文字信息
    如:
      張三 20 100
      李四 21 96
      小王 22 98
    寫程序將這些數據讀取出來,打印到終端上

練習:
  1. 寫程序,循環輸入很多個人的姓名,電話號碼,
    當輸入結束后將這些信息存入到文件phonenumber.txt中
    (建議先用列表暫存數據,格式自己定義)

  2. 寫程序,將phonenumber.txt文件中的數據讀取出來.
     再用以下格式打印出來:
      如:
        小張 的電話是 13888888888
        小李 的電話是 13999999999


練習:
  1. 寫程序實現復制文件的功能
    要求:
       1. 要考慮特大文件問題
       2. 要關閉文件
       3. 要能復制二進制文件
    如:
      請輸入源文件路徑名:  /home/tarena/xxx.tar.gz
      請輸入目標文件路徑名: ./a.tar.gz
    顯示:
      文件已成功復制

  2. 修改學生信息管理程序,要求加入兩個功能:
      9)  保存信息到文件(si.txt)
      10) 從文件中讀取數據(si.txt)
    
練習:
  自己寫一個'人'類: Human
  class Human:
      def set_info(self, name, age, address='未知'):
          '''此方法用來給人對象添加'姓名', '年齡', '家庭住址'三個屬性'''
          ...  # << 此處自己實現
      def show_info(self):
          '''顯示此人的全部信息'''
          ... # 此處自己實現
  如:
    h1 = Human()
    h1.set_info('小張', 20, '北京市朝陽區')
    h2 = Human()
    h2.set_info('小李', 18)
    h1.show_info()  # 小張今年 20 歲,家庭住址:北京市朝陽區
    h2.show_info()  # 小李今年 18 歲,家庭住址:末知

練習:
  寫一個Student類
    1) 為該類添加初始化方法, 實現在創建對象時自動設置
      '姓名','年齡', '成績' 屬性
    2) 添加set_score方法能修改成績信息
    3) 添加show_info方法打印學生對象的信息

  如:
    class Student:
        def __init__(...):
            ...
        ...

    s1 = Student('小王', 15, 59)
    s1.show_info()  # 小王 今年 17 歲, 成績是: 59
    s1.set_score(80)
    s1.show_info()  # 小王 今年 17 歲, 成績是: 80


面向對向的綜合示例:
  有兩個人(Human):
    1.
      姓名: 張三
      年齡: 35
    2.
      姓名: 李四
      年齡: 8
    行為:
      1. 教別人學東西 teach
      2. 賺錢 works
      3. 借錢 borrow
    事情:
      張三 教 李四 學 python
      李四 教 張三 學 跳皮筋
      張三 上班賺了 1000 元錢
      李四 向 張三 借了 200 元錢
      打印張三的信息: 35歲 的 張三 有錢 800元, 它學會跳皮筋
      打印李四的信息: 8歲 的 李四 有錢 200元, 它學會python
練習:
  修改原來的學生信息管理程序,將原來字典來存儲學生信息,
  現改為用對象來存儲學生信息
    # file : student.py  
    class Student:
        def __init__(self, n, a, s):
             ....

    L = []
    # L.append({...}) 改為對象
    L.append(Student('xiaozhang', 20, 100))

    (要求類Student 要寫在模塊 student.py中)

練習:
  用類來描述一個學生的信息(可以修改之前寫的Student類)
    class Student:
         .... 此處自己實現

    學生信息有:
       姓名, 年齡, 成績

    將一些學生的對象存於列表中,可以任意添加和刪除學生信息
      1) 打印出學生的個數
      2) 打印出所有學生的平均成績
      3) 打印出所有學生的平均年齡

思考:
   list類里只有一個append向末尾加一個元素的方法,但沒有向列表頭部添加元素的方法,試想能否為列表在不改變原有類的基礎上添加一個insert_head(n) 方法,實現在列表的頭部(前部)添加元素
  如:
    class MyList(list):
        def insert_head(self, n):
            ...  # 需要自己添加代表

    myl = MyList(range(3, 6))
    print(myl)  # [3, 4, 5]
    myl.insert_head(2)
    print(myl)  # [2, 3, 4, 5]
    myl.append(6)
    print(myl)  # [2, 3, 4, 5, 6]


練習:
  1. 看懂學生管理程序,每一步做的事情及思想
  2. 把同學們自己的學生信息管理程序用Student學生對象來存儲信息;要求,不要在外部直接操作學生的屬性,所有操作行為用方法來代替


練習:
  寫一個類Bicycle類 ,有 run方法.調用時顯示騎行里程km
    class Bicycle:
        def run(self, km):
            print('自行車騎行了', km, '公里')
  再寫一個類EBicycle(電動自行車類), 在Bicycle類的基礎上添加了電池電量 volume 屬性, 有兩個方法:
     1. fill_charge(self, vol)  用來充電, vol為電量
     2. run(self, km) 方法每騎行10km消耗電量1度,同時顯示當前電量,當電量耗盡時調用 父類的run方法繼續騎行

    b = EBicycle(5)  # 新買的電動有內有5度電
    b.run(10)  # 電動騎行了10km還剩 4 度電
    b.run(100)  #電動騎行了40km,還剩0度電,其余60用腳登騎行
    b.fill_charge(10)  # 又充了10度電
    b.run(50)  # 騎行了50公里剩5度電

練習:
  1. 修改原有的學生信息管理系統, 將學生對象的,全部屬性 
  都變為私有屬性,不讓外部直接訪問來實現封裝

  2. 寫一個列表類MyList實現存儲整數列表,寫類的定義如下:
    class MyList:
        def __init__(self, iterator):
            self.data = ...
    讓此類的對象能用for語句進行迭代訪問

    L = MyList(range(5))
    print(L)
    L2 = [x ** 2 for x in L]
    print(L2)  # [0, 1, 4, 9, 16]

  3. 寫一個類Fibonacci 實現迭代器協議 ,此類的對象可以作為可迭代對象生成相應的斐波那契數
     1 1 2 3 5
    class Fibonacci:
        def __init__(self, n)  # n代表數據的個數
            ...
        ...
    實現如下操作:
      for x in Fibonacci(10):
          print(x)  # 1 1 3 5 8 ....
      L = [x for x in Fibonacii(50)]
      print(L)
      F = fibonicci(30)
      print(sum(F))  

練習:
  1. 實現兩個自定義的列表相加
  class MyList:
      ....  此處自己實現
  L1 = MyList([1, 2, 3])
  L2 = MyList(range(4, 7))
  L3 = L1 + L2
  print(L3)  # MyList([1, 2, 3, 4, 5, 6])
  L4 = L2 + L1
  print(L4)  # MyList([4, 5, 6, 1, 2, 3])
  L5 = L1 * 2
  print(L5)  # MyList([1, 2, 3, 1, 2, 3])





練習:
  實現有序集合類 OrderSet() 能實現兩個集合的交集 &,全集 |,
  補集 -  對稱補集 ^, ==/!= , in/ not in 等操作
  要求集合內部用 list 存儲
  class OrderSet:
      ...
  s1 = OrderSet([1, 2, 3, 4])
  s2 = OrderSet([3, 4, 5])
  print(s1 & s2)  # OrderSet([3, 4])
  print(s1 | s2)  # OrderSet([1, 2, 3, 4, 5])
  print(s1 ^ s2)  # OrderSet([1, 2, 5])
  if OrderSet([1, 2, 3]) != OrderSet([3, 4, 5]):
      print("不相等")
  if s2 == OrderSet(3, 4, 5):
     print('s2 == OrderSet(3, 4, 5) is True')
  if 2 in s1:
     print("2在 s1中")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM