一.今日內容總覽python
1.內置函數補充
repr() 顯示出字符串的官方表示形式
chr() arscii碼中的字,轉換成位置
ord() arscii碼中的位置,轉換成字
2.遞歸
本身調用本身
兩個口:遞歸的入口(參數) 和 出口(return)
屬性結構的遍歷
3.二分法
掐頭去尾取中間
查找效率很是高
二.今日內容大綱app
1.內置函數(2)函數
2.遞歸測試
3.二分查找ui
三.今日內容詳解spa
1.內置函數(2)code
(1)字符串強轉list或者tuple,注意這裏是迭代強轉orm
print(list("胡辣湯")) print(tuple("胡辣湯")) ''' 結果: ['胡', '辣', '湯'] ('胡', '辣', '湯') '''
(2)reversed()blog
lst = ["河南話", "四川話", "東北", "山東", "上海"] r = reversed(lst)
print(dir(r)) #證實這個函數是生成器
print(list(r)) # 結果:['上海', '山東', '東北', '四川話', '河南話']
(3)遞歸
huiwen = "上2自來水來自海上" #加上2的目的是爲了測試 s = huiwen[::-1] print(s) # 結果: 上海自來水來自海上 it = reversed(huiwen) # 返回的是迭代器 print(it) #結果: <reversed object at 0x000002E1CA867208> s = "" for el in it: s += el print(s) #結果:上海自來水來自海上 #結果: #上海自來水來自2上 #<reversed object at 0x00000172783A74E0> #上海自來水來自2上
(4)slice
lst = ["河南話", "四川話", "東北", "山東", "上海"] s = slice(3,5) # 切片. 麻煩 print(lst[s]) #結果:['山東', '上海'] s = slice(3,) # 切片. 麻煩 print(lst[s]) #結果:['河南話', '四川話', '東北'] s = slice(3,4) # 切片. 麻煩 print(lst[s]) #結果:['山東']
(5)
格式化輸出中的f和format
s = "我叫{name}, 我來自{home}, 我喜歡幹{hobby}".format(name="周杰倫", home="臺灣", hobby="唱歌") print(s) name = "周杰倫" home="臺灣" hobby="唱歌" print(f"我叫{name}, 我來自{home}, 我喜歡幹{hobby}")
(6)
center()
s = "門神" s1 = s.center(20) print(s1) '''結果: 門神 '''
(7)
print(format("門神", "^20")) #門神在中間 print(format("門神", "<20")) #門神在左邊 print(format("門神", ">20")) #門神在右邊 '''結果: 門神 ''' '''結果:門神 ''' '''結果: 門神'''
(8)
print(format(3, 'b')) # ⼆二進制 binary 0b11 print(format(65, 'c')) # 轉換成unicode字符 ascii print(format(11, 'o')) # ⼋八進制 0o 13 print(format(11, 'x')) # ⼗六進制(⼩寫字⺟) print(format(11, 'X')) # ⼗六進制(⼤寫字⺟) print(format(11, 'd')) # ⼗十進制 print(format(11, 'n')) # 和d⼀樣 print(format(11)) # 和d⼀樣 ''' 結果: 11 A 13 b B 11 11 11 '''
(9)
print(format(123456789, 'e')) # 科學計數法. 默認保留6位小數 表示大的數據 print(format(123456789, '.2e')) # 科學計數法. 保留2位小數(e⼩寫) print(format(123456789, '0.2E')) # 科學計數法. 保留2位⼩數(E⼤寫) ''' 結果: 1.234568e+08 1.23e+08 1.23E+08 ''' # 浮點計數法 print(format(1.23456789, 'f')) # 浮點數計數法. 保留6位⼩數 print(format(1.23456789, '0.2f')) # ⼩浮點數計數法. 保留2位⼩數 print(format(1, '0.10f')) # ⼩浮點數計數法. 保留10位⼩數 print(format(1.23456789e+10000, 'F')) # ⼩浮點數計數法. ''' 結果: 1.234568 1.23 1.0000000000 INF #無窮大的意思 '''
(10)
a = 0b11 # 數字3 print(type(a)) print(a) ''' 結果: <class 'int'> 3 ''' print(ord("中")) # 20013 print(chr(20014)) ''' 結果: 20013 丮 ''' for i in range(65536): print(chr(i), end= " ") #結果:循環打印出65536個字,不必定全顯示,可能只顯示一部分
(11)
print(ascii("a")) # 判斷出你給的信息是不是ascii print(ascii("冬瓜")) #結果: #'a' #'\u51ac\u74dc'
(12)
# 轉義字符 # \n 換行 # \t tab 製表符 # \r 回車 # \" 雙引號 # \' 單引號 # \\ \ print('你好, 我叫周杰倫.我來自\\n臺灣. 我老婆叫昆凌') # repr() # 還原字符串最官方的效果 # str:python的字符串 # repr: 全部的字符串 #注意:在這裏repr和r的做用是同樣的,可是原理是不同的 print(repr("你好. \\n我叫\周杰倫")) # python -> repr() -> cpython c裏面. 報錯 # print(r"\n\t范德薩發生\r\b\ffdsaf") # 原封不動的顯示字符串
2.遞歸
(1)
#函數就是本身調用本身 def func(): print('我是地瓜') func() func() #官方最大1000,你永遠跑不到1000,我實測998
(2)
while 1: print("我不是遞歸")
(3)
#二叉樹:徹底二叉樹 ''' 病毒:(不要試) f=open(path,mode='wb') f.write(b'1') ''' #樹形結構的遍歷
(3-1)
import os def func(lujing,n): #'d:/a/' lst=os.listdir(lujing) #打開文件夾,列出該文件夾內的全部文件名 for el in lst: #el是文件的名字,b,c #還原路徑 path=os.path.join(lujing,el) #"d:/a/b" if os.path.isdir(path): #判斷路徑是不是目錄 print('...'*n,el) #顯示文件夾的名字 func(path,n+1) #再來一次 else: print('...'*n,el) #顯示文件 func('D:/a',0)
(3-2)
import os def func(lujing,n): #'d:/a/' lst=os.listdir(lujing) #打開文件夾,列出該文件夾內的全部文件名 # print(lst) #最初用來測試的,['b', 'c', '大冬瓜.txt'] for el in lst: #el是文件的名字,b,c #還原路徑 path=os.path.join(lujing,el) #"d:/a/b" if os.path.isfile(path): #判斷路徑是不是文件(注意,這裏的文件不僅是文件夾,還有txt等) print('...' * n, el) # 顯示文件 else: print('...' * n, el) # 顯示文件夾的名字 func(path, n + 1) # 再來一次 func('D:/a',0)
總結:注意上邊的紅字區別,還有上邊註釋的理解,反覆理解
3.二分查找
(1)
#二分法查找主要的做用就是查找元素 lst=[1,3,5,7,12,36,68,79] num=int(input('請輸入你要查找的元素信息:')) for el in lst: if num==el: print('存在') break else: print('不存在') len(lst) #對於計算機,不多的數是無所謂的,可是數以百萬&億計的,就真的有所謂了
(2)
規則,掐頭去尾取中間
0 1 2 3 4 5 6 7
lst=[1,3,5,7,12,36,68,79]
n=28
規則,掐頭結尾取中間,必須是有序序列
100000000//1億最可能是須要27次比較
(3)
(3-1)
二分法查找 (須要明白和掌握)
lst = [1,3,5,7,12,36,68,79] n = int(input("請輸入一個數")) left = 0 right = len(lst) - 1 count=0 while left <= right: mid = (left + right)//2 if n > lst[mid]: left = mid + 1 elif n < lst[mid]: right = mid - 1 else: print("存在") print(count) break count+=1 else: print("不存在") print(count)
(3-2)
遞歸另類想法
def func(n, lst): left = 0 right = len(lst) - 1 if lst != []: mid = (left + right)//2 if n > lst[mid]: func(n, lst[mid+1:]) # 改變列表 elif n < lst[mid]: func(n, lst[:mid]) #在這裏列表取不到最後一個,因此不用減1 else: print("找到了") return else: print("沒找到") return n = int(input("請輸入你要查找的數:")) func(n, [1,3,5,7,12,36,68,79]) # 78
(3-3)
遞歸2(須要明白和掌握)
def func(n, lst, left, right): # 遞歸找到什麼是能夠變的. 什麼是不能夠變的 if left <= right: mid = (left + right) // 2 if n > lst[mid]: left = mid + 1 return func(n, lst, left, right) elif n < lst[mid]: right = mid - 1 return func(n, lst, left, right) # 遞歸若是有返回值. 全部調用遞歸的地方必須寫return else: print("找到了") return mid # 難點 else: print("找不到") return -1 #比較牛掰的想法,找不到返回-1 n = int(input("請輸入你要查找的數:")) lst = [1,3,55,98,37,41,2,5,1,4] ret = func(n, lst, 0, len(lst)-1) # 78 print(ret)
(4)
哈希尋找消耗內存,二分法不是最快的,只有這種是最快的
最快的查找方式
lst = [1,3,55,98,37,41,2,5,1,4] print(max(lst)) new_lst = [] for i in range(99): new_lst.append(0) for i in lst: # 1,3,55,98 new_lst[i] = 1 print(new_lst) while 1: i = int(input('請輸入你要找的數據')) if new_lst[i] == 0: # 1次 print("不存在") else: print("存在")
結果:
98 [0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] 請輸入你要找的數據98 存在 請輸入你要找的數據