python生成器表达式_Python基础----生成器、三元表达式、列表生成式、生成器表达式...

生成器

生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器。

def foo():

print('first------>')

yield 1

print('second----->')

yield 2

print('third----->')

yield 3

print('fouth----->')

g=foo()

from collections import Iterator

print(isinstance(g,Iterator))

print(g)

yield的功能:

1.与return类似,都可以返回值,但不一样的地方在于可以有多个yield,每个yield能够返回一次值,而return只能返回一次值就结束了

2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器

3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的

生成器的使用

def foo():

print('first------>')

yield 1

print('second----->')

yield 2

print('third----->')

yield 3

print('fouth----->')

g=foo()

print(g.__next__())

print(g.__next__())

print(g.__next__())

# print(g.__next__())

输出结果

first------>

1

second----->

2

third----->

3

第一次g.__next__()在函数体的第一个yield结束后暂停,并执行前面的指令

第二次g.__next__()在函数体的第二个yield结束后暂停,并执行前面的指令

第三次g.__next__()在函数体的第三个yield结束后暂停,并执行前面的指令

如果来第四次g.__next__()方法,将抛出StopIteration提示错误

for循环调用:for会自动处理StopIteration,当遇到StopIteration自动停止

for i in g: #obj=g.__iter__() #obj.__next__()

print(i)

输出结果

first------>

1

second----->

2

third----->

3

fouth----->

如果生成器函数不赋值变量,那么每次执行都是全新的生成器函数,并没有迭代的效果,如下:

def foo():

print('first------>')

yield 1

print('second----->')

yield 2

print('third----->')

yield 3

print('fouth----->')

print(foo().__next__())

print(foo().__next__())

print(foo().__next__())

输出结果

first------>

1

first------>

1

first------>

1

使用print测试foo函数,会发现,同一时间输出的foo函数,内存地址并不同

print(foo(),foo(),foo())

输出结果:

生成器示例:一个yield返回多个值

def countdown(n):

print('starting countdown')

while n > 0:

yield n

n-=1

print('stop countdown')

g=countdown(5)

for i in g:

print(i)

输出结果

starting countdown

5

4

3

2

1

stop countdown

生成器模拟linux命令:tail -f a.txt |grep 'error' |grep '404'

当在a.txt文件中输入字符串,如果包含error并且包含404,那么将打印出该行,其他不打印

import time

def tail(filepath,encoding='utf-8'):

with open(filepath,encoding=encoding) as f:

f.seek(0,2)

while True:

# f.seek(0, 2) #不行

line=f.readline()

if line:

# print(line,end='')

yield line

else:

time.sleep(0.5)

def grep(lines,pattern):

for line in lines:

if pattern in line:

# print(line)

yield line

g1=tail('a.txt')

g2=grep(g1,'error')

g3=grep(g2,'404')

for i in g3:

print(i)

三元表达式

简化代码量:比较两个数的大小,可以用以下if语句完成

x=2

y=3

if x > y:

print(x)

else:

print(y)

使用三元表达式:可以简化成一行解决

res='x' if x > y else 'y'

print(res)

三元表达式即 'x' if x > y else 'y'

当条件为真,那么输出条件左边的值,当条件为假则输出右边的值

示例:

def max2(x,y):

# if x > y:

# return x

# else:

# return y

return x if x > y else y

print(max2(1,2))

列表生成式

简化生成列表的代码量

如:将s='hello'的字符串转化成大写,并将每一个字符转化成列表元素,即['H','E','L','L','O']

普通循环代码:

s='hello'

l=[]

for i in s:

res=i.upper()

l.append(res)

print(l)

列表解析代码:

s='hello'

res=[i.upper() for i in s]

print(res)

使用列表解析能够简化简单的代码生成

列表生成式说明:

示例:

l=[1,31,73,84,57,22]

print([i for i in l if i > 50])    #l列表中大于50的元素生成一个新列表

print([i for i in l if i < 50])    #l列表中小于50的元素生成一个新列表

print([i for i in l if i > 20 and i < 50]) #l列表中大于20小于50的元素生成一个新列表

生成器表达式

类似于列表生成式,只不过将中括号换成小括号,每次执行next将输出一个元素,占用内存小,每次只占用一个元素的内存空间

g=(i for i in range(1000))

print(g) #生成器

print(next(g)) #每次执行next(g)即可输出一个元素

print(next(g))

print(next(g))

print(next(g))

输出结果

at 0x00000205FFE91E60>

0

1

2

3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python三元表达式是一种简洁的条件语句,用于根据条件判断返回不同的值。它的语法形式是`a if condition else b`,其中`condition`是一个布尔表达式,如果条件成立,则返回`a`,否则返回`b`。 生成器是一种特殊的迭代器,它可以按需生成序列中的元素,而不是一次性将所有元素存储在内存中。这样可以大大减少内存的使用,尤其对于处理海量数据时非常有用。通过编写生成器函数或使用生成器推导式,可以根据某种算法来计算出后续的元素,只在需要访问某个元素时才生成该元素,而不是提前生成整个序列。 在Python中,可迭代对象是指实现了`__iter__()`方法的对象,该方法返回一个迭代器对象。迭代器对象实现了`__next__()`方法,每次调用该方法时返回下一个元素。可迭代对象和迭代器对象可以用于`for`循环中,让我们能够遍历对象的每个元素。通常,可迭代对象是一个类,它实现了`__iter__()`方法,并返回一个迭代器对象。 综上所述,Python三元表达式是一种用于根据条件判断返回不同值的语法结构,生成器是一种按需生成序列元素的特殊迭代器,可迭代对象是具有迭代能力的对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [第七篇:三元表达式、推导式、生成器、迭代器](https://blog.csdn.net/diandie4150/article/details/101607106)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值