举例介绍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去掉字符串中空格的方法
Mar 11 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
Mar 22 Python
Python读取excel中的图片完美解决方法
Jul 27 Python
Python实现注册、登录小程序功能
Sep 21 Python
Python微信操控itchat的方法
May 31 Python
Python单元测试与测试用例简析
Nov 09 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
python集合能干吗
Jul 19 Python
Python发送邮件实现基础解析
Aug 14 Python
python中使用.py配置文件的方法详解
Nov 23 Python
python numpy中multiply与*及matul 的区别说明
May 26 Python
python单向链表实例详解
May 25 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
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
jquery实现拖动效果
2016/08/10 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
2018/05/26 jQuery
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
[01:32]dota2拉比克至宝(222)
2018/12/20 DOTA
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
缴纳养老保险的证明
2014/01/10 职场文书
药学专业学生的自我评价分享
2014/02/06 职场文书
教师求职自荐信
2014/03/09 职场文书
求职自我推荐信
2014/06/25 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
初中家长评语和期望
2014/12/26 职场文书
素质拓展训练感想
2015/08/07 职场文书
吉利入股戴姆勒后smart“长大了”
2022/04/21 数码科技
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android