举例介绍Python中的25个隐藏特性


Posted in Python onMarch 30, 2015

注:这里忽略了生成器,装饰器,交换变量等熟知技巧
1. 函数参数unpack

老生常谈的了:
 

def foo(x, y):
  print x, y
 
alist = [1, 2]
adict = {'x': 1, 'y': 2}
 
foo(*alist) # 1, 2
foo(**adict) # 1, 2

2. 链式比较操作符
 

>>> x = 3
>>> 1 < x < 5
True
>>> 4 > x >=3
True

3. 注意函数的默认参数
 

>>> def foo(x=[]):
...   x.append(1)
...   print x
...
>>> foo()
[1]
>>> foo()
[1, 1]

更安全的做法:
 

>>> def foo(x=None):
...   if x is None:
...     x = []
...   x.append(1)
...   print x
...
>>> foo()
[1]
>>> foo()
[1]
>>>

4. 字典有个get()方法

dct.get(key[,default_value]), 当字典dct中找不到key时,get就会返回default_value
 

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

5. 带关键字的格式化
 

>>> print "Hello %(name)s !" % {'name': 'James'}
Hello James !
>>> print "I am years %(age)i years old" % {'age': 18}
I am years 18 years old

更新些的格式化:
 

>>> print "Hello {name} !".format(name="James")
Hello James !

快有些模板引擎的味道了:)
6. for…else 语法
 

>>> for i in (1, 3, 5):
...   if i % 2 == 0:
...     break
... else:
...   print "var i is always an odd"
...
var i is always an odd
>>>

else语句块会在循环结束后执行,除非在循环块中执行break
7. dict 的特殊方法__missing__

Python 2.5之后引入的。当查找不到key的时候,会执行这个方法。
 

>>> class Dict(dict):
...  def __missing__(self, key):
...   self[key] = []
...   return self[key]
...
>>> dct = Dict()
>>> dct["foo"].append(1)
>>> dct["foo"].append(2)
>>> dct["foo"]
[1, 2]

这很像collections.defaultdict不是吗?
 

>>> from collections import defaultdict
>>> dct = defaultdict(list)
>>> dct["foo"]
[]
>>> dct["bar"].append("Hello")
>>> dct
defaultdict(<type 'list'>, {'foo': [], 'bar': ['Hello']})

8. 切片操作的步长参数

还能用步长-1来反转链表:
 
9.另一种字符串连接
 

>>> Name = "Wang" "Hong"
>>> Name
'WangHong'

连接多行:
 

>>> Name = "Wang" \
... "Hong"
>>> Name
'WangHong'
10. Python解释器中的”_”
 
>>> range(4)
[0, 1, 2, 3]
>>> _
[0, 1, 2, 3]

_即Python解释器上一次返回的值
11. Python 描述器

Python描述器是Python 中很魔幻的东西,方法等都是描述器。不再举例
12. Zen
 

import this

13. 嵌套列表推导式
 

>>> [(i, j) for i in range(3) for j in range(i)]
[(1, 0), (2, 0), (2, 1)]
14. try/except/else
 
try:
 put_4000000000_volts_through_it(parrot)
except Voom:
 print "'E's pining!"
else:
 print "This parrot is no more!"
finally:
 end_sketch()

15. print 重定向输出到文件
 

>>> print >> open("somefile", "w+"), "Hello World"

注意打开的模式:"w+"而不能"w", 当然"a"是可以的
16. 省略号

在Python3中你可以直接使用省略号这个文法:
 

Python 3.2 (r32:88445, Oct 20 2012, 14:09:50)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> ...
Ellipsis

Python2 中呢?
 

>>> class C(object):
... def __getitem__(self, item):
...  return item
...
>>> C()[1:2, ..., 3]
(slice(1, 2, None), Ellipsis, 3)
>>>

17. Python3中的元组unpack

真的但愿Python2也这样:
 

>>> a, b, *rest = range(10)
>>> a
0
>>> b
1
>>> rest
[2, 3, 4, 5, 6, 7, 8, 9]
>>>

