举例介绍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连接mysql数据库示例(做增删改操作)
Dec 31 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
分享6个隐藏的python功能
Dec 07 Python
python内置数据类型之列表操作
Nov 12 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
python多线程同步实例教程
Aug 11 Python
django迁移文件migrations的实现
Mar 31 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 Python
Python利用Xpath选择器爬取京东网商品信息
Jun 01 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
python源文件的字符编码知识点详解
Mar 04 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 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
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
PHP中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
2014/10/16 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
PHP链表操作简单示例
2016/10/15 PHP
php 基础函数
2017/02/10 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
python实现大文件分割与合并
2019/07/22 Python
python实现横向拼接图片
2020/03/23 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
什么是数据抽象
2016/11/26 面试题
应届电子商务毕业自荐书范文
2014/02/11 职场文书
单位委托书范本
2014/04/04 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
老兵退伍标语
2014/10/07 职场文书
辞职信格式范文
2015/05/13 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python