6个值得深思的Python代码
首先精选了6个我认为值得深思的Python代码,希望对正在学习Python的你有所帮助。1.类有两个方法,一个是__new__,一个是__init__,有什么区别,先执行哪个?类测试(对象):def__init__(self):打印(“测试->__init__”)def__new__(cls):打印(“测试->__new__”)返回super().__new__(cls)a=test()运行结果如下:test->__new__test->__init__再看一个例子classtest2(object):def__init__(self):print("test2->__init__")def__new__(cls):print("test2->__new__")returnobject()b=test2()运行结果如下:test2->__new__官方解释如下:__init__用于初始化类实例,第一个参数为self,代表对象本身,并且不需要返回值。__new__返回一个新类的实例。第一个参数是cls,代表类本身,必须有返回值。显然,可以通过先实例化类来产生对象。很明显,先执行new,再执行init__。其实只要__new返回类本身的一个实例,它就会自动调用init进行初始化。但是有一个例外,如果new返回的是另一个类的实例,则不会调用当前类的__init__。下面我们分别输出对象a和对象b的类型:print(type(a))#print(type(b))#可以看出a是test类的一个对象,b是object的一个对象。参考文档:https://docs.python.org/3/reference/datamodel.html?highlight=__new__#object.__new__2、map函数返回的对象map()函数的第一个参数很有趣,后面的第二个参数通常是一个列表,第三个参数可以写成list也可以不写,作用是对list中list的每个元素依次调用函数fun。>>>b=map(lambdax:x*x,[1,2,3])>>>[iforiinb][1,4,9]>>>[iforiinb][]>>>有没有发现,第二次输出b中的元素时,发现是空的。原因是map()函数返回一个迭代器,并在返回结果上使用yield,这是为了节省内存。例如:#encoding:UTF-8defyield_test(n):foriinrange(n):yieldcall(i)#dosomethingelsedefcall(i):returni*2#useforloopx=yield_test(5)print([iforiinx])print([iforiinx])执行结果为:[0,2,4,6,8][]这里如果不使用yield,则在list中的元素很大时,会全部加载到内存中,既浪费内存又降低效率。3.正则表达式不需要编译吗?比如现在有需求。对于文本China,使用正则表达式匹配标签中的“China”,类的类名不确定。有两种方法,代码如下:>>>importre>>>text='China
'>>>#Methodone...>>>re.findall('
(.*) ',text)['中国']>>>#方法2...>>>regex='
(.*) '>>>pattern=re.compile(regex)>>>re.findall(pattern,text)['China']>>>为什么要用compile多写两行这里的代码??原因是compile将正则表达式编译成一个对象,加速它并重用它。4.[[1,2],[3,4],[5,6]]一行代码展开列表,得到[1,2,3,4,5,6]>>>[jforiin[[1,2],[3,4],[5,6]]forjini][1,2,3,4,5,6]>>>5,一行代码将字符串"->"插入"abcdefg"中每个字符的中间>>>"->".join("abcdef")'a->b->c->d->e->f'>>>这里也建议使用os.path.join()来加入操作系统的文件路径。6、压缩函数zip()函数在运行时以一个或多个序列(可迭代对象)为参数,返回一个元组列表。同时将这些序列的并排元素配对。zip()参数可以接受任何类型的序列,也可以有两个以上的参数;当传入的参数长度不同时,zip可以根据最短的序列长度自动截取得到元组。>>>a=[1,2]>>>b=(3,4)>>>zip(a,b)
>>>foriinzip(a,b):...print(i)...(1,3)(2,4)>>>a="ab">>>b="xyz">>>foriinzip(a,b):...打印(i)...('a','x')('b','y')>>>以上就是本次分享的全部内容,如果您觉得文章还不错,欢迎关注公众号:Python编程学习圈,每日干货分享,发送“J”还能领取海量学习资料。或者去编程学习网了解更多编程技术知识。