相信很多小伙伴体验沙箱实验《使用ModelArts中开发工具学习Python(初级)》后,对Python变成语言有了一个基础的认知,掌握了Python基础的语法和使用方式。它的魅力远不止于此,在本文中,我们一起来感受和学习Python变成语言的正则表达式和多线程高级用法,以及神秘的魔法方法。话不多说,进入实验,我们马上体验!
环境准备
在环境准备中,根据手册提示创建一个用于存放操作数据的 对象存储服务 OBS:
创建配置:
① 区域:华北-北京四
② 数据冗余存储策略:单AZ存储
③ 桶名称:自定义即可(需要记住此名称以备后续步骤使用)
④ 存储类别:标准存储⑤ 桶策略:私有
⑥ 默认加密:关闭
⑦ 归档数据直读:关闭
(创建 对象存储 服务OBS)
创建一个ModelArts Notebook,Notebook创建好后选择conda-python3打开,开始Python的奇妙之旅。
创建配置:
① 计费方式:按需计费
② 名称:任意
③ 自动停止:关闭
④ 工作环境:Python3
⑤ 资源池:公共资源池
⑥ 类型:CPU
⑦ 规格:2核8GiB
⑧ 存储配置:对象存储服务(OBS)
⑨ 存储位置:OBS文件夹
(创建ModelArts Notebook)
多线程体验
多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。Python的多线程操作跟电脑同时多任务运行,而且不杀后台,这样很多耗时长的任务我们就可以放到后台处理。但是每个现成都需要有一个应用程序来承载,不能够独立的执行任务。运行以下代码,来看看多线程是如何操作的
运行下方代码,实现Python的多线程:
import threading
from time import sleep,ctime
def work1():
for i in range(3):
print("work1正在执行...%d"%i)
sleep(1)
def work2():
for i in range(3):
print("work2正在执行...%d"%i)
sleep(1)
if __name__ == '__main__':
print('---开始---:%s'%ctime())
t1 = threading.Thread(target=work1) # 线程1
t2 = threading.Thread(target=work2) # 线程2
# 启动线程
t1.start()
t2.start()
sleep(5)
print('---结束---:%s'%ctime())
运行同步代码,可查看到已经创建2个线程,让他们各自对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)
# 创建一个互斥锁
# 默认是未上锁的状态,可以删除锁后查看资源争夺的结果
mutex = threading.Lock()
# 创建2个线程,让他们各自对g_num加1000000次
p1 = threading.Thread(target=test1, args=(1000000,))
p1.start()
p2 = threading.Thread(target=test2, args=(1000000,))
p2.start()
# 等待计算完成time.sleep(5)print("2个线程对同一个全局变量操作之后的最终结果是:s" g_num)
正则表达式
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。re.match 方法尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None。
运行下方代码,使用re模块进行字符串的匹配
import re
print(re.match('www', 'www.huawei.com').span()) # 在起始位置匹配
print(re.match('com', 'www.huawei.com')) # 不在起始位置匹配
运行下方代码,可用re.search 方法扫描整个字符串并返回第一个成功的匹配
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!!" )
运行下方代码,一起来感受下Python 的 re 模块,re.sub 方法用于替换字符串中的匹配项:
import re
phone = "2019-0101-000 # 这是一个电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print("电话号码是: ", num)# 删除非数字(-)的字符串
num = re.sub(r'D', "", phone)
print("电话号码是 : ", num)
魔法方法
在感受完Python的多线程和正则表达式后,更不能错过这个神奇的东西——魔法方法,所谓魔法方法,是指在Python中,有一些内置好的特定的方法,这些方法在进行特定的操作时会自动被调用,比如_init__:初始化函数,在创建实例对象时,为实例属性赋值使用。不信,我们可以试试运行下方代码,则会返回结果:小狗:dog。
class Dog(object):
def __init__(self, name):
self.name = name
print("小狗:%s"%(self.name))
dog = Dog("dog")
通过本次实验,可以轻松体验Python编程语言的高级用法,还在等什么?马上进入 沙箱实验室 ,体验沙箱实验《使用ModelArts中开发工具学习Python(高级)》,深入感受正则表达式和魔法方法吧!