>>> # 自定义 end 伪关键字
>>> __builtins__ 名字空间,可以在任何模块中访问
>>> __builtins__.end = None
>>> def test(x):
>>> pass
>>> end
- 模块中以
_
开头的名字视为私有
from xxx import *
不会导入这些 变量和函数
- 但是仍然可以这样访问它们
import xxx; xxx._yyy
- 以
__
开头的类成员名字视为私有
- Name Mangling
- 如果有一 Test 类里有一成员
__x
,那么 dir(Test) 时会看到 _Test__x
而非 __x
- 同时以
__
开头和结尾的名字,通常是特殊成员
- 单一
_
代表最后表达式的返回值
>>> s = set("abc")
>>> s.pop()
'a'
>>> _
'a'
- 除非在函数中使用关键字 global、nolocal 指明外部名字 , 否则赋值语句总是 在当前名字空间创建或修改 {name:object} 关联
- 代码 block 不是 名字空间 !!! 这点和c不同
>>> def test():
... while True:
... x = 10
... break
... print locals()
... print x # 这个写法c里会报错
>>> test()
{'x': 10}
10
>>> a, b, _ = xrange(3)
# Python 3 对此提供了更好的支持。
>>> a, *b, c = "a1234c"
>>> a, b, c
('a', ['1', '2', '3', '4'], 'c')
- else 分支
- 可以用 else 分支标记循环逻辑被完整处理
>>> while x > 0:
... x -= 1
... else:
... print "over!"
>>> [x for x in range(10) if x % 2]
[1, 3, 5, 7, 9]
>>> {x for x in range(10)}
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> {c:ord(c) for c in "abc"}
{'a': 97, 'c': 99, 'b': 98}
>>> (x for x in range(10))
<generator object <genexpr> at 0x10328a690>
>>> ["{0}{1}".format(c, x) for c in "abc" for x in range(3)]
['a0', 'a1', 'a2', 'b0', 'b1', 'b2', 'c0', 'c1', 'c2']
>>> ["{0}{1}".format(c, x) \
... for c in "aBcD" if c.isupper() \
... for x in range(5) if x%2 ]
['B1', 'B3', 'D1', 'D3']
>>> x = range(10)
# reverse
>>> x[7:3:-2]
[7, 5]
# 可按切片范围删除序列元素
>>> x = range(10)
>>> del x[4:8]; x
[0, 1, 2, 3, 8, 9]
# 甚至不等长的切片替换
>>> a = [1, 2, 3]
>>> a[:1] = ["a", "b", "c"]
>>> a
['a', 'b', 'c', 2, 3]
- 操作符 "==" 可被重载,不适合用来判断两个名字是否指向同一对象