首页 > 编程语言 > 详细

【Python】 零碎知识积累 I

时间:2017-03-23 02:07:22      阅读:264      评论:0      收藏:0      [点我收藏+]

  零碎 I

  大概也是出于初高中时学化学,积累各种反应和物质的习惯,还有大学学各种外语时一看见不认识的词就马上记下来的习惯,形成了一种能记一点是一点的零碎知识记录的癖好。这篇文章就是专门拿来记录这些零碎知识的,没事的时候看看回忆回忆,说不定也能学到点什么。

 

  ■  关于输出不同进制数

  在格式化输出字符串中可以写%d,%x,%o来分别输出十、十六、八进制的值

  但是并没有二进制的转换输出,想要二进制时可以用bin函数,bin(num)会输出‘0bxxxx‘,xxxx就是num的二进制表达了

 

  ■  其实习惯了写for A in ... 的形式,但很多时候可以把A替换为A,B这种元组形式,这样可以让表达更加清晰。比如

for item in dict.items():
#换成
for key,value in dict.items():

  

  ■  要善于看文档。碰到不认识的函数,模块等可以看其__doc__,或者help(...),以及。。度娘

 

  ■  import keyword;print keyword.kwlist 可以查看python中所有的关键字,感觉没有想象的那么多..+

  

  ■  id函数可以用来查看某个对象在内存中的地址值,借助id可以来看两个对象是不是引用了同一个内存地址还是只是值上的相等。

  

  ■  给函数传递参数时,如果混合了虚名实名参数,那么虚名参数一定要写在实名参数之前,否则python无法识别参数顺序,并报错:

func(value1,value2,param3=value3)    #正确

func(param3=value3,value1,value2)    #错误

 

  ■  类中的方法可以创建本类的实例。当然不包括构造方法,否则就无限递归了。。

 

  ■  字典通过等号赋值是浅复制,也就是创建一个新变量,其指向地址和之前字典指向的地址一样。而dict.copy()则是深复制,把原有字典整个拷贝了一份到内存中另外一个地址,那个地址再和新变量关联起来。

 

  ■  eval 和 repr 和 exec

  这三个函数看起来都很黑科技

  1.  eval是evaluate的简称,可以将符合格式的str转化成list,tuple,dict等数据格式。除了转换格式之外,eval也可以解析字符串,调用python函数,并且返回此语句的返回值。,比如eval(‘open("file","r").read()‘)可以返回某文件的内容(但是不能有语句 比如eval(‘import os‘)或者eval(‘print 1‘)都是会报错的)

  2.  repr是represent的简称,将各种数据类型转化成str,是eval的一种逆操作。但是repr和str()不同。

    简单来说,repr是把传递进来的参数原原本本的转化成一个字符串,甚至包括引号,举例子如下:

>>>print repr(a\nb)
a\nb       #注意是带引号的
>>>print ra\nb
a\nb    #不带引号但是因为是r开头的字符串,不对\n做转义解释
>>>print a\nb
a
b

    而str则是致力于生成一个给人看的字符串,虽然在内存中他有可能还是带有未转义字符的,但是print出来之后是人可以一眼看明白的

    简而言之,print repr(...)所得到的东西就是...,连引号都算在里面。当然,这个用repr转化字符串并没有啥实际意义,因为转化出来的东西肯定有引号。总之要清楚这两者不一样就好了

  3.  exec用来将字符串转化为语句。

    虽然看起来和eval好像很像,但区别在于eval是返回值的,而exec不返回值,只做操作

    如:

>>> eval(1+2)
3
>>> exec(1+2)    #返回值是None,但是内存中进行了1+2的计算
>>> eval(print \‘1+2\‘ )
SyntaxError: invalid syntax
>>> exec(print \‘1+2\‘ )
1+2

    另外,eval和exec除了第一个参数是一个字符串之外,还可以加上一个第二个参数,是个字典。这个字典的意义就是为前面字符串里的特定变量赋值,相当于一个小命名空间:

>>>exec(print a+1,{a:2})
3

    再另外,eval和exec是有一定安全风险的,比如一个web应用接受用户的一些数据来做操作,可能你期盼用户发送一个规则的字符串过来然后懒一点直接用eval把它给python化,但是如果他传过来一个‘open("file","w").close()‘,如果直接eval掉,那就相当于把之前存在的file给清了。。这样这个用户就达到了攻击目的。

 

  ■  上节中说到了str和repr的区别,那就顺便提一下__str__和__repr__的区别。这两个魔法方法的共同点是要返回一个字符串,但是这个字符串被用在不同的地方,举例如下:

class Test(object):
    def __init__(self):
        pass

    def __repr__(self):
        return "Expression of repr"

    def __str__(self):
        return "Expression of str"

######在python shell中######
>>>sample = Test()
>>>sample
Expression of repr
>>>print sample
Expression of str

  也就是说,通常我之前所说的对象在内存中的值,其实是指这个类在定义__repr__时返回的字符串,这个字符串也是函数repr(sample)的返回值。而print语句,则是提取出__str__方法的返回值并且把它输出到stdout上。

  

  ■  在遍历字典时,用for key,value in dict.items()更加直观。

 

  ■  lambda语句和lambda函数(匿名函数)

    和def一个函数相对来看,lambda语句的作用是建立一个匿名函数,并返回这个函数对象。函数处理过程较为简单的函数可以用lambda来简化代码。另外,可以把返回出来的函数对象实名化:

add = lambda a,b : a+b    
#冒号右边紧跟的就是返回值,不能是None。也可以是个返回值不为None的函数嘛
#冒号左边写这个匿名函数的参数,可以写零到若干个。

 

    lambda的实际应用有很多,我暂时可以想到的就有序列在进行sorted时用的key参数可以是个匿名函数对象来实现根据某个指标排序。另外wxpython中的事件绑定,Bind方法,若用匿名函数可以实现向事件处理函数传递参数的功能。

 

  ■  不要忘了max(seq)和min(seq)两个显而易见的函数。挺有用的

【Python】 零碎知识积累 I

原文:http://www.cnblogs.com/franknihao/p/6602639.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!