華為云計(jì)算 云知識(shí) 基于ModelArts學(xué)習(xí)Python正則表達(dá)式、多線程執(zhí)行任務(wù)和Python魔法方法的使用
基于ModelArts學(xué)習(xí)Python正則表達(dá)式、多線程執(zhí)行任務(wù)和Python魔法方法的使用

相信很多小伙伴體驗(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)閉

images_16103466386153

(創(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文件夾

images_161034665657533

(創(chuàng)建ModelArts Notebook)

images_161034669707690

多線程體驗(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)

images_161034678307925

正則表達(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'))  # 不在起始位置匹配

images_16103468656514

images_161034687146189

運(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!!" )

images_161034699769734

運(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)

images_161034702694824

魔法方法

在感受完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")

images_16103470545424

images_161034706249235

  通過(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á)式和魔法方法吧!