Python基础学习06(列表生成式&生成器&迭代器)

Python基础学习06

ppt看完了8,看到9

列表生成式

简而言之,用来创建list的生成式

举个栗子,不使用列表生成式时

E.g
>>>list(range(1,11))
>>>L=[]
>>>for x in range(1,10)
		L.append(x*x)
>>>L

使用列表生成式

>>>[x*x for x in range(1,11)]

>>>[x*x for x in range(1,11)if x%2==0]

>>>[m+n for m in 'ABC' for n in 'XYZ']

一般最多两层循环,三层以上较少

感觉列表生成式就是
[表达式+循环语句(多个)+判断语句]

E.g
>>>d = {'x':'A','y':'B','z':'C'}
>>>[k + '=' + v for k,v in d.items()]
>>>['y=B','x=A','z=C']

>>>L=['Hello','World','IBM']
>>>[s.lower() for s in L]	全部字符串变成小写
>>>['hello','world','ibm']

生成器(generator)

非创建一个完整的list,保留创建list元素的算法,再根据需要进行计算。
一边循环,一边计算。

E.g
>>>L=[x*x for x in range(10)] 比对
>>>L
>>>g=(x*x for x in range(10))	()
>>>g				   生成一个地址

打印所需要的元素(next()函数)

>>>next(g)
0
>>>next(g)
1
···
>>>next(g) 打印完全部全部元素后,报错

更方便的打印元素

>>>g=(x*x for x in range(10))
>>>for n in g:
		print(n)	   打印全部元素,不报错,也没有调用next()

next()和循环打印不要重复使用,打印出的元素,不会再重复(重新)打印了。

以函数作为生成器
举例

普通的斐波拉契数列函数
def fib(max): 
	n,a,b=0,0,1
	while n<max:
		print(b)
		a,b=b,a+b
		n=n+1
	return 'done'
变成生成器
def fib(max):
	n,a,b=0,0,1
	while n<max:
		yield b						
		a,b=b,a+b
		n=n+1
	return 'done'

函数定义中包含yield,非普通函数,就是一个生成器

>>>f=fib(3)
>>>f				  得到一个地址?(生成器)

两种方法得到返回值,
1、next()
2、for循环(显然更加常用)

>>>for n in fib(3):	循环遇到yield中断,下一次从yield中断地方开始
		print(n)

如同前面的列表生成式改成生成器,for循环 得不到错误结果 不会报错

得不到 return 的返回值结果,以yield 结束/开始 的

简单举例:

g = fib(6)
>>>while True:
		try:
			x=next(g)
			print(x)
		except StopIteration as e:
			print(e.value)
			break

如此可打印 return 的返回值

迭代器(Iterator)

可直接用于 for 循环的数据类型
1、集合数据类型
list、tuple、dict、set、str
2、生成器
生成器、带yield的生成器函数

以上称为可迭代对象 Iterable
判断是否 可迭代对象

E.g
>>>from collections import Iterable
>>>isinstance((x for x in range(10))),Iterable)

判断是否 迭代器

E.g
>>>from collections import Iterator
>>>isinstance((x for x in range(10))),Iterator)

迭代器 包括 生成器
可迭代对象(1)
可以通过 iter() 函数转化为迭代器

E.g
>>>isinstance(iter([]),Iterator)

以下仅做了解
Python for 循环本质调用next()函数实现
(上文,迭代出来的值不会重复(重新)迭代出来)

for x in [1,2,3,4]
	pass
等价于	it=iter([1,2,3,4])
while True:
	try:
	 x=next(it)
    except StopIteration:
	 break

猜你喜欢

转载自blog.csdn.net/weixin_43420243/article/details/86693133