Python生成器/推导式/生成器表达式
一 生成器
生成器的本质就是迭代器
生成器的特点和迭代器一样,取值方式和迭代器一样(__next__(), send(): 给上一个yield传值)
生成器一般由生成器函数或者生成器表达式来创建
其实就是手写的迭代器
- def func():
- print("")
- yield 123
- ret = func()
- print(ret)
由于函数中含有yelid,那么这个函数就是生成器函数, 且执行这个函数的时候就不再试函数的执行了,而是获取这个生成器.
如何使用:
- def func():
- print("")
- yield 123
- ret = func() #这个时候函数不会被执行而是获取生成器
- print(ret) #按以前函数的方法执行会打印出地址
- s = ret.__next__()
- print(s)
- 结果
- <generator object func at 0x000002EB35432C50>
- 111
- 123
yield 是分段执行这个函数, return 是直接停止执行这个函数
- def func():
- print(123)
- yield 456
- print(789)
- yield 147
- print(258)
- yield 369
- ret = func()
- print(ret.__next__())
- print(ret.__next__())
- print(ret.__next__())
- print(ret.__next__()) #最后一个yield 执行完毕,再次 __next__()程序会报错, 与return无关
- #结果
- 123
- 456
- 789
- 147
- 258
- 369
- Traceback (most recent call last):
- File "E:/Python/day13/练习.py", line 48, in <module>
- print(ret.__next__())
- StopIteration # 报错
生成器函数:
1 和普通函数没有区别,里面有 yield 的函数就是生成器函数
2 生成器函数在执行的时候, 默认不会执行函数体, 返回生成器
3 通过生成器的__next__() 分段执行这个函数
4 send() 给上一个 yield 传值, 不能再开头(没有上一个yield) 最后一个yield 也不能用send()
生成器作用:
举一个例子---
比如 你比较喜欢吃鸡蛋,一次性给你买几千个鸡蛋 , 够你吃几年了, 那么这些鸡蛋你怎么存放, 需要很多地方存放,
所以这样你想吃鸡蛋了就去买一个,想吃了就买一个,是不是也能一直吃鸡蛋
- ef func():
- for i in range(1,5000):
- yield "鸡蛋"+str(i)
- ret = func()
- print(ret.__next__())
- print(ret.__next__())
- print(ret.__next__())
- print(ret.__next__())
- print(ret.__next__())
- # 结果
- 鸡蛋1
- 鸡蛋2
- 鸡蛋3
- 鸡蛋4
- 鸡蛋5
区别 : 如果直接买几千个给你吃 , 会很占地方, 在程序中就是很占内存, 然而上面的方法是 你想吃就买一个, 不会占地方
所以 生成器非常省内存
send()
方法: send()方法和__next__方法一样都可以让生成器执行到下一个yield
- def func():
- print(1)
- a = yield 2
- print(a)
- b = yield 4
- print(b)
- c = yield 6
- print(c)
- d = yield 8
- gen = func()
- ret = gen.__next__()
- print(ret)
- ret1 = gen.send("金")
- print(ret1)
- ret2 = gen.send("天")
- print(ret2)
- ret3 = gen.send("下")
- print(ret3)
- #结果
- 1
- 2
- 金
- 4
- 天
- 6
- 下
- 8
send() 和 __next__的区别:
1 send 和next() 都是让生成器向下走一次
2 send 可以个上一个yield的位置传递值,不能给最后一个 yield 发送值,在第一次执行生成器代码的时候不能使用 send()
推导式:
列表推导式: 就是用一句话来生成一个列表
语法: [结果 for循环 判断]
- lis = [i for i in range(50) if i%2==1]
- print(lis)
- 结果
- [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]
字典推导式
语法:{k:v for循环 条件判断}
- lis = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]
- dic = {i:lis[i] for i in range(len(lis)) if i%3!=0}
- print(dic)
- #结果
- {1: 3, 2: 5, 4: 9, 5: 11, 7: 15, 8: 17, 10: 21, 11: 23, 13: 27, 14: 29, 16: 33, 17: 35, 19: 39, 20: 41, 22: 45, 23: 47}
集合推导式
语法: {k for循环 条件判断}
- lis = [1,2,3,4,5,6,7,8,12,1,2,3,4,3,3,33,44,55,11,22,33,44,55,333,442,223,3,21]
- set = {i for i in lis}
- print(set)
- #结果
- {1, 2, 3, 4, 5, 6, 7, 8, 33, 11, 12, 44, 333, 21, 22, 55, 442, 223}
生成器表达式:
格式: (结果 for循环 条件判断)
特点:
1 惰性机制
2 只能向前
3 节省内存
重点: 面试题
- def add(a,b):
- return a + b
- def test():
- for te in range(4):
- yield te
- g = test()
- for i in [2,10]:
- g = (add(i,n) for n in g )
- print(list(g))
- 上面的程序详解步骤:
- for i in [2,10]:
- g = (add(i,n) for n in g )
- 由于for循环 i = 2的时候没有取值
- 所以当i = 10 的时候才取值
- i = 2时
- g = (add(i,n) for n in g ) 但是没有取值
- i = 10时
- g = (add(i,n) for n in (add(i,n) for n in g ) )
- 把i 换成10
- g = (add(10,n) for n in (add(10,n) for n in g ) )
- 因为g 是0, 1 , 2 , 3
- 所以 10 11 12 13
- g = (add(10,n) for n in (add(10,n) for n in g ) )
- g = (add(10,n) for n in (10,11,12,13) )
- g = [20,21,22,23]
Python生成器/推导式/生成器表达式的更多相关文章
- python 列表推导式,生成器推导式,集合推导式,字典推导式简介
1.列表推导式multiples = [i for i in range(30) if i % 2 is 0]names = [[],[]]multiples = [name for lst in n ...
- day15(PYTHON)推导式{生成器,字典,列表,集合}
#[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理 #[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能 # ...
- Python——生成器&推导式
生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. ...
- python之生成器(~函数,列表推导式,生成器表达式)
一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...
- python 生成器函数.推导式.生成器表达式
一.生成器 什么是生成器,生成器的实质就是迭代器 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 1 def func ...
- 12.Python略有小成(生成器,推导式,内置函数,闭包)
Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...
- 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ
一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...
- Python函数04/生成器/推导式/内置函数
Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...
- day14(2)---列表推导式、生成器推导式、字典推导式、三元表达式
一.列表推导式: ls = [元素表达式 for i in 可迭代对象 if 筛选条件] 案例: # -*- coding: utf-8 -*- '''列表生成式练习''' # 练习一(三元表达式): ...
随机推荐
- SQL Server中解决死锁的新方法介绍
SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的 ...
- 如何在eclipse中安装ADT
打开Eclipse,点击 Help -> Install New Software: 点击Add: 然后点击Archive,添加对应的上面的ADT-21.0.1.zip: OK后,再写上一个名字 ...
- MySQL 福利彩票业务 如何存储毫秒微秒
朋友在做福利彩票业务,遇到一个存储毫秒微秒数据的需求,问我mysql里面有何解决方案.我脑中一搜索,以前没有关注到,于是去官网查看,找到11.3.6 Fractional Seconds in Tim ...
- jmeter传入字符时文本显示乱码
1.使用CSV Data Set Config组件传入参数,当传入的是字符串时,显示乱码 百度查看答案有用如下:
- 余弦相似性计算及python代码实现
A:西米喜欢健身 B:超超不爱健身,喜欢打游戏 step1:分词 A:西米/喜欢/健身 B:超超/不/喜欢/健身,喜欢/打/游戏 step2:列出两个句子的并集 西米/喜欢/健身/超超/不/打/游戏 ...
- 自己搭建MVC时遇到的一些问题及解决办法
错误1 The view 'Index' or its master was not found or no view engine supports the searched locations. ...
- 拦截器springmvc防止表单重复提交【3】自己实际项目
1:[定义注解] package com.jspxcms.ext.interceptor; import java.lang.annotation.ElementType; import java.l ...
- Java类和数据结构中常用的方法
1.Object类里面常用的方法: protected Object clone()创建并返回此对象的一个副本. boolean equals(Object obj)指示其他某个对象是否与此对象“相等 ...
- LeetCode Design Log Storage System
原题链接在这里:https://leetcode.com/problems/design-log-storage-system/description/ 题目: You are given sever ...
- 一分钟理解js闭包
什么是闭包?先看一段代码: ? 1 2 3 4 5 6 7 8 9 10 function a(){ var n = 0; function inc() { n++; cons ...