`
nanfang
  • 浏览: 8825 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Python隐藏功能

 
阅读更多

本文主要内容来自StackOverflow上的一个热贴:http://stackoverflow.com/questions/101268/hidden-features-of-python,我进行了些翻译和整理工作。希望对大家有帮助,同时此文遵循GPL,可以随意转载,只要能帮到每个喜爱Python的程序员就好。

 

---------------正文开始---------------

 

1. 函数参数解箱(Function argument unpacking)

def draw_point(x, y):
    # do some magic

point_foo = (3, 4)
point_bar = {'y': 3, 'x': 2}

draw_point(*point_foo)
draw_point(**point_bar)

 这个其实不算太隐藏的功能了,每个python程序员都应该知道

 

2. 大括号

如果你不想使用缩进,而是使用C语言风格的大括号来定义函数块,那么这样:

from __future__ import braces

这个也许是最没用的隐藏特性

 

3. 链式的比较操作

看代码就明白了:

>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20 
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True

 比方说,你想写 if x > 1 and x <10,那么写成 if 1<x <10,这样更简单并且表达力更强

 

4. 装饰器(Decorator)

Decorator可以用一个函数给另外一个函数上个套,看代码

>>> def print_args(function):
>>>     def wrapper(*args, **kwargs):
>>>         print 'Arguments:', args, kwargs
>>>         return function(*args, **kwargs)
>>>     return wrapper

>>> @print_args
>>> def write(text):
>>>     print text

>>> write('foo')
Arguments: ('foo',) {}
foo

这里的write('foo'),其实等于 print_args(write('foo')),装饰器有点像Java的annotation,但是简单,优雅,直接了当的多了。装饰器还有很多更深入的用法,建议大家google深入学习一下

 

5. 字典的get方法

对于一个字典(dict) d,除了可以用d['key']访问元素,也可以用d.get('key')。当字典不包含某键值时,前一种方法会报异常,而后一种则会返回一个默认值,缺省的默认值是None。下面代码展示这种用法:

sum[value] = sum.get(value, 0) + 1 

 

6. Doctest: 文档注释和单元测试写到一起

这个需要用到doctest这个内置module,下面的例子来自Python文档:

def factorial(n):
    """Return the factorial of n, an exact integer >= 0.

    If the result is small enough to fit in an int, return an int.
    Else return a long.

    >>> [factorial(n) for n in range(6)]
    [1, 1, 2, 6, 24, 120]
    >>> factorial(-1)
    Traceback (most recent call last):
        ...
    ValueError: n must be >= 0

    Factorials of floats are OK, but the float must be an exact integer:
    """

    import math
    if not n >= 0:
        raise ValueError("n must be >= 0")
    if math.floor(n) != n:
        raise ValueError("n must be exact integer")
    if n+1 == n:  # catch a value like 1e300
        raise OverflowError("n too large")
    result = 1
    factor = 2
    while factor <= n:
        result *= factor
        factor += 1
    return result

def _test():
    import doctest
    doctest.testmod()    

if __name__ == "__main__":
    _test()

 

7. 切片省略语法 (Ellipsis Slicing Syntax)

Python的Slicing语法所有语言中几乎最好的,但它还支持省略号哟,见如下代码:

>>> class TestEllipsis(object):
...     def __getitem__(self, item):
...         if item is Ellipsis:
...             return "Returning all items"
...         else:
...             return "return %r items" % item
... 
>>> x = TestEllipsis()
>>> print x[2]
return 2 items
>>> print x[...]
Returning all items

也就是说要使用这种语法,需要自定义类

 

8. 列举(enumerate)

注意这不是指很多语言中支持的枚举,当遍历一个列表时,我们常需要知道元素的坐标,那么可以这样:

>>> a = ['a', 'b', 'c', 'd', 'e']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
3 d
4 e
>>>
 

9. for...else语法

for循环后面还可以跟个else,看下面的代码

for i in foo:
    if i == 0:
        break
else:
    print("i was never 0")
 

 else的部分总是会在循环结束后执行,除非for循环遇到break,这个语法有点绕,else这个关键字也不太好

 

10. 函数也可以作为iter()的参数

不熟悉iter的同学请先自行google之,下面的代码我直接摘抄了python文档

 

with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)

看来函数作为iter参数应该是主流才是

 

11. 创建Generator对象

如果你这么写

x=(n for n in foo if bar(n))

那你可以这么用

 

for n in x:

其实你也可以这么做达到同样的效果

 

[x = [n for n in foo if bar(n)]

但是区别就是前者产生的x是个gerenrator对象,后者的x是个list。为什么这点微妙的区别我们需要注意:性能。前者有时候比后者想能好很多。

 

12. import this

建议大家试着执行一下这行,然后你会看到

 

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

 好了,可以开始享受编程的乐趣了!

 

13. 交换变量(swapping)

如何优雅的交换两个变量值,需要中间变量或者用匪夷所思的位操作吗?看代码吧

 

>>> a = 10
>>> b = 5
>>> a, b
(10, 5)

>>> a, b = b, a
>>> a, b
(5, 10)
 

14. 列表跳格 (list stepping)

直接看段代码

 

a = [1,2,3,4,5]
>>> a[::2]  # iterate over the whole list in 2-increments
[1,3,5]

 每隔两格去一个元素,那么能倒着取吗,可以:

 

>>> a[::-1]
[5,4,3,2,1]
 

15. __missing__

通过覆盖这个函数对dict扩展,给不存在的key一个默认的值

>>> class MyDict(dict):
...  def __missing__(self, key):
...   self[key] = rv = []
...   return rv
... 
>>> m = MyDict()
>>> m["foo"].append(1)
>>> m["foo"].append(2)
>>> dict(m)
{'foo': [1, 2]}

 实际上,python的collections模块里提供了一个defaultdict类,提供了类似的功能

>>> from collections import defaultdict
>>> m = defaultdict(list)
>>> m["foo"].append(1)
>>> m["foo"].append(2)
>>> dict(m)
{'foo': [1, 2]}
 

16. 多行正则表达式

为了使正则式更好读,我们可以把它拆成多行

>>> pattern = """
... ^                   # beginning of string
... M{0,4}              # thousands - 0 to 4 M's
... (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
...                     #            or 500-800 (D, followed by 0 to 3 C's)
... (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
...                     #        or 50-80 (L, followed by 0 to 3 X's)
... (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
...                     #        or 5-8 (V, followed by 0 to 3 I's)
... $                   # end of string
... """
>>> re.search(pattern, 'M', re.VERBOSE)
 其实重点就是这个re.VERBOSE了

 

17. 带名字的字符串格式化(format)

大家对字符串格式化应该已经很熟悉了,除了使用%s作为占位符,我们还可以给占位符一个名字

>>> print "The %(foo)s is %(bar)i." % {'foo': 'answer', 'bar':42}
The answer is 42.

>>> foo, bar = 'question', 123

>>> print "The %(foo)s is %(bar)i." % locals()
The question is 123.

 还有一种新的方式

>>> print("The {foo} is {bar}".format(foo='answer', bar=42))

 

18. 嵌套的list conprehensions

如果想写一个双重循环的话,考虑用用下面两种方式

[(i,j) for i in range(3) for j in range(i) ]    
((i,j) for i in range(4) for j in range(i) )

 提醒,第一种产生一个list,第二种产生一个generator

 

19. 动态创建一个新类型

>>> NewType = type("NewType", (object,), {"x": "hello"})
>>> n = NewType()
>>> n.x
"hello"

 上面代码等价于

>>> class NewType(object):
>>>     x = "hello"
>>> n = NewType()
>>> n.x
"hello"

可能不常用,但是还是知道为好

 

20. *.pth文件

Python比较搓的地方是它混乱的包管理,除了在环境变量PYTHONPATH里加依赖,可以考虑使用*.pth文件。做法是找到你的site-packages目录,在里面放一个*.pth文件,里面写上你需要加载的路径。那么这些路径就会自动加载到sys.path

 

21. ROT13 encoding

ROT13是啥?我google了一下后,它的全称叫回转13位,是一种在源代码里隐藏八卦信息的编码

如果在你的代码头加上

# -*- coding: rot13 -*-

 那么大家可以用ROT13来写代码了,代码这可能长成这样

cevag "Uryyb fgnpxbiresybj!".rapbqr("rot13")

 

22. Debug正则表达式

其实就是利用re.DEBUG这个flag了

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
    re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
  subpattern None
    literal 61
    subpattern 1
      in
        literal 45
        literal 43
      max_repeat 1 2
        in
          range (48, 57)
literal 93
subpattern 2
  min_repeat 0 65535
    any None
in
  literal 47
  literal 102
  literal 111
  literal 110
  literal 116

 如果还想同时用其他的flag咋搞

>>> re.compile("""
 ^              # start of a line
 \[font         # the font tag
 (?:=(?P<size>  # optional [font=+size]
 [-+][0-9]{1,2} # size specification
 ))?
 \]             # end of tag
 (.*?)          # text between the tags
 \[/font\]      # end of the tag
 """, re.DEBUG|re.VERBOSE|re.DOTALL)

 

23. 给生成器(generator)传值

比如你有以下函数

def mygen():
    """Yield 5 until something else is passed back via send()"""
    a = 5
    while True:
        f = (yield a) #yield a and possibly get f in return
        if f is not None: 
            a = f  #store the new value

 可以这样给它传值

>>> g = mygen()
>>> g.next()
5
>>> g.next()
5
>>> g.send(7)  #we send this back to the generator
7
>>> g.next() #now it will yield 7 until we send something else
7
 

24. 交互模式下用tab做自动补齐

如何做到:

try:
    import readline
except ImportError:
    print "Unable to load readline module."
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")


>>> class myclass:
...    def function(self):
...       print "my function"
... 
>>> class_instance = myclass()
>>> class_instance.<TAB>
class_instance.__class__   class_instance.__module__
class_instance.__doc__     class_instance.function
>>> class_instance.f<TAB>unction()

使用这个特性必须设置PYTHONSTARTUP变量

如果使用iPython,已经自动有个这个特性了,所以说这个特性用处不大了

 

25. 三元表达式(ternary expression)

最基本的形式

x = 3 if (y == 1) else 2

在这个基础上我们可以做个if else链了

x = 3 if (y == 1) else 2 if (y == -1) else 1

然后,咱还可以这样执行函数

(func1 if y == 1 else func2)(arg1, arg2) 

初始话对象也可以

x = (class1 if y == 1 else class2)(arg1, arg2)

 

26. try/except/else

出了for, 连try也可以加个elsetry:

try:
  put_4000000000_volts_through_it(parrot)
except Voom:
  print "'E's pining!"
else:
  print "This parrot is no more!"
finally:
  end_sketch()

 else里的语句在不发生异常时执行,这样做的好处是避免捕捉else里的异常

 

26. with语句

这个我觉的是最有用的功能了,只有2.6以后的版本才支持

常用的一个场景是,打开一个文件,读写,然后关闭,那么代码看起来是

fp = open('test.txt', 'w')
f.write('hello!')
fp.close()

用了with就漂亮多了

with open('foo.txt', 'w') as f:
    f.write('hello!')

看,不用自己写close()了,至于with原理,建议大家深入研究下

 

---------------正文结束---------------

翻译完这篇帖子,我感觉还不够过瘾啊,还有很多好的特性和类库值得挖掘,希望大家能够补充
下篇文章我将总结下我使用Python一年半以来所用过的最有用的类库和模块,敬请期待...

分享到:
评论

相关推荐

    Python-Python隐写工具用来在图像中隐藏图像或文本

    描述中提到的“在图像中隐藏图像或文本”,进一步强调了Python隐写工具的多功能性。它可以不仅仅隐藏文本信息,还可以隐藏完整的图像文件。隐藏图像时,通常是将另一张图像的数据编码并嵌入到主图像的像素中,而隐藏...

    Python-所有复活节彩蛋和Python中隐藏的笑话列表

    Python是一种广泛使用的高级编程语言,以其简洁明了的语法和强大的功能受到开发者们的喜爱。在Python的世界里,有一些隐藏的“复活节彩蛋”和趣味性的内置笑话,这些小惊喜为程序员的工作增添了一些乐趣。本文将详细...

    基于Python的图像信息隐藏技术的实现.zip

    本次就是利用python技术,结合LSB等算法内容,来搭建一款图像隐藏的软件,通过该软件实现信息的隐藏传输功能。 此次设计的图像隐藏需要具备以下的性能要求,只有做到了以下的一些指标要求才能够保证信息隐藏过程是...

    HMM, python 隐藏 马尔可夫 模型框架.zip

    HMM, python 隐藏 马尔可夫 模型框架 HMMnumpy/python只隐藏 马尔可夫 模型框架。 不需要其他依赖项。这里实现( 其他很多) 基于以下文件: "隐藏 马尔可夫 模型和语音识别中选择的应用的教程,RABINER 1989"主要支持...

    基于python的王者荣耀脚本

    在当今的数字化时代,游戏编程已经成为了一项热门技能,而Python作为一款易学且功能强大的编程语言,被广泛应用于各种领域,包括游戏自动化。本文将深入探讨如何利用Python编写王者荣耀的脚本,帮助玩家进行自动冒险...

    Python-一个隐藏的基于Python的Windows后门

    标题提到的"Python-一个隐藏的基于Python的Windows后门"就是一个典型的例子,展示了Python在创建隐蔽、功能强大的后门程序方面的潜力。 后门程序通常是黑客为了长期控制目标系统而植入的一种隐蔽通道。它们可以绕过...

    基于python王者荣耀脚本

    在编程领域,Python以其简洁易懂的语法和强大的功能,成为许多初学者及专业开发者的首选语言。而王者荣耀作为一款热门的多人在线竞技游戏,吸引了大量的玩家,其中不乏对游戏自动化感兴趣的编程爱好者。本篇文章将...

    (基于python的毕业设计)图像信息隐藏技术设计(源码+说明+演示视频).zip

    (基于python的毕业设计)图像信息隐藏技术设计(源码+说明+演示视频),本科毕业设计高分项目。 【项目技术】 python+Django+mysql 【实现功能】 主要是围绕着数据隐藏的功能,整体的页面设计保持简洁大方的内容显示,...

    Python不可见水印,隐形水印

    7. **Python库**:PIL、OpenCV、numpy和scipy是Python中用于水印处理的主要库,提供图像处理、数学变换等功能。 8. **水印的透明度**:隐形水印的透明度意味着即使经过多次处理,图像的质量和视觉效果依然保持良好...

    Maya_Python_教程-很难得最新mayapython教程.pdf

    * Maya Python 可以大幅度地提高工作效率,挖掘 Maya 隐藏功能,并快速开发脚本插件。 2.为什么学习 Maya Python? * Maya Python 可以提高工作效率和挖掘 Maya 隐藏功能。 * 学习 Maya Python 可以快速开发脚本...

    python菜鸟教程python基础教程.pdf

    Python是一种高级编程语言,因其简洁明了的语法和强大的功能而受到广泛的欢迎。越来越多的企业,如快手、美团、百度等,都在使用Python进行各种技术应用,这也为学习Python的求职者提供了丰富的就业机会。 首先,...

    Python界面版学生系统,python学生管理系统界面版,Python

    总之,【Python界面版学生系统】是一个基础的教育管理工具,利用Python和MySQL的强大功能实现学生信息管理。尽管还有提升空间,如增加登录界面和优化用户体验,但这个项目为学习和实践Python GUI编程及数据库操作...

    Maya python简易教程

    学习 Maya Python 可以提高工作效率,挖掘 Maya 隐藏功能,并快速开发脚本插件。 3. 如何学习 Maya Python? 学习 Maya Python 的最好方法是学习别人写的源代码。 Maya 的帮助文档中的脚本部分对每条命令的参数...

    基于python的图像信息隐藏技术与实现.docx

    在本文中,我们将基于python语言,结合LSB等算法,来搭建一款图像隐藏的软件,实现信息的隐藏传输功能。 图像信息隐藏技术的优点: 1. 安全性高:图像信息隐藏技术可以将秘密信息隐藏在图像中,非常难以被检测出来...

    python-louvain-0.14_python-louvain包_Louvain算法_Louvain-python_lou

    Python-louvain是一个用于执行社区检测的Python库,它实现了著名的Louvain算法。...通过Louvain算法,我们可以揭示隐藏在大量节点和边之下的模式,这对于理解和解释现实世界中的复杂系统具有重要意义。

    Python研究(Dive Into Python)

    - 模块与包:Python采用模块化设计,通过import语句导入所需功能,方便代码重用和组织。 2. **面向对象编程** - 类与对象:Python是面向对象的语言,类是创建对象的模板,对象则是类的实例。 - 继承与多态:通过...

    Python简易界面跳转

    7. **使用示例**:在提供的"代码需要用浏览器打开.txt"和"代码"文件中,可能包含了实现这一功能的具体Python代码。通过阅读和分析这些代码,你可以看到如何使用Tkinter创建控件,如何定义事件处理函数,以及如何通过...

    基于python图像的信息隐藏技术研究源码数据库.doc

    【信息隐藏技术】 信息隐藏技术是一种用于保护和...同时,结合MySQL数据库,构建了一个完整的系统,实现了信息的隐藏、存储和检索功能。这项工作对于理解和提高网络安全,特别是在保密通信和信息安全领域具有重要意义。

    基于python的图像信息隐藏算法的实现.zip

    由于此次的网站搭建内容比较简单,主要突出的功能就是图像隐藏,除此之外只有一些简单的菜单模块,因此整体开发的难度比较低,使用python语言开发是基于该语言的易懂、易开发的特性,能够提供很好的开发结果。...

    python代码封装一键安装agent

    在IT行业中,Python是一种广泛使用的编程语言,因其简洁明了的语法和强大的功能而备受青睐。在这个项目中,我们关注的是如何使用Python编写一个Agent程序,并将其打包成Windows可执行文件(.exe),以便于在Windows...

Global site tag (gtag.js) - Google Analytics