Python全棧開發記錄只爲記錄全棧開發學習過程當中一些難和重要的知識點,還有問題及課後題目,以供本身和他人共同查看。(該篇代碼行數大約:300行)python
知識點1:優先級:not>andlinux
短路原則:and:若是第一個條件的結論爲假,那麼 and 先後兩個條件組成的表達式計算結果必定爲假,後面的條件計算機不會進行計算git
or:若是第一個條件的結論爲真,那麼or 先後兩個條件組成的表達式計算結果必定爲真,後面的條件計算機不會進行計算編程
知識點2:python區分大小寫,常量需所有字母大寫(默認這樣寫)小程序
python換行符說明:Windows是'\r\n',Linux是'\n',在Python 3,能夠經過open函數的newline參數來控制Universal new line mode:讀取時候,不指定newline,則默認開啓Universal new line mode,全部\n, \r, or \r\n被默認轉換爲\n ;寫入時,不指定newline,則換行符爲各系統默認的換行符(\n, \r, or \r\n, ),指定爲newline='\n',則都替換爲\n(至關於Universal new line mode);不論讀或者寫時,newline=''都表示不轉換。windows
知識點3:while...else...和for...else....:while循環中,只要循環正常完成,即中途沒有break,那麼就會 執行else語句,不然就不會,for循環跟while原理同樣。app
知識點4:exit("退出啦")->程序退出,並提示「退出啦」。
框架
知識點5:python3已經不區分長整型和整型,python2區分,主要是長度(linux和windows也不同,能夠本身試一下)。iphone
知識點6:python3列表切片:a=[1,2,3],a[1:10]就等同於a[1:]也就是說索引2以後自己就不存在了也無論了直接取到最後就行,可是不能a[10],會出現索引錯誤。函數
a,b = [1,2] -> a=1,b=2
知識點7:enumerate(sequence, [start=0]), 函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合爲一個索引序列,同時列出數據和數據下標,通常用在 for 循環當中。
知識點8:字典的鍵只能爲不可變類型,值能夠爲任意值,字典鍵惟一,重複的鍵,取字典最後一個。
不可變類型:整型、字符串、元組
可變類型:列表、字典
知識點9:字符串:a="12",b="tt",c="hh" -> '-'.join([a,b,c]) 結果就是"12-tt-hh",字符串經過join實現拼接,效率比+更快(試了簡單的拼接,join快幾百倍)。
format格式化輸出:a="hello world {name} {age}" -> a.format(name="liu", age=18)或者a.format_map({"name":"liu", "age":18}),而後結果就是hello world liu 18。
知識點10:關於python中編碼的問題,先說python2的編碼:
python2文本字符默認編碼是ASCII,python3中文本字符默認爲unicode(py3在編碼的同時會把數據變成byte類型,在解碼的同時會把byte類型轉成字符串),下圖是從金角大王那裏借鑑的,decode是解碼,encode是編碼,unicode是他們共同的聯繫(unicode向下兼容gbk),
#coding=utf-8 a = "我是中國人" #utf-8轉換成gbk,正確寫法,下面都是py2的寫法 utf8_to_unicode = a.decode("utf-8") #將utf-8解碼成unicode unicode_to_gbk = utf8_to_unicode.encode("gbk") #將unicode編碼成gbk print("unicode", utf8_to_unicode) print("gbk", unicode_to_gbk) #若是gbk裝換成utf8,錯誤寫法以下 gbk_to_utf8 = unicode_to_gbk.encode("utf-8") #實際上python2自動幫你換成了,decode()不寫表示默認用ASICC幫你解碼 unicode_to_gbk.decode().encode("utf-8") #gbk轉換成utf-8,正確寫法以下,必須先轉成unicode先 gbk_to_unicode = unicode_to_gbk.decode("gbk") #將gbk解碼成unicode unicode_to_utf8 = gbk_to_unicode.encode("utf-8") #將unicode編碼成utf-8 print("unicode", gbk_to_unicode) print("utf-8", unicode_to_utf8)
題目一:用戶輸入三個數字,輸出三個數字中的最大值/最小值
# -*- coding:utf-8 -*- ''' 需求1:用戶輸入三個數字,輸出三個數字中的最大值/最小值 思路:以num1,num2,num3三個數爲例 一、三個數比較的話,先比較兩個數,而後再拿這兩個數跟第三個數進行比較 二、 if num1 >= num2: if num2 >= num3: print("最大值是:",num1,",最小值是:",num3) elif num1 >= num3: print("最大值是:",num1,",最小值是:",num2) else: print("最大值是:",num3,",最小值是:",num2) else: if num1 >= num3: print("最大值是:",num2,",最小值是:",num3) elif num2 >= num3: print("最大值是:",num2,",最小值是:",num1) else: print("最大值是:",num3,",最小值是:",num1) ''' def compare_size(): num1 = int(input("請輸入第一個數字:")) num2 = int(input("請輸入第二個數字:")) num3 = int(input("請輸入第三個數字:")) if num1 >= num2: if num2 >= num3: print("最大值是:",num1,",最小值是:",num3) elif num1 >= num3: print("最大值是:",num1,",最小值是:",num2) else: print("最大值是:",num3,",最小值是:",num2) else: if num1 >= num3: print("最大值是:",num2,",最小值是:",num3) elif num2 >= num3: print("最大值是:",num2,",最小值是:",num1) else: print("最大值是:",num3,",最小值是:",num1) if __name__ == "__main__": compare_size()
題目二:使用#號輸出長方形,用戶能夠指定寬和高,若是寬爲4,高爲5,則輸出4個橫#和5個豎#的長方形
# -*- coding:utf-8 -*- ''' 需求2:使用#號輸出長方形,用戶能夠指定寬和高,若是寬爲4,高爲5,則輸出4個橫#和5個豎#的長方形 思路: 一、通常橫豎這種能夠經過循環嵌套來處理 二、外層循環表明橫,內層循環表明豎 ''' def print_rectangle(): #接收用戶輸入 rec_width = int(input("請輸入寬:")) rec_height = int(input("請輸入高:")) #外層循環輸出高 for height in range(rec_height): #內層循環輸出寬的數量 for width in range(rec_width): print("#",end="") #每行打完換行 print() if __name__ == "__main__": print_rectangle()
題目三:如何輸出以下直角三角形,用戶指定行數(上下反轉試下)
''' 需求3:如何輸出以下直角三角形,用戶指定行數(上下反轉試下) * ** *** 思路: 一、外層循環表明橫,內層循環表明豎(先肯定這個框架) 二、外層是行,那麼也就是用戶的輸入,因爲用戶只輸入了高,發現列是第一行一,第二行二,第N行N,因此能夠不用內循環也能夠 三、上下反轉的話,就是輸出第一行是N,依次減一便可 ''' def print_triangle(): # 接收用戶輸入 tri_height = int(input("請輸入三角形的高:")) # 外層循環輸出高 for height in range(1, tri_height+1): print("*"*height) def up_down_print_triangle(): # 接收用戶輸入 tri_height = int(input("請輸入三角形的高:")) # 外層循環輸出高 for height in range(1, tri_height+1): print("*"*(tri_height+1-height)) if __name__ == "__main__": #print_triangle() up_down_print_triangle()
題目四:輸出九九乘法表
''' 需求4:輸出九九乘法表 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 .... 思路: 一、外層循環表明橫,內層循環表明豎(先肯定這個框架) 二、而後找尋規律,發現總共九行,第一行一列,第N行N列 三、x*y 左邊x,x的值由1逐步增長至y y的數值則爲列的數值 ''' def print_99_multiply(): #99乘法表的行、列數用變量表示 nine_lines = 9 nine_weight = 9 #行的數量 for line in range(1, nine_lines+1): #列的數量,因爲列的數量跟行數量一致,因此是line+1 for weight in range(1, line+1): print("%d*%d=%d"%(weight, line, (weight*line)),end="\t") #\t製表符是爲了對齊 print() if __name__ == "__main__": print_99_multiply()
題目五:購物車小程序
# -*- coding:utf-8 -*- # @__author__ : Loris # @Time : 2018/10/24 9:11 ''' 需求5:購物車程序(不用字典) ''' #第一版 def first_shopping_car(): #商店的商品 shops = ["iphoneX", "Book", "Computer", "Flower", "Tea"] #商品價格列表 shop_prices = [12800, 100, 5000, 99, 35] #用戶帳戶餘額 salary = 10000 #用戶購物車列表 buy_shops = [] while True: #歡迎用戶進入購物頁面,而且顯示全部購物商品 print(''' 商品列表: 一、iphoneX 12800 二、Book 100 三、Computer 5000 四、Flower 99 五、Tea 35 ''') shop_num = input("請您選擇商品,退出請輸入quit:") if shop_num == "quit": print("您已購買如下商品:") for shop in buy_shops: shop_price_index = shops.index(shop) print("%s %d"%(shop, shop_prices[shop_price_index])) print("您的餘額爲:%d" %salary) print("歡迎下次光臨!") break #當前商品的價格 current_shop_price = shop_prices[int(shop_num)-1] #當前商品名稱 current_shop_name = shops[int(shop_num)-1] #用戶選擇後,用用戶餘額扣除商品的價格,當小於0時提示用戶餘額不足,並顯示扣除以後的值 if (salary-current_shop_price) >= 0: buy_shops.append(current_shop_name) salary = salary - current_shop_price print("已加入 %s 到您的購物車,當前你帳戶餘額爲%d"%(current_shop_name, salary)) else: print("餘額不足,%s"%(salary-current_shop_price)) #第二個版本(優化版本) def second_shopping_car(): #商品列表,這裏就將商品和價格用元組表示 shops_list = [ ("iphoneX", 12800), ("Book", 100), ("Computer", 5000), ("Flower", 99), ("Tea", 35), ] #用戶帳戶餘額 salary = 10000 #用戶購物車列表 buy_shops = [] while True: #展現全部商品信息 for num, shop in enumerate(shops_list, 1): if num == 1: print("序號".ljust(8)+"商品".ljust(10)+"價格".ljust(10)) print(str(num).ljust(10)+shop[0].ljust(12)+str(shop[1]).ljust(10)) #接收用戶輸入要購買的商品 shop_num = input("請您選擇商品,退出請輸入quit:") #判斷輸入是否合理 if shop_num.isdigit(): shop_num = int(shop_num) if shop_num>0 and shop_num<=len(shops_list): #當前商品 current_shop = shops_list[shop_num-1] #判斷餘額是否大於當前商品的價格,大於則加入購物車,小於則提示餘額不足 if current_shop[1] <= salary: salary -= current_shop[1] #減去商品的價格 #若是說購物車有商品則將商品拿出來依次判斷 if len(buy_shops) != 0: for buy_shop in buy_shops: if current_shop[0] == buy_shop[0]: #當發現有一樣商品時,商品數量加1,而後退出循環 buy_shop[1] += 1 break #當循環完成後若是仍是沒有找到相同的商品,則額外添加商品,數量默認爲1 else: buy_shops.append([current_shop[0], 1]) #若是沒商品就直接添加第一個 else: buy_shops.append([current_shop[0], 1]) #將商品加入到購物車 print("您已將%s商品加入購物車,當前帳戶餘額爲%d"%(current_shop[0], salary)) else: print("您當前餘額不足,還剩%s元錢"%salary) else: print("你輸入的商品序號不存在,請從新輸入!") elif shop_num == "quit": #在退出前展現已購買列表 print("--------已購買商品列表以下--------") print("商品".ljust(8)+"數量".ljust(10)) for buy_shop in buy_shops: print(buy_shop[0].ljust(10)+str(buy_shop[1]).ljust(10)) break else: print("你輸入的內容有誤,請從新輸入!") if __name__ == "__main__": second_shopping_car()
效果圖以下:
題目六:三級菜單
# -*- coding:utf-8 -*- ''' 需求6:三級菜單 要求: 一、打印省、市、縣三級菜單 二、可返回上一級 三、可隨時退出程序 思路: 一、有幾級菜單就須要幾個while循環,這樣才能不斷選擇 二、退出標識位用不一樣變量表示 ''' #字典存放省、市、縣 menu_dict = { "廣東省":{ "深圳市":{ "羅湖區":{}, "福田區":{}, "南山區":{} }, "廣州市":{ "白雲區":{}, "天河區":{}, "越秀區":{}, "番禺區":{} }, "東莞市":{ "虎門鎮":{}, "樟木頭":{}, "常平鎮":{}, "大嶺山":{} } }, "湖南省":{ "長沙市":{ "雨花區":{}, "嶽麓區":{}, "芙蓉區":{} }, "株洲市":{ "天元區":{}, "滬鬆區":{} }, "邵陽市":{ "新邵縣":{}, "大祥區":{}, "武岡":{}, "隆回縣":{} } } } #初版(初級版本) #定義退出標識位 # provice_flag = True #一級菜單 # city_flag = True #二級菜單 # area_flag = True #三級菜單 # # while provice_flag: # # 打印一級菜單 # for provice in menu_dict: # print(provice) # #用戶選擇省 # provice_menu = input("please choice,b返回上一層,q則退出:").strip() # #print(provice_menu) # if provice_menu in menu_dict: # # 用戶選擇後,就能夠進入循環,用break就能夠不用考慮 # city_flag = True # while city_flag: # #打印二級菜單(市) # for city in menu_dict[provice_menu]: # print(city) # #用戶選擇市 # city_menu = input("please choice,b返回上一層,q則退出:").strip() # if city_menu in menu_dict[provice_menu]: # # 用戶選擇後,就能夠進入循環,用break就能夠不用考慮 # area_flag = True # while area_flag: # #打印三級菜單(區) # for area in menu_dict[provice_menu][city_menu]: # print(area) # # 用戶選擇區 # area_menu = input("please choice,b返回上一層,q則退出:").strip() # if area_menu in menu_dict[provice_menu][city_menu]: # print("已是最後一層了,請返回!") # elif area_menu == "q": # area_flag = False # city_flag = False # provice_flag = False # elif area_menu == "b": # area_flag = False # else: # print("輸入有誤!") # elif city_menu == "q": # city_flag = False # provice_flag = False # elif city_menu == "b": # city_flag = False # else: # print("輸入有誤!") # # elif provice_menu == "q": # provice_flag = False # elif provice_menu == "b": # provice_flag = False # else: # print("輸入有誤!")
#第二版(優化版本) #退出的標識位 flag = True #經過變量存儲變化的菜單欄 current_menu = menu_dict #剛開始就是一級菜單欄 #經過列表記錄以往的父級菜單 menu_list = [] while flag: #打印菜單欄內容,跟current_menu有關 for menu in current_menu: print(menu) choice_menu = input("請選擇,b返回上一層,q退出:") if choice_menu in current_menu: #將父級菜單加入列表 menu_list.append(current_menu) #變量存儲子級菜單 current_menu = current_menu[choice_menu] if not current_menu: print("最後一層了") elif choice_menu == 'b': #若是列表記錄無內容證實在第一層,因此就不須要執行返回上一層 if len(menu_list) == 0:continue current_menu = menu_list.pop() elif choice_menu == 'q': flag = False else: print("輸入有誤!")
總結:第一篇主要用到的知識都是循環嵌套,雖然不難,可是這上面的題目都仍是比較經典的,建議在作題的時候先看清楚需求而後明確思路,鍛鍊先理順實現邏輯再去編程,這樣會比較好,並且要寫註釋,變量名也須要有意義。