1生成器

1生成器的本质 一定是迭代器(反之不一定(用send(生成器特有方法)验证))
2生成器是可以让程序员自己定义的一个迭代器
3生成器的好处,节省内存空间
4生成器的特性,一次性的,惰性机制,从上往下
5send 相当于next + 传值,第一次出生成器的时候,如果使用send(这必须是None),建议开始__next__
6# python 2 next() iter() # python 3 next() iter() __next()__ __iter()__ 7yield 将可迭代对象元素逐个返回
函数体存的是代

#存yield 的时候是生成器
  函数生成生成器
def fun():
print(1)
yield 4
g = fun()
#碰到return 就结束函数
#碰到 yield 就挂起
def fun():
print(1)
return 2
def fun():
print(1)
yield 4

三个错误分析

语法分析  语义分析 词法分析

生成器的两种情况

新建一个 用完就没 没了打错

def fun():
print(1)
yield 4 #我的函数走到这 生成第一个 之前的清空了
print(2)
yield 9 #第二部函数走到这
g = fun() #生成一个生成器
fun()# #生成一个生成器
print(g.__next__() )
print(g.__next__() )# yield后面的
# print(g.__next__() )#迭代器 惰性只能用一个

直接使用  永不枯竭

print(fun().__next__())  #fun()  这样生成 一个生成器
# print(fun().__next__())
print(fun().__next__())#fun()又重新生成一个生成器 若有多个yield 到不了第二个

print(list(range(10000)))
#浪费内存
生成器
非常节省内存
send
def fun():
print(1)
a = yield 2#1挂起2返回值3接受值
print(a) print(2)
a = yield 3
# print()
c =yield 2
g = fun() print(g.__next__()) # 有括号执行
a = g.__next__() #接受值
print(a,'aa') #第一次使用生成器 不是只用next
#第一次只能是None 如果非要传值
# print(g.send(None))#send = next + 传值
print(g.send(''))#send = next + 传值
# print(g.__next__())
# print(g.send('234'))#send = next + 传值
# next + send = num(yield)

yiled from

只建一个新变量 和每次都建变量

def fun():
li = [1,2,3,4]
yield from li
ret = fun().__next__()
print('ret is ', ret)
ret = fun().__next__()
print('ret is ', ret) a = fun() #把生成器地址给了a 和函数地址不一样
ret1 = a.__next__()
# 执行ret 这个变量的指向的生成器地址
ret2 = a.__next__()
print(ret1,ret2)
print(a)
def fun():
li = [1,2,3,4]
li1 = [9,6,7,7] # yield from li,li #会报错
yield from li #会报错
yield from li1 #会报错 ret = fun().__next__()
print('ret is ', ret)
ret = fun().__next__()
print('ret is ', ret) ad = fun() #把生成器地址给了a 和函数地址不一样
ret1 = ad.__next__()
# 执行ret 这个变量的指向的生成器地址
ret2 = ad.__next__()
print(ret1,ret2)
print(ad.__next__())
print(ad.__next__())
print(ad.__next__())
print(ad)

举例:

'''
在必应壁纸的组图,一个个是生成器的迭代
而不是所有的都加到前端,太大,加载速度慢'''

更乱的

def func():
if 2>1:
print('这是逻辑1')
yield True
else:
yield False
g = fun()
# while g.__next__():
# print(1)
print('s '.strip(),1)
s = 'ssss '.strip()
print(s, 1) def funny():
with open('t','r',encoding='utf-8'):
pass

推导式:

li = []
for i in range(10):
li.append(i) print([i for i in range(10)])
#[结果 语法]# 容器
li = []
for i in range(10):
if i%2 == 1:
li.append(i)
print(li)
print([i for i in range(10)if i%2==1])
for i in range(10):
for em in range(3):
li.append(em)
# 列表的
print([i for i in range(10)for em in range(3)])
# [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9]
print([em for i in range(10)for em in range(3)])
# [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
print([j for i in range(10)for em in range(3)for j in range(5)])#30个
# [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
print(i for i in range(10)for em in range(3))
print(i) #
# <generator object <genexpr> at 0x0000000001DE78E0>
# 集合推导式
print({i for i in range(10)for em in range(3)})
# {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
# 字典推导式
print({i : i+1 for i in range(10)}) #{‘电脑’:‘998’,‘998’:1}
# {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10} # 元组---没有
print((i for i in range(10)))#和上面的一样生成器
# 字符串也没有
print(i for i in 'adjaigia') #和上面的一样生成器
#生成器
g = (i for i in range(10))
a = g
print(a.__next__())
print(a.__next__())
#1. 外部需要容器报一下, 里面的第一个位置 结果 剩下位置都是语句
#2. 推导式 ----面试 实现小的需求时 可以使用推导式,节省代码
#3. 不要写太长,可读性差

从文本里面读文件,生成器的方式读出来,不是一次性都读出来,用多少使多少>>>>>>

文本如下

adfadafadfadfa

fadfasdfafassdfada

adafdafadfadffasf

adfafdafadfafsdfadfadafadfadfa

adfadfasdfafassdf

adafdafadfadffasf

adfafdafadfafsdfadfadafadfadfa

adfadfasdfafassdf

adafdafadfadffasf

adfafdafadfafsdf

代码如下

