可變的數據類型:list, dict, set(可修改其中的元素) 不可變的數據類型:str, tuple 重點:str, list, dict (1).推導式練習 # 利用列表推導式: 找出100以內所有奇數,並將所有奇數乘以3,寫入列表。 li = [i * 3 for i in range(1 ...
可變的數據類型:list, dict, set(可修改其中的元素)
不可變的數據類型:str, tuple
重點:str, list, dict
(1).推導式練習
# 利用列表推導式: 找出100以內所有奇數,並將所有奇數乘以3,寫入列表。 li = [i * 3 for i in range(1, 101) if i % 2 != 0] print(li) li = [i * 3 for i in range(1, 101, 2)] print(li)View Code
(2).遞歸的使用:(經典的猴子吃桃)
""" 猴子第一天摘下N個桃子,當時就吃了一半,還不過癮,就又多吃了一個。 第二天又將剩下的桃子吃掉一半,又多吃了一個。 以後每天都吃前一天剩下的一半零一個。 到第10天在想吃的時候就剩一個桃子了, 問:第一天共摘下來多少個桃子? """ """ 先進行分析: 第n天: 10 9 8 7 剩(個): 1 (1+1)*2=4 (4+1)*2=10 (10+1)*2=22 """ def peachs(n): if n == 10: return 1 else: return (peachs(n + 1) + 1) * 2 print(peachs(1)) 沒理解遞歸的話,看下麵這個方案: n = 1 # 天 x = 1 # 桃子幾個 while n < 10: # 第9天發現只剩了一個 x = (x + 1) * 2 n += 1 print(x)View Code
(3).基礎函數練習1
''' 定義一個函數: 統計傳入的字元串里,英文字母、空格、數字和其他字元分別出現次數, 並作為一個字典返回 {'字母': ,'空格': ,'數字': ,'其他字元:' } ''' def count_types(s): # 先定義一個字典 dict = {"字母": 0, "空格": 0, "數字": 0, "其他字元": 0} # 遍歷取出字元串中每個值 for i in s: if i.isalpha(): dict["字母"] += 1 # 鍵值訪問,直接自加 elif i.isspace(): dict["空格"] += 1 elif i.isdigit(): dict["數字"] += 1 else: dict["其他字元"] += 1 return dict print(count_types("jing tian 520.1314!"))View Code
(4).基礎函數練習2
1 """ 2 請定義一個名為titles的函數: 3 1.接收一句英文(字元串)作為參數 4 2.將這個英文的每個單詞轉換成有且只有首字母大寫的形式 5 3.返迴轉換後的英文句 6 4.str.title具有這個功能,但在此題不可使用str.title 7 例如: 8 >>> titles('this is python.') 9 'This Is Python.' 10 >>> titles('i love python') 11 'I Love Python' 12 """ 13 14 # 利用列表推導式+lambda函數 一行代碼搞定 15 # 可讀性差,儘量避免寫(但我個人比較喜歡這樣,感覺眼前一亮,豁然開朗) 16 # 此題邏輯簡單,一條語句反而感覺清爽。 17 s1 = "this is python." 18 s2 = " i love jing tian " 19 g = lambda s: " ".join([i.capitalize() for i in s.split()]) 20 print(g(s1)) 21 print(g(s2))View Code
(5).
1 """ 2 給定一個正整數,求出它所有數字的和值。 3 然後再對這個數,求出它的所有數字的求和。 4 直到求出的和值是一個個位數為止。 5 例如 : 6 16 -> 1 + 6 = 7 7 942 -> 9 + 4 + 2 = 15 -> 1 + 5 = 6 8 132189 -> 1 + 3 + 2 + 1 + 8 + 9 = 24 -> 2 + 4 = 6 9 """ 10 11 12 def dr(n): 13 return n % 9 or n and 9 14 15 16 """ 17 首先 : and > or 18 當 n!=0 的時候,and是返回右邊的值,然後or是返回左邊的值 19 """ 20 21 print(dr(16)) # 7 22 print(dr(942)) # 6 23 print(dr(132189)) # 6View Code
(6).
1 """ 2 在金融數據顯示的時候,往往看到的是:一個數字,每隔3位用一個逗號隔開。 3 如: 4 1234567 -> 1,234,567 5 1234567890.123 -> 1,234,567,890.123 6 -614616 -> -614,616 7 -1234.05 -> -1,234.05 8 +5201314 -> 5,201,314 9 """ 10 11 12 def main(a, minus=False): 13 """ 14 :param minus: 是否是負數。負數前面的"-"減號就靠它去判斷,拼接了 15 :return: 數字之間都用逗號隔開了 16 """ 17 18 # 如果有人多此一舉在正數前帶了"+"號,不切片的話,後面截取時要出事 19 if a.find("+") == 0: 20 a = a[1:] 21 22 # 從後往前,每隔3個字元,切一次。 23 a_formated = lambda a: ",".join([a[-i:-(i + 3):-1][::-1] for i in range(1, len(a) + 1, 3)][::-1]) 24 25 # 是否帶小數。(isdigit判斷的是正整數,如果返回了False,那就是帶小數了) 26 if a.isdigit(): 27 if minus: 28 return "{}{}".format("-", a_formated(a)) 29 else: 30 return a_formated(a) 31 else: 32 num_decimal = a[a.find("."):] # 如果是小數,存放小數部分的變數 33 a = a[:a.find(".")] # 存放真正需要去逗號隔開的部分 34 35 if minus: 36 return "{}{}{}".format("-", a_formated(a), num_decimal) 37 else: 38 return "{}{}".format(a_formated(a), num_decimal) 39 40 41 if __name__ == '__main__': 42 while 1: 43 a = input("請輸入一個數字:") 44 45 """ 46 用float()工廠一下,能成功肯定是一個合法的數值。 47 如果出錯了,那就不是一個合法的數值,continue一下讓程式回到迴圈的第一條語句。 48 不要賦值,不然整數的話就會出現".0"小數。 49 """ 50 try: 51 float(a) # 先看看能不能轉換成float 52 except ValueError: 53 print("輸入有誤!") 54 continue 55 except TypeError: 56 print("輸入有誤!") 57 continue 58 except Exception as e: 59 print("未知錯誤:", e) 60 continue 61 62 # 是否為負數 63 if float(a) < 0: 64 b = main(a[1:], minus=True) # 是負數的話,把負號砍了。通過設置布爾值,在函數里返回的時候再進行拼接處理 65 else: 66 b = main(a) 67 68 print(b)View Code
(7).讀取舊文本中的內容。以每10個字為一行,寫入新的文本
方法一:
1 def exchange(old_file, words_number, new_file): 2 """ 3 讀取舊文本中的內容。以每10個字為一行,寫入新的文本。 4 :param old_file: (string)舊的本文名稱。路徑在打開的時候進行拼接。 5 :param words_number: (int)指定每幾個字為一行。 6 :param new_file: (string)可以為這個新文本指定自己喜歡的名稱。 7 :return: None 8 """ 9 10 # 打開原始的文本 11 with open(old_file + ".txt", "r", encoding="gbk") as f: 12 # 只是打開、讀取的用途,不做其他操作。所以是r模式 13 old_text = f.read() 14 15 new_text = "" 16 for each in old_text: 17 # 手動替換 : 空格、換行。最後組成一個無空格、無換行的"一行"字元串 18 new_text += each.replace(" ", "").replace("\n", "").replace("\r", "") 19 20 # 計算需要截取幾次 21 # 原理在最下 22 times = int(len(new_text) / words_number) + 1 23 tmp_li = [] 24 for i in range(times): 25 try: 26 a = new_text[i * words_number:i * words_number + words_number] # 引用 : [原理1] 27 except Exception as e: 28 print("Error at 截取新字元串分片處 :", e) 29 tmp_li.append(a) 30 31 # 寫入新文本 32 try: 33 with open(new_file + ".txt", "w+") as f: 34 f.writelines("\n".join(tmp_li)) # 手動拼接換行 35 except Exception as e: 36 print("Error at 寫入新文本 : ", e) 37 38 39 if __name__ == '__main__': 40 original_file = input("請輸入原始文件名:") 41 words_eachline = int(input("每行字數(請輸入整數):")) 42 new_file = input("請輸入要保存的文件名:") 43 44 # call function 45 exchange(original_file, words_eachline, new_file) 46 47 """ 48 原理1 : 49 50 # 通過測試下麵的代碼,可計算出需要如何截取字元 51 52 txt = "啊阿埃挨哎唉哀皚癌藹矮艾礙愛隘鞍氨安俺按暗岸胺案骯昂盎凹敖熬翱襖傲奧懊" 53 54 ci = int(len(txt) / 10) + 1 55 print(ci) 56 57 a = txt[0:10] 58 print(a) 59 60 a = txt[10:20] 61 print(a) 62 63 a = txt[20:30] 64 print(a) 65 66 print("---------------------------") 67 68 for i in range(ci): 69 a = txt[i * 10:i * 10 + 10] 70 print(a) 71 """View Code
方案二:
1 n = 10 # 每行字數 2 3 with open('old.txt', 'r') as f1, open('new.txt', 'w', encoding='utf-8') as f2: 4 temp = '' 5 for line in f1: 6 temp = temp + line.strip().replace(' ', '') # 去掉兩端的回車和空格 7 while len(temp) >= n: 8 f2.write(temp[:n]) 9 f2.write('\n') 10 temp = temp[10:] 11 f2.write(temp) # 文本最後一行View Code
(8).求s=a+aa+aaa+aaaa+aa..a的值
1 """ 2 求s=a+aa+aaa+aaaa+aa..a的值,其中a是一個數字。 3 例如:2+22+222+2222+22222(此時公有五個數相加),幾個數相加由鍵盤控制 4 """ 5 6 def sum_num(num, dig_num): 7 var = 0 8 for i in range(dig_num): 9 var += int((str(num) * (i + 1))) # 同理 print("3"*3) 10 if i == (dig_num - 1): 11 print(int((str(num) * (i + 1))), end="=") 12 else: 13 print(int((str(num) * (i + 1))), end="+") 14 return var 15 16 17 num = int(input("請輸入要計算的數字:")) 18 dig_num = int(input("請輸入要計算的次數:")) 19 sum_dig = sum_num(num, dig_num) 20 21 print(sum_dig)View Code