首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python学习之路——列表生成式&生成器

今天学习到两个抽象程度很高的算法,先留个印象,后续用到的时候再深入研究。

List Comprehensions

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

#列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

list=list(range(1,11))

print(list)

#列表生成式可以直接带入循环

#写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来

l1=[x*xforxinrange(1,11)]

print(l1)

#for循环后面还可以带if判断

l2=[x*xforxinrange(1,11)ifx%2==]#1-11内偶数的平方

l3=[x*xforxinrange(1,11)ifx%2!=]#1-11内奇数的平方

print(l2)

print(l3)

#还可以两重循环,进行排列组合

l4=[x+yforxin'ABC'foryin'XYZ']

print(l4)

#运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,

#可以通过一行代码实现:

importos#引入os模块

l5=[dfordinos.listdir('C:\\')]#os.listdir可以列出文件和目录

print(l5)

#for循环可以同时使用多个变量,因此列表生成式也可以使用两个变量来生成list

d={'A':'X','B':'Y','C':'Z'}

l6=[x+'='+yforx,yind.items()]

print(l6)

#介绍一个将大写字母转换成小写的函数lower()

l7=['HALLO','WorD!','This','IS','Python']

print([x.lower()forxinl7] )

#lower()函数不能处理整数,可以用isinstance()函数判断类型

l8=['HALLO','WorD!','This',123,'IS','Python']

print([x.lower()forxinl8ifisinstance(x,str)])

generator

练习题答案明天再贴出来。

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

#列表存储的内容越多,占用内存越大,为了节约内存提高性能,

#出现了一种一边循环一边计算的机制,称为生成器:generator

#第一种创建generator的方法:将列表生成器的[]改成()

l=[x*xforxinrange(,10)]

print(l)

#直接改成(),但是创建成功了却无法直接打印出它的所有值,因为generator是算法,并不是具体的值

g=(x*xforxinrange(,10))

#print(g)

#如果要一个个打印,需要用next()函数,generator也是可迭代对象,我们用for in打印它的内容:

forxing:

print(x)

#第二种创建generator的方法是函数中包含yield语句:

#返回斐波拉契数列(除第一、二个数以外,后面的任意数都可以用前面的两个数相加得到)的前N个数:

deffib1(x):

n=

a=

b=1

whilen

print(b)

m=a

a=b

b=m+b

n=n+1

return'end'

print(fib1(6))

#上面函数中,a和b要互相赋值计算,但是一断其中一个变了,再拿去计算的时候结果就不是想要的,

#这种情况我们可以使用tuple这个不变对象来解决

deffib(x):

n,a,b=,,1#单变量赋值,可以写一起,按顺序赋值

whilen

print(b)

#此句相当于t=(b,a+b),t是一个tuple,a=t[0],b=t[1],但不必显式写出临时变量t就可以赋值。

a,b=b,a+b

n=n+1

return'end'

print(fib(6))

#将上述函数的print(b)改成yield b ,那么此函数就变成了一个generator

deffib2(x):

n,a,b=,,1#单变量赋值,可以写一起,按顺序赋值

whilen

yieldb

a,b=b,a+b

n=n+1

return'end'

t=fib2(6)

print(t)

'''generator和函数的执行流程不一样。函数是顺序执行,遇到return语句

或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()

的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行'''

forninfib2(6):

print(n)

'''但是用for循环调用generator时,发现拿不到generator的return语句的返回值。

如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:'''

g=fib2(6)

while True:

try:

x=next(g)

print('g:',x)

exceptStopIterationase:

print('生成器的return:',e.value)

break

'''练习

杨辉三角定义如下:

1

/\

1 1

/ \ /\

1 2 1

/ \ / \ /\

1 3 3 1

/ \ / \ / \ /\

1 4 6 4 1

/ \ / \ / \ / \ /\

1 5 10 10 5 1

把每一行看做一个list,试写一个generator,不断输出下一行的list:'''

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180501G0084000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券