热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Python_011

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python_011相关的知识,希望对你有一定的参考价值。 一.生成器1 def func():2 print("111")3 ret

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python_011相关的知识,希望对你有一定的参考价值。




一.生成器


1 def func():
2 print("111")
3 return 222
5 ret = func()
6 print(ret)
7 #结果
8 111
9 222

1)这里面函数体里是返回值return;如果将return换成yield就是生成器


1 def func():
2 print("111")
3 yield 222
4 ret = func()
5 print(ret)
6 #输出结果
7

如果函数中包含了yield,那这个函数就是生成器了

所以:a;return直接返回结果,结束函数的调用

   b:返回结果,可以让函数分段执行

关于生成器的的小坑;


1 def func():
2 i = 1
3 while i <1000000:
4 yield "%s" % i
5 i += 1
6 print(func().__next__())#不是同一个生成器,开辟了一个新空间
7 print(func().__next__())#相当于一个新的生成器从第一步执行,相当于格式化了func()中的所有东西
8 print(func().__next__())
9 #1,1,1
10 为什么会不变呢,因为执行每一次print,都相当于重新拿了一个生成器,
11 然后从头开始找第一个yield;

生成器是不能进行赋值运算的;所以正确格式:上下两个程序少了一个func = func()


1 def func():
2 i = 1
3 while i <1000000:
4 yield "%s" % i
5 i += 1
6 func = func()
7 print(func.__next__())#不是同一个生成器
8 print(func.__next__())#相当于一个新的生成器从第一步执行
9 print(func.__next__())
10 #输出结果:
11 1,2,3


2)生成器的作用


1 #代码一
2 def cloth1():
3 lst = []
4 for i in range(10000):
5 lst.append(i)
6 return lst
7 c1 = cloth1()
8 #代码二
9 def cloth():
10 for i in range(100000):
11 yield \'衣服\' + str(i+1)
12 c = cloth()
13 for i in range(10):
14 print(c.__next__())

这两段代码差别之处,就是代码一一下子就提取了10000个数,太耗内存;

代码二:是可以控制的,我要几个,你给我几个;惰性机制;


二.send和.next()的区别

1.还是上面的程序,你用._next_()的话,会直接一次性全拿出来值,会很占用内存,生成器的话,是可控的,一个一个

指下去,不会回去,下一次继续获取指针指向的值;

这里面send是怎么运行的,第一行._next_()是运行到红色范围的yield,然后print(g.send(1))是函数func

从a开始执行到下一个yield "22",然后把send的里面的1赋值给a;

代码展示:

 


1 def func():
2 print("大碴粥")
3 a = yield "11"
4 print(a)
5 print("狗不理")
6 b = yield "22"
7 print(b)
8 print("大麻花")
9 c = yield "33"
10
11 g = func()
12 print(g.__next__())
13 print(g.send(1))
14 print(g.__next__())
15 #输出结果
16 大碴粥
17 11
18 1            #这是send里面的1赋值给了a
19 狗不理
20 22
21 None           #因为b是._next_()执行的,没用进行赋值,所以为None
22 大麻花
23 33

注意:第一个不能用send(),最后一个也不要传值;


三.列表推导式,生成器表达式以及其他推导式


1.列表推导式

平常代码:


1 lst = []
2 for i in range(1,16):
3 lst.append(i)
4 print(lst)
5 #输出结果
6 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

 

替换成列表推导式


lst = [i for i in range(1,16)]
print(lst)
#输出结果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

这里的lst直接相当于append进行的添加;


1 lst = ["python%d" % i for i in range(1,16)]
2 print(lst)
3 #输出结果
4 [\'python1\', \'python2\', \'python3\', \'python4\', \'python5\', \'python6\', \'python7\', \'python8\', \'python9\', \'python10\', \'python11\', \'python12\', \'python13\', \'python14\', \'python15\']


1 判断列表中的有两个e的元素
2 names = [[\'Tom\', \'Billy\', \'Jefferson\' , \'Andrew\' , \'Wesley\' , \'Steven\' ,
3 \'Joe\'],[\'Alice\', \'Jill\' , \'Ana\', \'Wendy\', \'Jennifer\', \'Sherry\' , \'Eva\']]
4 lst = [name for index in names for name in index if name.count("e") == 2]
5 print(lst)
6 #输出结果
7 [\'Jefferson\', \'Wesley\', \'Steven\', \'Jennifer\']


2.生成器推导式

a:生成器表达式和列表推导式基本一致,只是把[]替换成了()

gen = (i for i in range(10))

print(gen) #输出结果得到的是一串地址,你要用._next_()才能一步一步执行生成器;

生成器表达式和列表推导式两者的区别就是前者是惰性机制,要一个给一个,后者是一次性生成,比较耗内存;

b:生成器的惰性机制

上代码:

 *************深坑请留意*************


1 def func():
2 print(111)
3 yield 222
4 g = func() #生成器g
5 g1 = (i for i in g) #生成器g1,for循环只是让g变成了一个迭代器,而没有向它取值
6 g2 = (i for i in g1)   #生成器g2,跟g1相似,没有东西让他取值,就不运行
7 print(list(g)) #list内部有一个append,我跟你生成器要值了,你会运行你的函数
8 print(list(g1)) #而._next_()只是生成器要值后执行的语句,
9 print(list(g2))
10 #输出结果
11 111
12 [222]
13 []
14 []

 

这里面第一个print里面的list(g)相当于list.append()向g要值了,g才会去调用函数,就是你第四行的代码该运行

运行,但是就是不调用我的函数,你就只调用我的变量g,而不执行g;

而当运行第二个print里面的list(g1)时,执行g1=(i for i in g)时,g._next_()已经运行到最后一个yield了,

所以g1再迭代g,已经取不到值了.所以为空列表;

c:字典的生成器格式

ls1 = [1,2,3,4,5] ls2 = [5,6,7,8,9]

dic = {ls1[i]:ls2[i] for i in range(len(ls1))}

d:总结 推导式有:列表推导式,字典推导式,集合推导式,没有元组推导式

面试题:


1 def add(a,b):
2 return a+b
3 def test():
4 for i in range(4):
5 yield i
6 g = test()
7 for n in [2,10]:
8 g = (add(n,i) for i in g)
9 \'\'\'
10 执行效果
11 n = 2
12 g = (add(n,i) for i in test())
13 n = 10
14 g = (add(n,i) for i in ((add(n,i) for i in test()))
15 这里一直没有取值操作,所以不会执行test()函数,而取n值的时候,是最后一步
16 才取的n值,你要带入了,我给你值,否则你就一直用我的变量带入吧;
17 \'\'\'
18 print(list(g))
19 #输出结果
20 [20, 21, 22, 23]

 



推荐阅读
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
author-avatar
米字格时光
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有