列表解析

迭代器就是一个有.next()方法的对象,而不是通过索引来计数。
迭代器的限制:不能回退!

使用迭代器:
>>> develop = (‘python‘,‘c#‘,‘ruby‘,‘php‘,‘java‘)
>>> progarmme = iter(develop) #定义迭代器
>>> progarmme.__next__() #使用迭代器方法1
‘python‘
>>> next(progarmme) #使用迭代器方法2
‘c#‘
>>> progarmme.__next__()
‘ruby‘
>>> next(progarmme)
‘php‘
>>>

迭代到最后会怎样?
>>> next(progarmme)
‘java‘
>>>
>>>
>>> next(progarmme)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

返回一个Traceback,提示终止迭代。

#!/usr/bin/env python3
#-*- coding:utf-8 -*-

develop = [‘python‘,‘ruby‘,‘C#‘,‘Java‘,‘PHP‘]

programme = iter(develop)

while True:
try:
i = programme.__next__()
except StopIteration:
break
print(i)

当然,这也的行为显然没有下面的语句高效:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-

develop = [‘python‘,‘ruby‘,‘C#‘,‘Java‘,‘PHP‘]

for i in develop:
print(i)

在迭代器产生之前,如何逐行读取文件?
#!/usr/bin/env python3
#-*- coding:utf-8 -*-

with open(‘OSPF可选项字段.txt‘,‘r‘,encoding=‘UTF-8‘) as myfile:
for eachline in myfile.readlines():
print(eachline)

有了迭代器之后,还可以这样读取:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-

with open(‘OSPF可选项字段.txt‘,‘r‘,encoding=‘UTF-8‘) as myfile:
for eachline in myfile:
print(eachline)

充分表明:for语句内嵌迭代机制!

列表解析(list comps)——动态创建列表

列表解析的语法:

[expr for iter_var in iterable]

这语句的核心是for循环,迭代iterable对象的所有条目,前面的表达式(expr)应用于序列的每个成员,最后的结果是产生新的列表。

生成1,10所有数字的平方,保存到列表L中
>>> L = [i**2 for i in range(1,11)]
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

计算文件最长行单词数量:
范例文件:/etc/passwd

#!/usr/bin/env python3
#-*- coding:utf-8 -*-

file = open(‘passwd‘,‘r‘)

longest = 0

alllines = file.readlines()

file.close()

for line in alllines:
linelen = len(line.strip())
if linelen > longest:
longest = linelen

print(longest)

通过列表解析完成工作:

#!/usr/bin/env python3
#-*- coding:utf-8 -*-

file = open(‘passwd‘,‘r‘)

longest = 0

alllines = [x.strip() for x in file.readlines()]

file.close()

for line in alllines:
linelen = len(line.strip())
if linelen > longest:
longest = linelen

print(longest)

这两种方法的通病:
readlines()会读取文件所有行,然后以空白字符为分隔符计算len,对于超大文件这显然是不合理的。

优化:

!/usr/bin/env python3
#-*- coding:utf-8 -*-

file = open(‘passwd‘,‘r‘)

alllines = [len(x.strip()) for x in file]

file.close()

print(max(alllines))

思路,就是迭代器可以读取迭代文件本身!!!

这里还是有问题的,因为对文件迭代的时候,还是会把每一行读取到内存进行处理,然后在生成列表。

对代码进行进一步简化:

#!/usr/bin/env python3
#-*- coding:utf-8 -*-

print(max(len(x.strip()) for x in open(‘passwd‘,‘r‘)))
时间: 2024-10-14 14:45:41

列表解析的相关文章

浅析python列表解析和迭代

要看懂列表解析,首先要知道几个定义,第一个是python的解释器,虽然大多数时候,我们都将python当作一门编程语言来看待,实际上,python也是一个名为解释器的软件包,解释器是一种能让其他程序运行起来的程序,如果你写了一段代码,让python解释器读取程序,并且按着命令执行,得出结果,实际上,解释器是代码雨计算机硬件之间的软件逻辑层,计算机上安装的python程序就是一个解释器和一些基本的库,例如os,sys模块,是最基本的包.值得一提的是在python的解释器里面运行.第二个是迭代器(i

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

Python内置容器(2)——字典,迭代器,列表解析

1.迭代器 iterator iter 函数,构造集合. next 方法依次返回迭代器的值 In [42]: li Out[42]: [1, 2, 3, 4, 5] In [43]: it = iter(li) In [44]: it.next() Out[44]: 1 In [45]: it.next() Out[45]: 2 当所有的元素都返回完的时候,会抛出一个StopIterator 的异常. list,tuple,set 都属于集合. for 语句,当将一个列表传递给for 语句的时候

python之列表解析

列表解析:是指在原列表的基础之上生成新的列表 列表解析式生成列表,通过for循环也可以实现,优势在于列表表达式比for循环快. 列表解析表达式: 表达式一 [expression for iter_var in iterable] 将迭代对象(iterable)中的值赋给iter_var,并执行expression 例: >>> a = [1,2,3,4,5] >>> b = [i**2 for i in a] >>> b [1, 4, 9, 16,

《python核心编程》读书笔记——列表解析

列表解析是列表类型的方法,这种方法结合了列表的方括弧.for循环.if语句. 用for把处理后的值放入列表: 1 squared = [ x**2 for x in range(4) ] 2 for i in squared: 3 print i 4 5 0 6 1 7 4 8 9 1 [ i*2 for i in [8,-2,5] ] 2 3 [16,-4,10] 2. 挑选符合要求的值放入列表 1 sqdEvens = [x**2 for x in range(8) if not x % 2

三元表达式、列表解析、生成器

一.三元表达式 格式:result=值1 if x<y else 值2 满足if条件result=值1,否则result=值2 >>> 3 if 3>2 else 10 3 >>> 3 if 3>4 else 10 10 >>> 3+2 if 3>0 else 3-1 5 >>> 3+2 if 3>0 and 3>4 else 3-1 2 二.列表解析 1 s='hello' 2 res=[i.up

Python自动化运维之7、格式化输出、生成器、迭代器、列表解析、迭代器表达式

Python格式化输出: Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] (1)百分号格式化 %[(name)][flags][width][.precision]typecode .... (name) 可选,用于选择指定的key flags 可选,可供选择的值有: + 右对齐:正数前加正好,负数前加负号: - 左对齐:正数前无符号,负数前加负号: 空

第二天 Python3.4.2 里面的字典 列表解析等等

一.字典 1.字典是一种无序集合 2.字典是一种KV结构 3.value可以是任何对象 4.key必须是可以hash对象 二.列表解析 1.列表解析是python重要的语法课 2.列表解析的速度比for in 迭代快 例子1: In [1]: lst = list(range(10)) In [2]: lst Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 列表解析: In [3]: [x+1 for x in lst] Out[3]: [1, 2, 3, 4, 5

list comprehensions列表解析

没有使用列表解析: 1 x =[] 2 for i in (1, 2, 3): 3 x.append(i) 4 5 """ 6 >>> x 7 [1, 2, 3] 8 """ 列表解析式: 1 x = [i for i in (1, 2, 3)] 2 """ 3 >>> x 4 [1, 2, 3] 5 """ 多重列表解析: 1 x = [word.c

python高级编程之列表解析

#列表解析 #编写0到10之间的偶数 #方法1 #结果:[0, 2, 4, 6, 8] num=range(10) num1=len(num) evens=[] i=0 while i<num1: if i%2==0: evens.append(i) i+=1 print evens #方法2 print [(i)for i in range(10)if i%2==0] #enumerate获取索引 #方法1 i=0 l=['a','b','c','d'] for  li in l: l[i]=