模块导入与运行
- 如果模块是被导入,__name__的值为模块名字;
- 如果模块是被直接执行,__name__的值为__main__ .
切片对象:
- 多维切片语法:sequence[start1:end1, start2:end2]
- 步进切片语法:sequence[start:end:step]
典型切片用法,比如以-1步进值反转字符串:
>>> foostr = 'abcde'
>>> foostr[::-1]
'edcba'
>>> foostr[::-2]
'eca'
私有变量
- _xxx 不被’from module import *’导入的变量
- _xxx_ 系统定义的名字
- _xxx 类中的私有变量名
is 与 id
a is b 相当于 id(a) == id(b)
repr() 与 str()
函数 | 功能 |
repr(obj) 或 `obj` | 返回一个对象的字符串标识 |
str(obj) | 返回对象可读性好的字符串标识 |
random模块:
randint(a, b) | 两个整型数值,返回二者之间的随机整型,包括这二者 |
randrange(start, stop=None, step=1, _int=type ‘int’, _maxwidth=9007199254740992L) | 随机返回range([start,]stop[,step])结果的一项 |
uniform(a,b) | 几乎和randint(),不过返回的是一个浮点数(不包括范围上限) |
random(…) | x in the interval [0, 1.0) |
choice(seq) | 随机返回给定序列seq的一个元素 |
enumerate()示例代码:
s = 'foobar'
for i, t in enumerate(s):
print i, t
# result is as below
0 f
1 o
2 o
3 b
4 a
5 r
深copy
需要深copy的话,可以使用copy.deepcopy()函数。
xrange()函数:
类似range(), 但当你有一个很大范围的列表时,它不会在内存中创建列表的完整拷贝。它只被用在for循环中,在for循环外没有意义。它的性能远高于range(),因为它不生成整个列表。
迭代器:
迭代器就是一个有next()方法的对象,而不是通过索引来计数。当一个循环(比如for)机制需要下一项时,调用迭代器的next()方法就能获得它。条目全部取出后,会引发一个StopIteration的异常。这不代表错误发生,只是告诉外部调用者,迭代完成。
使用迭代器:
>>> myTuple = (123, 'xyz')
>>> i = iter(myTuple)
>>> i.next()
123
>>> i.next()
'xyz'
>>> i.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
>>> for i in myTuple:
... print i
...
123
xyz
注意,for循环会自动调用next()方法,以及监视StopIteration异常,故不需要try…catch.
对于字典,有3个内建的方法来做迭代:
- myDict.iterkeys() 迭代key
- myDict.itervalues() 迭代value
- myDict.iteritems() 迭代key-value对
如何创建迭代器:
对一个对象调用iter()就可以得到它的迭代器。语法如下:
iter(obj)
iter(func, sentinel)
如果传递一个参数给iter(), 它会检查传进来的是不是一个序列。如果是,那么根据索引从0一直迭代到序列结束;如果传递进来的是2个参数,它会重复调用func,直到迭代器的下个值等于sentinel.
列表解析
利用列表解析来仅用一行代码统计一篇文章有多少个单词:
f = open("xxx.txt", "r")
len([word for line in f for word in line.split()])
f.close()
生成器表达式
列表解析的一个不足就是必须要生成所有的数据,用以创建整个列表。如果是迭代大量的数据,可能会严重影响性能。生成器表达式结合了列表解析和生成器解决了这个问题。
列表解析:
[expr for var in iterable if cond_expr]
生成器表达式: (将列表解析的方括号改成圆括号即可)
(expr for var in iterable if cond_expr)
举例如下:
计算一篇文章中所有单词长度相加之和:
sum(len(word) for line in data for word in line.split())
再举一个例子,计算一个文件中长度最长的行的长度:
max(len(x.strip()) for x in open('xxx.txt'))
注意:
这里用的是生成器表达式,而不是列表解析。
不过,有一个问题,不需要close()了吗?