相信很多小伙伴體驗(yàn)沙箱實(shí)驗(yàn)《使用ModelArts中開(kāi)發(fā)工具學(xué)習(xí)Python(初級(jí))》后,對(duì)Python變成語(yǔ)言有了一個(gè)基礎(chǔ)的認(rèn)知,掌握了Python基礎(chǔ)的語(yǔ)法和使用方式。它的魅力遠(yuǎn)不止于此,在本文中,我們一起來(lái)感受和學(xué)習(xí)Python變成語(yǔ)言的正則表達(dá)式和多線程高級(jí)用法,以及神秘的魔法方法。話不多說(shuō),進(jìn)入實(shí)驗(yàn),我們馬上體驗(yàn)!
環(huán)境準(zhǔn)備
在環(huán)境準(zhǔn)備中,根據(jù)手冊(cè)提示創(chuàng)建一個(gè)用于存放操作數(shù)據(jù)的 對(duì)象存儲(chǔ)服務(wù) OBS:
創(chuàng)建配置:
① 區(qū)域:華北-北京四
② 數(shù)據(jù)冗余存儲(chǔ)策略:?jiǎn)蜛Z存儲(chǔ)
③ 桶名稱:自定義即可(需要記住此名稱以備后續(xù)步驟使用)
④ 存儲(chǔ)類別:標(biāo)準(zhǔn)存儲(chǔ)⑤ 桶策略:私有
⑥ 默認(rèn)加密:關(guān)閉
⑦ 歸檔數(shù)據(jù)直讀:關(guān)閉

(創(chuàng)建 對(duì)象存儲(chǔ) 服務(wù)OBS)
創(chuàng)建一個(gè)ModelArts Notebook,Notebook創(chuàng)建好后選擇conda-python3打開(kāi),開(kāi)始Python的奇妙之旅。
創(chuàng)建配置:
① 計(jì)費(fèi)方式:按需計(jì)費(fèi)
② 名稱:任意
③ 自動(dòng)停止:關(guān)閉
④ 工作環(huán)境:Python3
⑤ 資源池:公共資源池
⑥ 類型:CPU
⑦ 規(guī)格:2核8GiB
⑧ 存儲(chǔ)配置:對(duì)象存儲(chǔ)服務(wù)(OBS)
⑨ 存儲(chǔ)位置:OBS文件夾

(創(chuàng)建ModelArts Notebook)

多線程體驗(yàn)
多線程,是指從軟件或者硬件上實(shí)現(xiàn)多個(gè)線程并發(fā)執(zhí)行的技術(shù)。具有多線程能力的計(jì)算機(jī)因有硬件支持而能夠在同一時(shí)間執(zhí)行多于一個(gè)線程,進(jìn)而提升整體處理性能。Python的多線程操作跟電腦同時(shí)多任務(wù)運(yùn)行,而且不殺后臺(tái),這樣很多耗時(shí)長(zhǎng)的任務(wù)我們就可以放到后臺(tái)處理。但是每個(gè)現(xiàn)成都需要有一個(gè)應(yīng)用程序來(lái)承載,不能夠獨(dú)立的執(zhí)行任務(wù)。運(yùn)行以下代碼,來(lái)看看多線程是如何操作的
運(yùn)行下方代碼,實(shí)現(xiàn)Python的多線程:
import threading
from time import sleep,ctime
def work1():
for i in range(3):
print("work1正在執(zhí)行...%d"%i)
sleep(1)
def work2():
for i in range(3):
print("work2正在執(zhí)行...%d"%i)
sleep(1)
if __name__ == '__main__':
print('---開(kāi)始---:%s'%ctime())
t1 = threading.Thread(target=work1) # 線程1
t2 = threading.Thread(target=work2) # 線程2
# 啟動(dòng)線程
t1.start()
t2.start()
sleep(5)
print('---結(jié)束---:%s'%ctime())
運(yùn)行同步代碼,可查看到已經(jīng)創(chuàng)建2個(gè)線程,讓他們各自對(duì)g_num加1000000次:
import threading
import timeg_num = 0
def test1(num):
global g_num # 使用全局變量
for i in range(num):
mutex.acquire() # 上鎖
g_num += 1
mutex.release() # 解鎖
print("---test1---g_num=d"g_num)
def test2(num):
global g_num
for i in range(num):
mutex.acquire() # 上鎖
g_num += 1
mutex.release() # 解鎖
print("---test2---g_num=d"g_num)
# 創(chuàng)建一個(gè)互斥鎖
# 默認(rèn)是未上鎖的狀態(tài),可以刪除鎖后查看資源爭(zhēng)奪的結(jié)果
mutex = threading.Lock()
# 創(chuàng)建2個(gè)線程,讓他們各自對(duì)g_num加1000000次
p1 = threading.Thread(target=test1, args=(1000000,))
p1.start()
p2 = threading.Thread(target=test2, args=(1000000,))
p2.start()
# 等待計(jì)算完成time.sleep(5)print("2個(gè)線程對(duì)同一個(gè)全局變量操作之后的最終結(jié)果是:s" g_num)

正則表達(dá)式
正則表達(dá)式通常被用來(lái)檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。re.match 方法嘗試從字符串的起始位置匹配一個(gè)模式,如果不是起始位置匹配成功的話,match()就返回None。
運(yùn)行下方代碼,使用re模塊進(jìn)行字符串的匹配
import re
print(re.match('www', 'www.huawei.com').span()) # 在起始位置匹配
print(re.match('com', 'www.huawei.com')) # 不在起始位置匹配


運(yùn)行下方代碼,可用re.search 方法掃描整個(gè)字符串并返回第一個(gè)成功的匹配
import re
line = "Cats are smarter than dogs"
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print("searchObj.group() : ", searchObj.group())
print("searchObj.group(1) : ", searchObj.group(1))
print("searchObj.group(2) : ", searchObj.group(2))
else:
print("Nothing found!!" )

運(yùn)行下方代碼,一起來(lái)感受下Python 的 re 模塊,re.sub 方法用于替換字符串中的匹配項(xiàng):
import re
phone = "2019-0101-000 # 這是一個(gè)電話號(hào)碼"
# 刪除字符串中的 Python注釋
num = re.sub(r'#.*$', "", phone)
print("電話號(hào)碼是: ", num)# 刪除非數(shù)字(-)的字符串
num = re.sub(r'D', "", phone)
print("電話號(hào)碼是 : ", num)

魔法方法
在感受完P(guān)ython的多線程和正則表達(dá)式后,更不能錯(cuò)過(guò)這個(gè)神奇的東西——魔法方法,所謂魔法方法,是指在Python中,有一些內(nèi)置好的特定的方法,這些方法在進(jìn)行特定的操作時(shí)會(huì)自動(dòng)被調(diào)用,比如_init__:初始化函數(shù),在創(chuàng)建實(shí)例對(duì)象時(shí),為實(shí)例屬性賦值使用。不信,我們可以試試運(yùn)行下方代碼,則會(huì)返回結(jié)果:小狗:dog。
class Dog(object):
def __init__(self, name):
self.name = name
print("小狗:%s"%(self.name))
dog = Dog("dog")


通過(guò)本次實(shí)驗(yàn),可以輕松體驗(yàn)Python編程語(yǔ)言的高級(jí)用法,還在等什么?馬上進(jìn)入 沙箱實(shí)驗(yàn)室 ,體驗(yàn)沙箱實(shí)驗(yàn)《使用ModelArts中開(kāi)發(fā)工具學(xué)習(xí)Python(高級(jí))》,深入感受正則表達(dá)式和魔法方法吧!