python“不为人知的”特性
>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True
>>> a = ['a', 'b', 'c', 'd', 'e']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
3 d
4 e
>>>
for i in range(len(a)):
print i, a[i]
x=(n for n in foo if bar(n)) #foo是可迭代对象
>>> type(x)
<type 'generator'>
for n in x:
pass
x = [n for n in foo if bar(n)]
>>> type(x)
<type 'list'>
iter(collection)---> iterator
iter(callable, sentinel) --> iterator
def seek_next_line(f):
#每次读一个字符,直到出现换行符就返回
for c in iter(lambda: f.read(1),'\n'):
pass
>>> def foo(x=[]):
... x.append(1)
... print x
...
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]
>>> def foo(x=None):
... if x is None:
... x = []
... x.append(1)
... print x
>>> foo()
[1]
>>> foo()
[1]
def mygen():
"""Yield 5 until something else is passed back via send()"""
a = 5
while True:
f = (yield a) #yield a and possibly get f in return
if f is not None:
a = f #store the new value
你可以:
>>> g = mygen()
>>> g.next()
5
>>> g.next()
5
>>> g.send(7) #we send this back to the generator
7
>>> g.next() #now it will yield 7 until we send something else
7
>>> from __future__ import braces #这里的braces 指的是:curly braces(花括号)
File "<stdin>", line 1
SyntaxError: not a chance
当然这仅仅是一个玩笑,想用花括号定义函数?没门。感兴趣的还可以了解下:
from __future__ import barry_as_FLUFL
不过这是python3里面的特性
a = [1,2,3,4,5]
>>> a[::2] # iterate over the whole list in 2-increments
[1,3,5]
还有一个特例: x[::-1]
,反转列表:
>>> a[::-1]
[5,4,3,2,1]
>>> l = range(5)
>>> l
[0, 1, 2, 3, 4]
>>> l.reverse()
>>> l
[4, 3, 2, 1, 0]
>>> l2 = reversed(l)
>>> l2
<listreverseiterator object at 0x99faeec>
>>> def print_args(function):
>>> def wrapper(*args, **kwargs):
>>> print 'Arguments:', args, kwargs
>>> return function(*args, **kwargs)
>>> return wrapper
>>> @print_args
>>> def write(text):
>>> print text
>>> write('foo')
Arguments: ('foo',) {}
foo
@是语法糖,它等价于:
>>> write = print_args(write)
>>> write('foo')
arguments: ('foo',) {}
foo
for i in foo:
if i == 0:
break
else:
print("i was never 0")
found = False
for i in foo:
if i == 0:
found = True
break
if not found:
print("i was never 0")
python2.5有个 __missing__ 方法
dict的子类如果定义了方法 __missing__(self, key) ,如果key不再dict中,那么d[key]就会调用 __missing__ 方法,而且d[key]的返回值就是 __missing__ 的返回值。
>>> class MyDict(dict):
... def __missing__(self, key):
... self[key] = rv = []
... return rv
...
>>> m = MyDict()
>>> m["foo"].append(1)
>>> m["foo"].append(2)
>>> dict(m)
{'foo': [1, 2]}
>>> from collections import defaultdict
>>> m = defaultdict(list)
>>> m["foo"].append(1)
>>> m["foo"].append(2)
>>> dict(m)
{'foo': [1, 2]}
>>> a = 10
>>> b = 5
>>> a, b
(10, 5)
>>> a, b = b, a
>>> a, b
(5, 10)
>>> pattern = """
... ^ # beginning of string
... M{0,4} # thousands - 0 to 4 M's
... (CM|CD|D?C{0,3}) # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
... # or 500-800 (D, followed by 0 to 3 C's)
... (XC|XL|L?X{0,3}) # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
... # or 50-80 (L, followed by 0 to 3 X's)
... (IX|IV|V?I{0,3}) # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
... # or 5-8 (V, followed by 0 to 3 I's)
... $ # end of string
... """
>>> re.search(pattern, 'M', re.VERBOSE)
def draw_point(x, y):
# do some magic
point_foo = (3, 4)
point_bar = {'y': 3, 'x': 2}
draw_point(*point_foo)
draw_point(**point_bar)
>>> NewType = type("NewType", (object,), {"x": "hello"})
>>> n = NewType()
>>> n.x
"hello"
>>> class NewType(object):
>>> x = "hello"
>>> n = NewType()
>>> n.x
"hello"
with open('foo.txt', 'w') as f:
f.write('hello!')
sum[value] = sum.get(value, 0) + 1
>>> d = {'key':123}
>>> d.setdefault('key',456)
123
>>> d['key']
123
>>> d.setdefault('key2',456)
456
>>> d['key2']
456
>>> cnt = Counter('helloworld')
>>> cnt
Counter({'l': 3, 'o': 2, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})
>>> cnt['l']
3
>>> cnt['x'] = 10
>>> cnt.get('y')
x = 3 if (y == 1) else 2
(func1 if y == 1 else func2)(arg1, arg2)
如果y等于1,那么调用func1(arg1,arg2)否则调用func2(arg1,arg2) x = (class1 if y == 1 else class2)(arg1, arg2)
try:
try_this(whatever)
except SomeException, exception:
#Handle exception
else:
# do something
finally:
#do something
评论