举例介绍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 相关文章推荐
下载安装setuptool和pip linux安装pip    
Jan 24 Python
Python中IPYTHON入门实例
May 11 Python
python避免死锁方法实例分析
Jun 04 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
python使用百度文字识别功能方法详解
Jul 23 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
Jan 10 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
tensorflow中的数据类型dtype用法说明
May 26 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
第二节 对象模型 [2]
2006/10/09 PHP
一个简单计数器的源代码
2006/10/09 PHP
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
详解php实现页面静态化原理
2017/06/21 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
Python Trie树实现字典排序
2014/03/28 Python
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
python字符串常用方法
2018/06/14 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
销售业务员岗位职责
2014/01/29 职场文书
婚礼主持结束词
2014/03/13 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
人民币使用说明书
2019/04/17 职场文书