当然也可以取出最后一个:
 

>>> first, second, *rest, last = range(10)
>>> first
0
>>> second
1
>>> last
9
>>> rest
[2, 3, 4, 5, 6, 7, 8]

18. pow()还有第三个参数

我们都知道内置函数pow,pow(x,y)即x**y

但是它还可以有第三个参数:
 

>>> pow(4, 2, 2)
0
>>> pow(4, 2, 3)
1

其实第三个参数是来求模的:pow(x,y,z)?==?(x**y)?%z

注意,内置的pow和math.pow并不是一个函数,后者只接受2个参数
19. enumerate还有第二个参数

enumerate很赞,可以给我们索引和序列值的对, 但是它还有第二个参数:
 

>>> lst = ["a", "b", "c"]
>>> list(enumerate(lst, 1))
[(1, 'a'), (2, 'b'), (3, 'c')]

这个参数用来: 指明索引的起始值
20. 显式的声明一个集合

新建一个集合,我们会:
 

>>> set([1,2,3])

在Python 2.7 之后可以这么写了:
 

>>> {1,2,3}
set([1, 2, 3])

21. 用切片来删除序列的某一段
 

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a[1:4] = []
>>> a
[1, 5, 6, 7]

当然用dela[1:4]也是可以的

去除偶数项(偶数索引的):
 

>>> a = [0, 1, 2, 3, 4, 5, 6, 7]
>>> del a[::2]
>>> a
[1, 3, 5, 7]

22. isinstance可以接收一个元组

这个真的鲜为人知, 我们可以用isinstance(x,(float,int))来判断x是不是数:
 

>>> isinstance(1, (float, int))
True
>>> isinstance(1.3, (float, int))
True
>>> isinstance("1.3", (float, int))
False

那么对于第三个测试,你把str加入元组就可以看到这是怎么回事了:
 

>>> isinstance("1.3", (float, int, str))
True

也就是那个元组里面是或的关系,只要是其中一个的实例就返回True
23. 字典里的无限递归
 

>>> a, b = {}, {}
>>> a['b'] = b
>>> b['a'] = a
>>> a
{'b': {'a': {...}}}

当然你可以制作一个链表中的无限循环:
 

>>> a, b = [], []
>>> a.append(b)
>>> b.append(a)
>>> a
[[[...]]]

真心不知道有什么用,不过蛮好玩的不是吗
24. Python可以认识Unicode中的数字

所以说,Python很赞:
 

>>> int(u'1234')
1234

不只是ASCII字符串的可以认出来,连Unicode的也可以。
25. 不能访问到的属性

回答这个答案的人太坏了:)

>>> class O(object):pass
...
>>> o = O()
>>> setattr(o, "can't touch this", 123)
>>> o.can't touch this
 File "<stdin>", line 1
  o.can't touch this
           ^
SyntaxError: EOL while scanning string literal
>>>
 File "<stdin>", line 1
  o.can't touch this
           ^
SyntaxError: EOL while scanning string literal

不过,能用setattr设置属性,就可以用getattr取出

Python 相关文章推荐
使用python获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
python列表操作实例
Jan 14 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
Dec 31 Python
python requests指定出口ip的例子
Jul 25 Python
python生成requirements.txt的两种方法
Sep 18 Python
Django中使用MySQL5.5的教程
Dec 18 Python
对pytorch的函数中的group参数的作用介绍
Feb 18 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
基于PyQT实现区分左键双击和单击
May 19 Python
Python 存取npy格式数据实例
Jul 01 Python
python基于win32api实现键盘输入
Dec 09 Python
在Python的循环体中使用else语句的方法
Mar 30 #Python
python实现2048小游戏
Mar 30 #Python
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 #Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 #Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 #Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 #Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 #Python
You might like
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
PHP分页函数代码(简单实用型)
2010/12/02 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
canvas实现钟表效果
2017/02/13 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
原生JS实现的双色球功能示例
2018/02/02 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
跟老齐学Python之print详解
2014/09/28 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
Python之循环结构
2019/01/15 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
团日活动策划书
2014/02/01 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书