1、hasattr()getattr()setattr()函数使用详解?
hasattr(object,name)函数:判断一个对象里面是否有name属性或者name方法,返回bool值,有name属性(方法)返回True,否则返回False。注意:name要使用引号括起来。
classfunction_demo(object):
name='demo'
def run(self):
return"hellofunction"
functiondemo=function_demo()
res=hasattr(functiondemo,'name')#判断对象是否有name属性,True
res=hasattr(functiondemo,"run")#判断对象是否有run方法,True
res=hasattr(functiondemo,"age")#判断对象是否有age属性,Falsw9.print(res)
getattr(object,name[,default])函数:
获取对象object的属性或者方法,如果存在则打印出来,如果不存在,打印默认值,默认值可选。注意:如果返回的是对象的方法,则打印结果是:方法的内存地址,如果需要运行这个方法,可以在后面添加括号()。
1.functiondemo=function_demo()
2.getattr(functiondemo,'name')#获取name属性,存在就打印出来---demo
3.getattr(functiondemo,"run")#获取run方法,存在打印出方法的内存地址---<boundmethodfunction_demo.runof<__main__.function_demoobjectat0x10244f320>>
4.getattr(functiondemo,"age")#获取不存在的属性,报错如下:
5.Traceback(mostrecentcalllast):
6.File"/Users/liuhuiling/Desktop/MT_code/OpAPIDemo/conf/OPCommUtil.py",line39,in<module>
7.res=getattr(functiondemo,"age")
8.AttributeError:'function_demo'objecthasnoattribute'age'
9.getattr(functiondemo,"age",18)#获取不存在的属性,返回一个默认值
setattr(object,name,values)函数:
给对象的属性赋值,若属性不存在,先创建再赋值
1.classfunction_demo(object):
2. name='demo'
3. def run(self):
4. return"hellofunction"
5.functiondemo=function_demo()
6.res=hasattr(functiondemo,'age')#判断age属性是否存在,False
7.print(res)
8.setattr(functiondemo,'age',18)#对age属性进行赋值,无返回值9.res1=hasattr(functiondemo,'age')#再次判断属性是否存在,True
综合使用:
1.classfunction_demo(object):
2. name='demo'
3. def run(self):
4. return"hellofunction"
5.functiondemo=function_demo()
6.res=hasattr(functiondemo,'addr')#先判断是否存在ifres:
7.addr=getattr(functiondemo,'addr')
8.print(addr)else:
9.addr=getattr(functiondemo,'addr',setattr(functiondemo,'addr','北京首都'))
10.#addr=getattr(functiondemo,'addr','美国纽约')
11.print(addr)
2、lambda函数的使用
lambda函数是匿名函数;使用lambda函数能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤;
m = lambda i:[x*i for x in range(5)]
print(m(2))
[0, 2, 4, 6, 8]
以下结果是什么?
def multipliers():
return[lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
上面代码输出的结果是[6,6,6,6](不是我们想的[0,2,4,6])。
你如何修改上面的multipliers的定义产生想要的结果?
上述问题产生的原因是Python闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内进行查找。因此,当任何由multipliers()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值3。
下面是解决这一问题的一些方法。一种解决方法就是用Python生成器。
def multipliers():
for i in range(4):
yield lambda x:i*x
print([m(2) for m in multipliers()])
另外一个解决方案就是创造个闭包,利用默认函数立即绑定
def multipliers():
return [lambda x,i=i:i*x for i in range(4)]
print([m(2) for m in multipliers()])
3、单例
class A(object):
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance
单例模式的应用场景:
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。1.网站的计数器2.应用配置3.多线程池4.数据库配置,数据库连接池5.应用程序的日志应用...
4、装饰器
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景。比如:插入日志、性能测试、事务处理、缓存、权限的校验等场景有了装饰器就可以抽离出大量的与函数功能本身无关的雷同代码并发并继续使用。
import time
def timeit(func):
def wrapper():
start = time.clock()
func()
end =time.clock()
print('used:%s'%(end-start))
return wrapper
@timeit
def foo():
a=0
for i in range(20000000):
a+=i
print(a)
return a
foo()
5、python numpy 中ndarry转成string后怎么转回来
>>> import numpy as np
>>> a = np.arange(12).reshape(3, 4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> s = a.tostring()
>>> aa = np.fromstring(a)
>>> aa
array([ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324,
1.48219694e-323, 1.97626258e-323, 2.47032823e-323,
2.96439388e-323, 3.45845952e-323, 3.95252517e-323,
4.44659081e-323, 4.94065646e-323, 5.43472210e-323])
>>> aa = np.fromstring(a, dtype=int)
>>> aa
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> aa = np.fromstring(a, dtype=int).reshape(3, 4) #dtype:uint8,reshape:(480, 640, 3)
>>> aa
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
6、python字符串自动填充
zfill()则用于向数值的字符串表达式左侧填充0, 该函数可以正确理解正负号:
>>> '12'.zfill(5)
'00012’
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'
=====================================
在Python中打印字符串时可以调用ljust(左对齐),rjust(右对齐),center(中间对齐)来输出整齐美观的字符串
python实现指定字符串补全空格的方法:
如果希望字符串的长度固定,给定的字符串又不够长度,我们可以通过rjust,ljust和center三个方法来给字符串补全空格
rjust,向右对其,在左边补空格
s = "123".rjust(5) assert s == " 123"
ljust,向左对其,在右边补空格
s = "123".ljust(5) assert s == "123 "
center,让字符串居中,在左右补空格
s = "123".center(5) assert s == " 123 "
7、python输出指定格式的日期
一、参考解法:
1 2 3 4 5 6 7 8 9 |
|
一、参考解法:
1 2 3 4 5 6 7 |
|
把字符串格式的日期转成datetime, datetime.datetime.strptime("2014/11/13 22:00:00",'%Y/%m/%d %H:%M:%S')
8、ubuntu屏幕截图
Alt+Pr Scrn
9、python里输入sql语句操作mysql
import pymysql
db = pymysql.connect(host='localhost', user='root', passwd='root', db="db", charset="utf8")
cur = db.cursor()
cur.execute("SELECT * FROM t_user_info limit 10 ")
print(cur.fetchall())
10、mysql sql语句