条件表达式(即"三元操作符")
>>>smaller = x if x < y else y
>>>smaller
3
===使用项和索引迭代===
>>>nameList = ['Donn', 'Shirley', 'Ben', 'Janice',
...
'David','Yen', 'Wendy']
>>>for i, eachLee in enumerate(nameList):
...
print"%d %s Lee" % (i+1, eachLee)
用于迭代器类型
迭代器对象有一个next()方法,调用后返回下一个条目.所有条目迭代完后,迭代器引发一
个StopIteration异常告诉程序循环结束.for语句在内部调用next()并捕获异常.
与序列相关的内建函数
sorted(),reversed(), enumerate(), zip()
下边是使用循环相关和序列相关函数的例子.为什么它们叫"序列相关"呢?是因为其中两个函
数(sorted()和zip())返回一个序列(列表),而另外两个函数(reversed()和enumerate())
返回迭代器(类似序列)
>>albums = ('Poe', 'Gaudi', 'Freud', 'Poe2')
>>>years = (1976, 1987, 1990, 2003)
>>>for album in sorted(albums):
...
printalbum,
>>>for album in reversed(albums):
...
printalbum,
>>>for i, album in enumerate(albums):
...
printi, album
>>>for album, yr in zip(albums, years):
...
printyr, album
迭代器和iter()函数
>>myTuple = (123, 'xyz', 45.67)
>>>i = iter(myTuple)
>>>i.next()
123
>>>i.next()
'xyz'
>>>i.next()
45.67
>>>i.next()
Traceback(most recent call last):
File"", line 1, in ?
StopIteration
列表解析
map(lambdax: x ** 2, range(6))
[0,1, 4, 9, 16, 25]
等效的列表解析
>>>[x ** 2 for x in range(6)]
[0,1, 4, 9, 16, 25]
>>seq = [11, 10, 9, 9, 10, 10, 9, 8, 23, 9, 7, 18, 12, 11, 12]
>>>filter(lambda x: x % 2, seq)
[11,9, 9, 9, 23, 9, 7, 11]
等效的列表解析
>>>[x for x in seq if x % 2]
[11,9, 9, 9, 23, 9, 7, 11]
计算单词个数:
>>>f = open('hhga.txt', 'r')
>>>len([word for line in f for word in line.split()])
91
每个单词的长度加起来,得到和
>>>f.seek(0)
>>>sum([len(word) for line in f for word in line.split()])
408
生成器表达式
列表解析:
[exprfor iter_var in iterable if cond_expr]
生成器表达式:
(exprfor iter_var in iterable if cond_expr)
生成器并不会让列表解析废弃,它只是一个内存使用更友好的结构,基于此,有很多使用生成器地方.
>>>sum(len(word) for line in data for word in line.split())
408
我们所做的只是把方括号删除:少了两字节,而且更节省内存...非常地环保!
f= open('/etc/motd', 'r')
allLineLens= [len(x.strip()) for x in f]
f.close()
return max(allLineLens)
这里唯一的问题就是你一行一行迭代f的时候,列表解析需要文件的所有行读取到内存中,
然后生成列表.我们可以进一步简化代码:使用生成器表达式替换列表解析,然后把它移到max()
函数里,这样,所有的核心部分只有一行:
f= open('/etc/motd', 'r')
longest= max(len(x.strip()) for x in f)
f.close()
return longest