分享6 个值得收藏的 Python 代码
1、类有两个方法一个是 new,一个是 init,有什么区别哪个会先执行呢1classtest(object):def__init__(self):print(test - __init__)def__new__(cls):print(test -__new__)returnsuper().__new__(cls)atest()运行结果如下test -__new__test - __init__再来看另一个例子1classtest2(object):def__init__(self):print(test2 - __init__) def__new__(cls):print(test2 -__new__)returnobject() btest2()运行结果如下test2 -__new__这里给出官方的解释init作用是类实例进行初始化第一个参数为 self代表对象本身可以没有返回值。new 则是返回一个新的类的实例第一个参数是 cls 代表该类本身必须有返回值。很明显类先实例化才能产能对象显然是new先执行然后再init实际上只要 new 返回的是类本身的实例它会自动调用 init 进行初始化。但是有例外如果 new 返回的是其他类的实例则它不会调用当前类的 init。下面我们分别输出下对象 a 和对象 b 的类型1print(type(a))#class __main__.test print( type(b))#class object可以看出a 是 test 类的一个对象而 b 就是object的对象。2、map 函数返回的对象map函数第一个参数是 fun第二个参数是一般是 list第三个参数可以写 list也可以不写作用就是对列表中 list 的每个元素顺序调用函数fun。1 bmap(lambdax:x*x,[1,2,3]) [iforiinb][1,4,9] [iforiinb][]有没有发现第二次输出 b 中的元素时发现变成空了。原因是map()函数返回的是一个迭代器并用对返回结果使用了 yield这样做的目的在于节省内存。举个例子1#encoding:UTF-8 def yield_test(n): for i in range(n): yield call(i) #做一些其它的事情 def call(i): return i*2 #使用for循环 x yield_test(5)print([i for i in x])print([i for i in x])执行结果为[0, 2, 4, 6, 8] []这里如果不用yield那么在列表中的元素非常大时将会全部装入内存这是非常浪费内存的同时也会降低效率。3、正则表达式中 compile 是否多此一举比如现在有个需求对于文本中国用正则匹配出标签里面的“中国”其中 class 的类名是不确定的。有两种方法代码如下1importre textdiv classnam中国/div#方法一... re.findall(div class.*(.*)/div,text)[中国] #方法二... regexdiv class.*(.*)/div pattern re.compile(regex) re.findall(pattern,text)[中国]这里为什么要用compile多写两行代码呢 原因是compile将正则表达式编译成一个对象加快速度并重复使用。4、[[1,2],[3,4],[5,6]]一行代码展开该列表得出[1,2,3,4,5,6]1 [jforiin[[1,2],[3,4],[5,6]]forjini][1,2,3,4,5,6]5、一行代码将字符串 - 插入到 abcdefg中每个字符的中间1-.join(abcdef)a-b-c-d-e-f这里也建议多使用os.path.join()来拼接操作系统的文件路径。6、zip 函数zip()函数在运算时会以一个或多个序列可迭代对象做为参数返回一个元组的列表。同时将这些序列中并排的元素配对。zip()参数可以接受任何类型的序列同时也可以有两个以上的参数;当传入参数的长度不同时zip能自动以最短序列长度为准进行截取获得元组。1 a[1,2] b(3,4)zip(a,b)zipobjectat0x000001A20201AA08foriinzip(a,b):...print(i)...(1,3到此这篇关于分享6 个值得收藏的Python代码的文章就介绍到这了