標籤:隨機 節點 擴充 最小 shel 第一個 其他 開始 永久
第五天,感覺開始燒腦了。遞迴邏輯難,模組數量多,但是絕世武功都是十年磨一劍出來的!穩住!1 遞迴。
定義-----遞迴就是在函數的內部調用自己
遞迴深度 998
不建議修改遞迴深度,因為如果998都沒有解決,那麼這個功能就不適合用遞迴寫
例子:
猜年齡
alex多大,alex比wusir大兩歲 40+2+2
wusit多大,wusir比金老闆大兩歲 40+2
金老闆多大了,40了
def age(n)
if n == 3:
return 40
else:
return age(n+1)+2
age(1)
遞迴求解二分尋找演算法:
99*99 可以 99*100-99 就是9900 - 99 = 9801
這個屬於人類的演算法。
電腦的演算法是 計算一些比較複雜的問題,所採用的 在空間上,或者時間上
更有優勢的方法
空間就是節省記憶體。時間是執行時間計算速度更快
比如排序50000萬個數找到最小的與最大的,一般是快速排序,堆排序,冒泡排序
尋找功能使用演算法
二分法: 只能尋找有序的數字集合的尋找問題
l = [2,3,4,5,6,7,8,9,0,11,22,23,24,27,33,37,44,46,55,59,66,67,77,74,88,90,92,98]
def cal(num=66):
length - len(l)
mid = length//2
if num > l[mid]:
l = l[mid:]
def cal(l,num,start,end)
if start < = end
mid = (end - start)//2 +start
if l[mid] > num:
return cal(l,num,start,mid-1)
elif l[mid] < num:
return cal(l,num,mid+1,end)
else:
print("找到了",mid,l[mid])
else:
return " 沒找到"
2 常用模組1 模組定義:模組就是py檔案,模組是寫好了但不直接使用的功能。
2 模組的意義(摘抄):
如果你退出python解譯器然後重新進入,那麼你之前定義的函數或者變數都將丟失,因此我們通常將程式寫到檔案中以便永久儲存下來,需要時就通過python test.py方式去執行,此時test.py被稱為指令碼script。
隨著程式的發展,功能越來越多,為了方便管理,我們通常將程式分成一個個的檔案,這樣做程式的結構更清晰,方便管理。這時我們不僅僅可以把這些檔案當做指令碼去執行,還可以把他們當做模組來匯入到其他的模組中,實現了功能的重複利用,
3 模組的分類:
常用的 和某個操作相關的 根據相關性分為三類:內建模組。擴充模組。自訂模組
內建模組
安裝了Python解析器後就一起提供了這些模組,一般是特別常用的
擴充模組
需要自己下載安裝的模組
pypi網站:
www.pypi.org
自訂模組
自己寫的模組
4 內建模組:
一 collections模組
orderedDict
提供了很多其他的資料結構,比如有序字典orderedDict
d = collections.OrderedDict()
counter
計算某一個字串出現的次數
defaultdict
from collections import defaultdict
l = [11,22,33,44,55,66,77,88]
my_dict = defaultdict(list)
預設這個字典的value是一個空列表
print(my_dict["a"])
my_dict["b"] = 10
print(my_dict)
如果新建立了key 並指定了值,那麼就按照你指定的值賦值,就不是預設列表了
namedtuple
建立一個元祖,但是裡面的元素都用一個名字代表。
產生可以使用名字來訪問元素內容的tuple
deque
雙端隊列,可以快速的從另外一側追加和推出對象
二 時間模組
定義:時間模組通常有三種方式來表示時間:時間戳記、格式化的時間字串、元組(struct_time)
1。時間戳記時間:表示的是從1970年1月1日00:00:00開始按秒計算的位移量
print(time.time())
2.格式化時間:
time.strftime("%Y-%m-%d %H:%M:%S")
還有%x %c等常用的格式。
格式化時間字串(摘抄):
%y 兩位元的年份表示(00-99) %Y 四位元的年份表示(000-9999) %m 月份(01-12) %d 月內中的一天(0-31) %H 24小時制小時數(0-23) %I 12小時制小時數(01-12) %M 分鐘數(00=59) %S 秒(00-59) %a 本地簡化星期名稱 %A 本地完整星期名稱 %b 本地簡化的月份名稱 %B 本地完整的月份名稱 %c 本地相應的日期表示和時間表示 %j 年內的一天(001-366) %p 本地A.M.或P.M.的等價符 %U 一年中的星期數(00-53)星期天為星期的開始 %w 星期(0-6),星期天為星期的開始 %W 一年中的星期數(00-53)星期一為星期的開始 %x 本地相應的日期表示 %X 本地相應的時間表示 %Z 當前時區的名稱 %% %號本身
3.元組時間(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)
print(time.localtime())
t = time.localtime()
格式(摘抄)
| 索引(Index) |
屬性(Attribute) |
值(Values) |
| 0 |
tm_year(年) |
比如2011 |
| 1 |
tm_mon(月) |
1 - 12 |
| 2 |
tm_mday(日) |
1 - 31 |
| 3 |
tm_hour(時) |
0 - 23 |
| 4 |
tm_min(分) |
0 - 59 |
| 5 |
tm_sec(秒) |
0 - 60 |
| 6 |
tm_wday(weekday) |
0 - 6(0表示周一) |
| 7 |
tm_yday(一年中的第幾天) |
1 - 366 |
| 8 |
tm_isdst(是否是夏令時) |
預設為0 |
4.時間的轉換:
可以接收一個時間戳記時間變成本地化的時間
print(time.localtime(1550000000))
格式化時間轉字串時間
stryct_time = time_gmtime(20000000000)
print(time.strftime("%Y-%m-%d %H:%M:%S",stryct_time))
格式化時間轉時間戳記時間
s = "1988-12-22 9:23:22"
ret = time.strptime(s,"%Y-%m-%d %H:%M:%S",stryct_time")
print(ret)
print(time.rmktime(ret))
練習題:
1 拿到目前時間的月初1號的0點的時間戳記時間。
2 計算任意 兩個時間點之間經過了多少年月日時分秒
datetime是根據time模組再次封裝的模組 更上層
三 random模組
隨機小數
random.random() 大於0且小於1之間的小數
random.uniform(1,3) 大於1小於3的小數
練習:
發紅包
隨機整數
random.randint(0,9) 取一到二
練習:
驗證碼
s = ""
for i in range(4):
s += rangom.randint(0,9)
print(s)
字母與數字都有:
id = ""
num = random.randint(65,90)
c = chr(num)
num2 = random.randint(0,9)
print(num2)
s = random.choice([c,num2])
print(s)
for i in range(4):
id += s
print(ss)
隨機播放一個返回
隨機播放多個返回,返回的個數為函數的第二個參數
四 os模組
系統相關模組
檔案操作:
刪除檔案
os.remove()
重新命名檔案
os.rename("old","new")
目錄操作:
os.makedirs("dir1/dir2") 多層遞迴建立目錄
os.removedirs("dir1") 若目錄為空白則刪除,並遞迴到上一級目錄。如果也為空白則刪除。以此類推
os.mkdir("dir1") 產生單級目錄
os.rmdir("dir1") 刪除單級空目錄 目錄不為空白則無法刪除。
os.listdir("dir1") 列出指定目錄下的所有檔案和子目錄。包括隱藏檔案並以列表方式列印
當前工作目錄有關操作:
os.getcwd() 擷取當前工作目錄。即當前python指令碼工作的目錄路徑。
os.chdir("dir1") 改變當前指令碼工作目錄。相對於shell 的cd ,注意如果改變了路徑 open 檔案時候會在改變的路徑下建立檔案。
os.curdir() 返回目前的目錄:"."
os.pardir() 放回上一級目錄:".."
stat 屬性操作:
os.stat("dir/file")
st_mode inode保護模式
st_ino inode節點號
st_dev inode駐留裝置
st_nlink inode的串連數
st_uid 所有者的使用者ID
st_gid 所有者的組ID
st_size 普通檔案以位元組為單位大小,包含等待某些特殊檔案的資料
st_atime 上次訪問時間
st_mtime 上次修改中繼資料時間
st_ctime 上次修改檔案內容資料的時間
作業系統差異:
os.sep 輸出操作系特定的路徑分隔字元 win是\\ linux /
os.linesep 輸出當前平台使用的行終止符 win是\t\n linux是\n
os.pathsep 輸出用於分割檔案路徑的字串 win ; linux :
"path1%spath2%s",%os.pathsep
os.name 輸出字串指示當前使用平台, win是 nt linux是posix
作業系統命令執行:
os.system 執行系統的命令,直接顯示。
os.system("dir") 執行dir命令
os.popen 執行系統命令,返回傳回值。
ret = os.popen("dir").read()
print(ret)
截屏
五 sys模組
Python解析器模組
sys.exit() 解譯器退出,程式結束
sys.modules #放了所有在解譯器運行過程中匯入的模組名稱。
sys.path 程式相關的路徑。 一個模組能否匯入需要看是否在這裡sys.path列表裡面存放的路徑下面
sys.argv 在執行Python指令碼的時候,可以傳遞一些參數進來
if sys.argv[1] == "alex" and sys.argv[2] == "alex3714":
print("可以執行下面的代碼")
else:
print("密碼錯誤退出")
sys.exit()
這個只能從命令列中執行並傳入參數來使用
六 reRegex模組
功能比如簡單的校正
Regex 字串匹配相關的操作的時候用到的一種規則
Regex的規則
使用python中的re模組去操作Regex
線上測試載入器
http://tool.chinaz.com/regex
Regex:
[] 匹配一個字元位置的字元
[0-9] 匹配0到9的字元
[a-z] 匹配a到z的字母
[A-Za-z] 匹配大小寫字母
[0-9a-fA-F] 匹配一個十六進位字元
元字元:
. 匹配任意一個字元
\d 匹配任意一個數字
\w 匹配任意一個數字,字母,底線
\s 匹配任意一個空白符
\n 匹配分行符號
\t 匹配製表符
a\b 匹配單詞結尾,這裡是結尾是否是a
^a 匹配最開始 這裡是匹配是a開頭的字元
a$ 匹配結尾 這裡是匹配a為結尾的字元
大寫的就都是相反的
\W 就是匹配非數字,字母,底線
[\w\W] 這是一種全組,可以匹配所有
ABC|ABCD 如果兩個Regex先匹配到ABC那麼就不往後匹配了,所以要先把長的寫到前面
應該寫為ABCD|ABC
[^...] 如果在字元組中加^ 那麼就是除了字元組的其他的都匹配[^ABC]
量詞
{num} 約束出現幾次,只約束緊挨著前面的
[1][3-9][0-9]{9} 就是可以匹配前面[0-9]字元組出現9次
量詞跟在一個元字元的後面 約束某個字元的規則能夠重複多少次
如果要匹配的字元剛好是和元字元一模一樣,那麼需要對這個元字元進行轉義 \
* 重複零次或多次
+ 重複一次或多次
?重複0次或一次
{n} 匹配n次
{n,} 重複n次或多次
{n,m} 重複n次到m次
貪婪普配
Regex中的所有量詞,都會盡量多的為你匹配
+表示匹配一次或多次
演算法:回朔演算法
練習:
匹配整數與小數
\d+(/.\d+)?
惰性匹配
? 如果在量詞的後面 ?號就是惰性匹配
\d+?
\d{3,5}? 只匹配3次
?? 只匹配0次或一次 盡量少匹配
{n,}? 匹配n次或多次,盡量只配置n次
.*?x 匹配任一字元碰到一個x就停止
匹配身份證
^[1-9]\d{14}(\d{2}[0-9x])?$
re模組方法:
re.findall() 匹配全部合格值,並全部返回
ret = re.findall("\d+","df12 dsfs23dd sdfs21")
print(ret)
re.search() 找第一個合格。同時返回的值是一個記憶體位址。需要group()調用
ret = re.search("\d+","df12 dsfs23dd sdfs21")
print(ret.group())
一般是
if ret:
print(ret.group())
re.match 在search基礎上,給每一條都加上了^ 匹配開頭
ret = re.match("\d+","df12 dsfs23dd sdfs21")
print(ret)
結果是空
re.split 匹配切割
re.sub 把數字替換成字串 後面指定替換幾次
ret = re.sub("\d","g","adfasdf2131sdfsdf",1)
re.subn 吧數字替換成字串 並返回元祖(替換的結果,替換了多少次)
re.cap 不常用
注意:
findall 的優先順序
如果匹配中有分組,那麼只返回分組的匹配,所以需要在分組前加?:來取消分組優先順序
作業:
字串計算機,加減乘除小括弧,使用正則
提示:先算小括弧裡面的
然後在算乘除,再算加減
三級菜單 遞迴 或堆棧
時間模組
紅包
python修鍊第五天