# 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中")