今天学习到两个抽象程度很高的算法,先留个印象,后续用到的时候再深入研究。
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:'''
领取专属 10元无门槛券
私享最新 技术干货