分享6 个值得收藏的 Python 代码
作者:秃头程序员 发布时间:2022-12-31 05:09:57
1、类有两个方法,一个是 new,一个是 init,有什么区别,哪个会先执行呢?
class test(object): def __init__(self): print("test -> __init__") def __new__(cls): print("test ->__new__") return super().__new__(cls)a = test()
运行结果如下:
test ->__new__test -> __init__
再来看另一个例子:
class test2(object): def __init__(self): print("test2 -> __init__") def __new__(cls): print("test2 ->__new__") return object() b = test2()
运行结果如下:
test2 ->__new__
这里给出官方的解释:init
作用是类实例进行初始化,第一个参数为 self,代表对象本身,可以没有返回值。new 则是返回一个新的类的实例,第一个参数是 cls 代表该类本身,必须有返回值。很明显,类先实例化才能产能对象,显然是 new
先执行,然后再 init
,实际上,只要 new 返回的是类本身的实例,它会自动调用 init 进行初始化。但是有例外,如果 new 返回的是其他类的实例,则它不会调用当前类的 init。
下面我们分别输出下对象 a 和对象 b 的类型:
print( type(a))#<class '__main__.test'> print( type(b))#<class 'object'>
可以看出,a 是 test 类的一个对象,而 b 就是 object
的对象。
2、map 函数返回的对象
map()
函数第一个参数是 fun,第二个参数是一般是 list,第三个参数可以写 list,也可以不写,作用就是对列表中 list 的每个元素顺序调用函数 fun
。
>>> b=map(lambda x:x*x,[1,2,3])>>> [i for i in b][1, 4, 9]>>> [i for i in b][]>>>
有没有发现,第二次输出 b 中的元素时,发现变成空了。原因是 map()
函数返回的是一个迭代器,并用对返回结果使用了 yield,这样做的目的在于节省内存。
举个例子:
#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 的类名是不确定的。
有两种方法,代码如下:
>>> import re>>> text = '<div class="nam">中国</div>'>>> #方法一...>>> re.findall('<div class=".*">(.*)</div>',text)['中国']>>> #方法二...>>> regex='<div 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]
>>> [j for i in [[1,2],[3,4],[5,6]] for j in i][1, 2, 3, 4, 5, 6]>>>
5、一行代码将字符串 "->" 插入到 "abcdefg"中每个字符的中间
>>> "->".join("abcdef")'a->b->c->d->e->f'>>>
这里也建议多使用 os.path.join()
来拼接操作系统的文件路径。
6、zip 函数
zip()
函数在运算时,会以一个或多个序列(可迭代对象)做为参数,返回一个元组的列表。同时将这些序列中并排的元素配对。zip()
参数可以接受任何类型的序列,同时也可以有两个以上的参数;当传入参数的长度不同时,zip
能自动以最短序列长度为准进行截取,获得元组。
>>> a=[1,2]>>> b=(3,4)>>> zip(a,b)<zip object at 0x000001A20201AA08>>>> for i in zip(a,b):... print(i)...(1, 3
来源:https://juejin.cn/post/7049251735210033189
猜你喜欢
- 有时在处理不规则数据时需要提取文本包含的时间日期。dateutil.parser模块可以统一日期字符串格式。datefinder模块可以在字
- 古巴比伦王颁布了汉摩拉比法典,刻在黑色的玄武岩,距今已经三千七百多年,你在橱窗前…熟悉吧?没错,这就是周董的爱在西元前歌词。前不久工作不是很
- np.percentilenumpy.percentile(a, q, axis=None, out=None, overwrite_inp
- 1、IIS为一个死循的执行过程设定执行时间(缺省为90秒)超时事件:<%response.buffer=true%><BO
- MySql5.0以后均支持存储过程,最近有空,研究了一下这个格式:CREATE PROCEDURE 过程名 ([过程参数[,...]])[特
- 作者:HelloGitHub-追梦人物文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库搜索是一个复杂的功能,但对于
- up.htm'::::::: 此程序属扬子原创 ::::::::::::::::::':::::: 在sql2000,200
- 前言快过年了,又到了公司年底评级的时候了。今年的评级和往常一下,每个人都要填写公司的民主评议表,给各个同事进行评价打分,然后部门收集起来根据
- 在你的程序初始化时使用如下代码: <?php $Php2Html_FileUrl = $_SERVER["REQU
- 写在前面作为一名找不到工作的爬虫菜鸡人士来说,登陆这一块肯定是个比较大的难题。 从今天开始准备一点点对大型网站进行逐个登陆破解。加
- 上一小节讲解了行高与单行纯文字的垂直居中,而如果行内含有图片和文字,在浏览器内浏览时,读者可以发现文字和图片在垂直方向并不是沿中线居中,而是
- 最近,Analysis with Programming加入了Planet Python。作为该网站的首批特约博客,我这里来分享一下如何通过
- 主要就是通过jieba的posseg模块将一段文字分段并赋予不同字段不同意思。然后通过频率计算出热频词数据放在文章里面了,就不用花积分下载了
- QComboBox 是一个允许用户从列表选项中选择一项的控件。#!/usr/bin/python3# -*- coding: utf-8 -
- 前言:今天教大家通过Python进行Socket网络编程(做一个聊天程序),可以实现在不同的主机(电脑)之间进行通话。具体效果如何,接着往下
- 一、Linux系统查看Python路径whereis python此命令将会列出系统所安装的所有版本的Python的路径效果如下: 
- 回顾一下已经了解的数据类型:int/str/bool/list/dict/tuple还真的不少了.不过,python是一个发展的语言,没准以
- 互联网上不计其数的信息本质上都是一个一个的HTML文档组成的,通过链接将它们串联起整个互联网。这就犹如骨肉之于人体一样,只有通过经脉才能将它
- 因为要用到过滤一组中重复的数据,使之变成没有重复的一组数据的功能,百度了一下,居然有朋友乱写,而且比较多,都没有认真测试过,只对字符可以,但
- Python语言有一种独特的推导式语法,相当于语法糖的存在,可以帮助你在某些场合写出较为精简酷炫的代码。但没有它,也不会有太多影响。Pyth