python学习作业笔记三

#!/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)

猜你喜欢

转载自blog.csdn.net/QWERTY1994/article/details/81735943