举例介绍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 列表(List)操作方法详解
Mar 11 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
Dec 23 Python
Python中functools模块函数解析
Mar 12 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
Python3最长回文子串算法示例
Mar 04 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
Django rest framework分页接口实现原理解析
Aug 21 Python
Python实现哲学家就餐问题实例代码
Nov 09 Python
jupyter使用自动补全和切换默认浏览器的方法
Nov 18 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
zf框架的数据库追踪器使用示例
2014/03/13 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
jQuery getJSON 处理json数据的代码
2010/07/26 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
把jquery 的dialog和ztree结合实现步骤
2013/08/02 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
jQuery实现点击关注和取消功能
2017/07/03 jQuery
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
JavaScript事件对象event用法分析
2018/07/27 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
Python判断字符串与大小写转换
2015/06/08 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
Python 处理文件的几种方式
2019/08/23 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
市场调研项目授权委托书范本
2014/10/04 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
预备党员党支部意见
2015/06/02 职场文书
可可西里观后感
2015/06/08 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
详解Python类和对象内容
2021/06/22 Python
windows系统搭建WEB服务器详细教程
2022/08/05 Servers