当前位置: 首页 > 后端技术 > Python

6个值得深思的Python代码_0

时间:2023-03-26 02:04:49 Python

首先精选了6个我认为值得深思的Python代码,希望对正在学习Python的你有所帮助。1.类有两个方法,一个是new,一个是init,有什么区别,先执行哪个?类测试(对象):def__init__(self):print("test->__init__")def__new__(cls):print("test->__new__")returnsuper().__new__(cls)a=test()结果如下:test->__new__test->init再看一个例子classtest2(object):def__init__(self):print("test2->__init__")def__new__(cls):print("test2->__new__")returnb=test2()运行结果如下:test2->__new__官方解释如下:init的作用是初始化类实例,第一个参数是self,代表对象本身,可以没有返回值。new返回一个新类的实例。第一个参数是cls,代表类本身,必须有返回值。显然,类必须实例化才能产生对象。很明显,先执行new,再执行init。其实new只要返回类本身的一个实例,就会自动调用init进行初始化。但是有一个例外,如果new返回的是另一个类的实例,则不会调用当前类的init。下面我们分别输出对象a和对象b的类型:print(type(a))print(type(b))可以看出,a是一个对象测试类的,b是对象的对象。2、map函数返回的对象map()函数的第一个参数fun,第二个参数一般是一个列表,第三个参数可以写成列表也可以不写。函数fun被顺序调用。b=map(lambdax:x*x,[1,2,3])[b中的i][1,4,9][b中的i][]有没有注意到,第二次输出b中的元素时,发现是空的。原因是map()函数返回一个迭代器,并在返回结果上使用yield,这是为了节省内存。例如:编码:UTF-8defyield_test(n):foriinrange(n):yieldcall(i)#dosomeotherthingsdefcall(i):returni*2使用for循环x=yield_test(5)print([iforiinx])print([iforiinx])执行结果为:[0,2,4,6,8]这里如果不使用yield,当list中的元素很大时,会全部加载到内存中,既浪费内存又降低效率。3.正则表达式不需要编译吗?比如现在有需求。对于文本China

,使用正则表达式匹配标签中的“China”,类的类名不确定。有两种方法,代码如下:importretext='China
'方法一re.findall('(.*)
',text)['中国']方法2regex='(.*)
'pattern=re.compile(regex)re.findall(pattern,text)['中国']这里为什么要用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):...print(i)('a','x')('b','y')本次分享到此结束,离开前请点个赞