#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/8/16 9:02
# @Author :
# 列表生成式
# 生成一个1到一百的列表
list1 = list(range(1, 101))
print(list1)
# 生成一个[1x1,2x2,....,100x100]的列表
list2 = [i * i for i in range(1, 101)]
print(list2)
# 生成一个1到100偶数的平方的列表
list3 = [i * i for i in range(1, 101) if i % 2 == 0]
print(list3)
# 多层循环的列表生成式
list4 = [n + m for n in 'abcd' for m in ' 1234']
print(list4)
# 利用列表生成式 列出当前目录下所有地文件和目录名
import os
[d for d in os.listdir(".")]
# 如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错:
# L = ['Hello', 'World', 18, 'Apple', None] 将这个列表全部字母变成小写生成一个列表 请使用列表生成式
def toLowerList(l):
if not isinstance(l, list):
raise TypeError('param mast be list')
return [x.lower() for x in l if isinstance(x, str)]
# 列表生成式如果数据太大会耗费很多内存的
# 所有有了一个生成器(generator)来优化
# 新建generator有很多种方式
# 1.第一种直接将列表生成式的[]改成小括号() 就可以了
l = [x * x for x in range(1000)] # 列表生成式
g = (x * x for x in range(1000)) # generator生成器
# 可以使用next(g)获取 当然也可以使用for in循环 ,他也是一个可以可以迭代的对象
for n in g:
print(n)
# 2.对于复杂的generator生成器我们可以使用函数来创建
# 比如著名的斐波拉契数列
# 输出前max个斐波拉契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b # 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:
a, b = b, a + b
n = n + 1
return 'done'
# 这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。
# 而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
# 可以用next()调用 但是一般我们都是用for in
# 但是用for循环调用generator时,发现拿不到generator的return语句的返回值。
# 如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
for i in fib(100):
print(i)
练习
杨辉三角定义如下:
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
/ \ / \ / \ / \
1 4 6 4 1
/ \ / \ / \ / \ / \
1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
def triangles(n):
l = [1]
while True:
yield l
l = [l[x] + l[x + 1] for x in range(len(l) - 1)]
l.insert(0, 1)
l.append(1)
if len(l) > n:
break
for i in triangles(10):
print(i)