python生成器

#在了解生成器之前,可以先看看一个名为"列表生成式"的东西

list = [ x*2 for x in range(0,9) ]
print(list)
print(type(list))

########
[0, 2, 4, 6, 8, 10, 12, 14, 16]
<class 'list'>

#由名字可知,列表生成式的作用就是生成一个列表,规则是: [ f(x) for x in 序列 ]

#但是,列表声称式会将生成的列表直接放入内存中,当数据较大时不适用

 

#所以就有了生成器

#生成器的第一种创建方法:( f(x) for x in 序列 )

s1 = ( x*3 for x in range(0,3) )
print(s1)

########
<generator object <genexpr> at 0x0000000001E8C518>

#发现直接打印s1无法获取其中的信息,输出的是 生成器对象和其地址

#这就是生成器与列表生成式的区别所在,生成器不会直接将所有数据放入内存中,而是作为一个对象返回

#当需要使用时,通过next()方法调用

print(next(s1))
print(next(s1))
print(next(s1))
print(next(s1))

########
0
3
6
Traceback (most recent call last):
  File "E:/9--python/python_project/test.py", line 25, in <module>
    print(next(s1))
StopIteration

#生成器在创建时就已经确定了其数据量,调用的次数就已经确定,如果超过生成器的数据量的调用就会有  StopIteration  的报错,此报错在for循环中会用到,当然这是后话

#由此可见,生成器占用的内存仅为保存对象地址,在调用时才生成值

#第一种生成器的创建比较粗旷,另外一种生成器的创建则可定义的内容较多

def foo():
    print("ok1")
    yield 2
    print("ok2")
    yield 5
s2=foo()
print(s2)
print(next(s2))
print(next(s2))
print(next(s2))

########
<generator object foo at 0x00000000027CC518>
ok1
2
ok2
5
Traceback (most recent call last):
  File "E:/9--python/python_project/test.py", line 37, in <module>
    print(next(s2))
StopIteration

#生成器也算是函数的另一变种,一个yield就可以迭代一次,yield的返回值同return一样可以用参数接收

#在yield中,自动封装了next()方法,使得我们可以优雅的调用

#next()方法的路径是:

1.第一个next(s1),进入foo()函数体,遇到print("ok1"),输出

2.向下执行代码,遇到yield 2,返回指定值2,退出,状态保存在此,待下一个next()执行来调用

3.第二个next(s2),进入foo()函数体,从yield 2开始,向下执行代码,遇到print("ok2"),输出

4.向下执行代码,遇到yield 5,返回指定值5,退出,状态保存在此,待下一个next()执行来调用

5.第三个next(s3),进入foo()函数体,从yield 5开始,向下执行代码,因为没有yield,报错

#从以上可知,生成器的代码不会一次性执行完,而是遇到yield就退出,并将状态保存,待下次执行时调用,这个是实现协程的基础

#生成器除了next()方法外,还有一个可以传入参数的方法:generator.send()

def bar():
    count1 = yield 5
    print(count1)
    count2 = yield 1
    print(count2)
s3=bar()
ret1=s3.send(None)
print(ret1)
ret2=s3.send(2)
print(ret2)
ret3=s3.send(6)
print(ret3)

########
5
2
1
6
Traceback (most recent call last):
  File "E:/9--python/python_project/test.py", line 52, in <module>
    ret3=s3.send(6)
StopIteration

#generator.send()方法可以向生成器传入参数,但第一次因为还没有进入函数体,所以也不知道传递给那个参数,所以第一次使用send()方法时不能传入值,generator.send(None)=next(generator)

#当下一次使用send(var)方法传入值时,会进入上次退出的位置,将值传给此处预先定义的参数,向下执行代码,直到下一个yield,保存状态,退出

转载于:https://www.cnblogs.com/jianbonet/p/8657568.html

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值