标签:toolbar 更改 简单 优缺点 函数对象 bsp span 问题 迭代器
----->约定俗成:
函数中,只有一个位置参数时用argv表示
def func(argv):
pass
1.生成器:自定义的迭代器
生成器有两种形式:
a.生成器函数
b.生成器表达式
a.
def func1(x): x += 1 print(111111) yield x #有yield的叫生成器函数 print(222222) yield ‘alex‘ s = func1(5) # 叫生成器函数对象,这样不执行函数 s = s.__next__() #一个next对应一个yield #yield 将值返回给 s.__next__()
比较send()和yield的区别:
send()可以当yield来用,send()括号内需要有元素,向上一个yield发送数据,更改上一个yield的返回值,
所以第一次取值不能用send(),最后一个yield永远得不到send()传的值
def func1(): print(111) count = yield 1 print(count) print(222) yield 2 print(333) yield 3 g = func1() a = g.__next__() print(a) print(g.send(‘alex‘)) #----> send 可以当__next__ 用,同时将send(‘alex‘)内的元素发送给上一个yield print(g.__next__())
比较yeild和return的区别:
区别:return:在函数中遇到return,则结束函数,给函数执行者一个返回值
yield:在函数中有yield,调用函数时不执行函数,只有当函数名().__next__时才执行一个yeild,并将值返回给它
一个next对应一个yeild,可以多次调用,生成器函数本质是一个迭代器.
内存级别对比iter()和生成器函数;
iter()将可迭代函数转换为迭代器时,需要将可迭代函数的所有数据都加载到内存中才能转换,,这样会占用内存,不能处理大数据
生成器函数则不需要将数据都加载,而是要一个拿一个
生成器的基本应用:可分段生成无缝衔接
比较
1. def func(argv): for i in range(1,argv): print(‘骑士班%s期‘%i) func(5) 2. def func(argv): for i in range(1,argv): yield ‘骑士班%s期‘%i g = func(5) for j in range(1,5): print(g.__next__()) 3. def func(argv): for i in range(1,argv): yield ‘骑士班%s期‘%i for j in range(1,5): print(func(5).__next__())
注意:
def func(argv): for i in range(1,argv): yield ‘骑士班%s期‘%i g = func(10) for j in range(1,5): print(g.__next__()) for j in range(1,6): print(g.__next__())
b. 生成器表达式
g = [i for i in range(100)] 是列表推导式
g = (i for i in range(100)) 是生成器表达式
g = (i for i in range(100)) print(g.__next__()
2.列表推导式:
一行代码机会可以表示任何有规定的列表
有两种模式:
1.循环模式 : 变量(加工后的变量) + for i in iterable
list1 = [‘python %s 期‘%i for i in range(1,21)] print(list1) [‘python 1 期‘, ‘python 2 期‘, ‘python 3 期‘, ‘python 4 期‘] list1 = [i*i for i in range(1,11)] print(list1) [1, 4, 9, 16]
2.筛选模式: 变量(加工后的变量) + for i in iterable + if条件
一次循环:
list1 = [‘python %s 期‘%i for i in range(1,21) if i % 2 == 0] print(list1)
两次循环(循环不宜超过两次):
names = [[‘Tom‘, ‘Billy‘, ‘Jefferson‘, ‘Andrew‘, ‘Wesley‘, ‘Steven‘, ‘Joe‘], [‘Alice‘, ‘Jill‘, ‘Ana‘, ‘Wendy‘, ‘Jennifer‘, ‘Sherry‘, ‘Eva‘]] list1 = [j for i in names for j in i if j.count(‘e‘) == 2] print(list1) # 比较 print(list(j for i in names for j in i if j.count(‘e‘) == 2))
列表推导式的优缺点:
优点: 一行解决一个列表,简单方便
缺点:不易排错,不能解决所有列表问题问题,不要刻意使用
标签:toolbar 更改 简单 优缺点 函数对象 bsp span 问题 迭代器
原文地址:https://www.cnblogs.com/jiandanxie/p/9536477.html