def funny():
with open('t', 'r', encoding='utf-8') as f:
for a in f:
if a == '\n':
del a #输出 多行 没输出a 的空行 但是也有空行输出
else:
yield a.strip() #这样就没空格了 怎么删了两次
# print(f.read())
# yield from f.read() # 这个是读的什么 显示的是a \n b \n c\n
# yield from f # 这个是读的什么 显示的是abcd 换好几行 在写 再换好几行 怎么执行完了还隔一行再写
g = funny().__iter__()
#确实是对的 #最后是 传入元素里还含有空格 ,然后用 strip 删除
# 多个才能看出来 以后不能 只弄两个 空格也是输出
print(g.__next__(),end='这里')
print('你是?',g.__next__(),'他是')
print('你是?',g.__next__())
print(g.__next__())
#明明可以下面 非要上面
for i in range(10):
print(g.__next__()) g = funny()#等于g = funny().__iter__()
print(g.__next__())

生成器举例:

#写那个逻辑的
def func():
if 2 > 1:
print('这是逻辑1')
yield True
else:
yield False
g = func()
print(id(g))#
# print(g.__next__())
while func().__next__(): #答案不一样
print(id(func())) #42333816
break
print(1)

  

python学习 day11 (3月16日)----(生成器内置函数)的更多相关文章

  1. Python学习日志9月16日

    刚才我差点睡着了,差资料的时候太费神,有些累. 今天早晨学习了<head first HTML and CSS>,今天把昨天没看了的关于字体和颜色的一章节看完了,真长.我详细的做了笔记,并 ...

  2. python学习 day22 (3月29日)----(生成器推导式)

    新手上路请多担待 1 2 封装 3 私有化封装 #__author : 'liuyang' #date : 2019/3/29 0029 上午 9:35 # 不想让别人看 修改 我的属性 # 源码来说 ...

  3. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

  4. Python【map、reduce、filter】内置函数使用说明(转载)

    转自:http://www.blogjava.net/vagasnail/articles/301140.html?opt=admin 介绍下Python 中 map,reduce,和filter 内 ...

  5. Python【map、reduce、filter】内置函数使用说明

    题记 介绍下Python 中 map,reduce,和filter 内置函数的方法 一:map map(...) map(function, sequence[, sequence, ...]) -& ...

  6. Python学习日志9月17日 一周总结

    周一,9月11日 这天写的是过去一周的周总结,我从中找出当天的内容. 这天早晨给电脑折腾装机,早晨基本上没有学习,休息了一个早晨. 下午写的上周总结,完事做mooc爬虫课的作业,<Think P ...

  7. Python 学习日志9月19日

    9月19日 周二 今天是普通的一天,昨天也是普通的一天,刚才我差点忘记写日志,突然想起来有个事情没做,回来写. 今天早晨学习<Head First HTML and CSS>第十一章节“布 ...

  8. python学习 day7 (3月8日)

    read()读出来了之后文件里就从之后开始  光标不知道在哪 编码的进阶: 背景: ASCII:英文字母,数字,特殊符号,------------>二进制的对应关系 str: 一个字符 ---- ...

  9. python学习 day12 (3月18日)----(装饰器内置函数)

    读时间函数: # import time # def func(): # start_time = time.time() # 代码运行之前的时间 # print('这是一个func函数') # ti ...

随机推荐

  1. 如何解决make: Nothing to be done for `all' 的方法

    正常情况下,当文件没有更新且已经编译过时,再次make就会报这个错误,表示文件未更新,不需要编译. 如果异常情况没有检测到更新文件,或者想要强制重新编译,只需要make clean,再次编译即可.

  2. 【收藏】UI自动化测试基本规则与设计模式

    总体规则 所有模块设计均遵循page object结构 用例层:测试人员编写测试用例代码的地方,可以调用page层和封装层. page层:一个页面一个类,包含该页面的业务逻辑封装以及部分控件定义. 封 ...

  3. POJ-3984.迷宫问题(BFS + 路径输出)

    昨天中午做的这道题,结果蛙了一整天,就因为一行代码困住了,今天算是见识到自己有多菜了.流泪.jpg 本题大意:给一个5 * 5的迷宫,1表示墙壁,0表示通路,从左上角走到右下角并输出路径. 本题思路: ...

  4. Codeforces Round #520 (Div. 2)

    Codeforces Round #520 (Div. 2) https://codeforces.com/contest/1062 A #include<bits/stdc++.h> u ...

  5. bootloader新的理解

    1.对于bootloader这样的程序,作为板卡刚开始启动的部分,大致的顺序是一致的,大部分都是分为两个部分,一部分是汇编编写的,一部分是用c语言编写的.一般在汇编部分完成各种初始化的操作,比如关闭看 ...

  6. 干净的ssm框架项目

    其中数据库只有如下表与字段 访问效果: 项目下载: 干净的ssm框架项目.rar

  7. 8.17 纯css画一个着重号图标

    今天看到一个同事写的着重号图标,我以为是图片,仔细一看,是span标签!哇!!学习一下哈哈 图标长这样: CSS代码: .hint{ display: inline-block; width: 20p ...

  8. spring boot 2.0 与FASTDFS进行整合

    只支持在spring-boot 2.0以及以上版本中使用 1.pom.xml 里引入FASTDFS的依赖,toobato与fastdfs作者一起,将fastdfs的功能进行了重构与简化 <!-- ...

  9. nginx: [emerg] mkdir() "/var/temp/nginx/client" failed (2: No such file or directory)

    报错信息 [root@bogon sbin]# ./nginx nginx: [emerg] mkdir() : No such file or directory) 解决方法 [root@bogon ...

  10. 深入理解HTTP协议及原理分析

    1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和 ...