Heim > Backend-Entwicklung > Python-Tutorial > 举例介绍Python中的25个隐藏特性

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

WBOY
Freigeben: 2016-06-06 11:23:03
Original
1379 Leute haben es durchsucht

注:这里忽略了生成器,装饰器,交换变量等熟知技巧
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
Nach dem Login kopieren

2. 链式比较操作符

>>> x = 3
>>> 1 < x < 5
True
>>> 4 > x >=3
True
Nach dem Login kopieren

3. 注意函数的默认参数

>>> def foo(x=[]):
...   x.append(1)
...   print x
...
>>> foo()
[1]
>>> foo()
[1, 1]
Nach dem Login kopieren

更安全的做法:

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

4. 字典有个get()方法

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

sum[value] = sum.get(value, 0) + 1
Nach dem Login kopieren

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
Nach dem Login kopieren

更新些的格式化:

>>> print "Hello {name} !".format(name="James")
Hello James !
Nach dem Login kopieren

快有些模板引擎的味道了:)
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
>>>
Nach dem Login kopieren

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]
Nach dem Login kopieren

这很像collections.defaultdict不是吗?

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

8. 切片操作的步长参数

还能用步长-1来反转链表:

9.另一种字符串连接

>>> Name = "Wang" "Hong"
>>> Name
'WangHong'
Nach dem Login kopieren

连接多行:

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

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

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

import this
Nach dem Login kopieren

13. 嵌套列表推导式

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

15. print 重定向输出到文件

>>> print >> open("somefile", "w+"), "Hello World"
Nach dem Login kopieren

注意打开的模式:"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
Nach dem Login kopieren

Python2 中呢?

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

17. Python3中的元组unpack

真的但愿Python2也这样:

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

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

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

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

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

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

>>> pow(4, 2, 2)
0
>>> pow(4, 2, 3)
1
Nach dem Login kopieren

其实第三个参数是来求模的: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')]
Nach dem Login kopieren

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

新建一个集合,我们会:

>>> set([1,2,3])
Nach dem Login kopieren

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

>>> {1,2,3}
set([1, 2, 3])
Nach dem Login kopieren

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

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a[1:4] = []
>>> a
[1, 5, 6, 7]
Nach dem Login kopieren

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

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

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

22. isinstance可以接收一个元组

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

>>> isinstance(1, (float, int))
True
>>> isinstance(1.3, (float, int))
True
>>> isinstance("1.3", (float, int))
False
Nach dem Login kopieren

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

>>> isinstance("1.3", (float, int, str))
True
Nach dem Login kopieren

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

>>> a, b = {}, {}
>>> a['b'] = b
>>> b['a'] = a
>>> a
{'b': {'a': {...}}}
Nach dem Login kopieren

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

>>> a, b = [], []
>>> a.append(b)
>>> b.append(a)
>>> a
[[[...]]]
Nach dem Login kopieren

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

所以说,Python很赞:

>>> int(u'1234')
1234
Nach dem Login kopieren

不只是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
Nach dem Login kopieren

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage