Python 之列表生产式,生成器表达式

作者: ropon 分类: Python 发布时间: 2018-10-09 17:43
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/8 15:38
# @Author  : Ropon
# @File    : 13_01.py

# def func1():
#     print("11")
#     # return 22
#     # return,yield区别:yield是分段执行一个函数,return是直接停止执行函数。
#     yield 22
#
# ret =func1()
# # print(ret)
# ret1 = ret.__next__()
# print(ret1)

# def func1():
#     print("11")
#     yield 22
#     print("33")
#     yield 44
#
# ret = func1()

# ret1 = ret.__next__()
# print(ret1)
# ret2 = ret.__next__()
# print(ret2)
# ret3 = ret.__next__()
# print(ret3)

# while 1:
#     try:
#         ret1 = ret.__next__()
#         print(ret1)
#     except StopIteration:
#         break

# s = "测试字符串"
# print(dir(s)) #打印对象中的方法和函数
# print(dir(str)) #打印类中的方法核实函数

# lst = ["1", "2", "3"]
# # print(dir(lst))
# # print(lst.__iter__())
# ret = lst.__iter__()
# ret1 = ret.__next__()
# print(ret1)

# def yifu():
#     for i in range(1, 10000):
#         yield "衣服"+str(i)
#
# yf = yifu()
# print(yf.__next__())
# print(yf.__next__())
# print(yf.__next__())
# print(yf.__next__())
# print(yf.__next__())

# def eat():
#     print("chi shen me:")
#     a = yield "mantou"
#     print("a=", a)
#     b = yield "baozi"
#     print("b=", b)
#     # c = yield "huajuan"
#     # print("c=", c)
#
# ret = eat()
# ret1 = ret.__next__()
# print(ret1)
#
# ret2 = ret.send("ropon")
# print(ret2)
#
# ret3 = ret.send("peng")
# print(ret3)
#
# ret4 = ret.send("luo")
# print(ret4)


#send和__next__区别:
#1、都是让生成器向下走一次
#2、sed可以给上一个yield的位置传递值,但不能给最后一个yield传值,第一次执行生成器也不能使用send


#列表推导式
#常用写法:
#[结果 for 变量 in 可迭代对象]
#筛选模式
#[结果 for 变量 in 可迭代对象 if 条件]

# lst = [i for i in range(1, 100) if i % 2 == 0]
# print(lst)

#生成器表达式和列表推导式语法一样,只是将[]换成()
# gen = (i for i in range(1, 10))
# print(gen)
# ret = gen.__next__()
# print(ret)

# def func1():
#     print(11)
#     yield 22
#
# g = func1()
# g1 = (i for i in g)
# g2 = (i for i in g1)
#
# print(list(g))
# print(list(g1))
# print(list(g2))

#字典推导式
# dic = {'a': 1, 'b': 2}
# new_dic = {dic[key]: key for key in dic}
# print(new_dic)

#集合推导式
# lst = [1, 3, -1, 9, 8, -8]
# s = {abs(i) for i in lst} #abs返回其绝对值
# print(s)

#总结:推导式有,列表推导式、字典推导式、集合推导式,没有元组推导式
#生成器表达式:(结果 for 变量 in 可迭代对象 if 条件) 生成器表达式可直接获取其对象,对象可直接使用for循环,生成器具有惰性机制

def add(a, b):
    return a + b

def test():
    for r_i in range(4):
        yield r_i

g = test()
#0 1 2 3

# g = (add(2, i) for i in g)

#g的值是
# (
#     add(2, 0),
#     add(2, 1),
#     add(2, 2),
#     add(2, 3)
# )

# g = (add(10, i) for i in g)

#g的值是
# (
#     add(10, add(2, 0)),
#     add(10, add(2, 1)),
#     add(10, add(2, 2)),
#     add(10, add(2, 3))
# )
#遍历生成器开始运算输出结果
# print(list(g))
#输出[12, 13, 14, 15]

# for n in [2, 10]:
    # g = [add(n, i) for i in g] #列表生成式会一次性进行所有的运算
    # 第一次循环n=2,i第一次循环0 相加结果2 3 4 5
    # 第二次循环n=10,i第一次循环2 相加结果 12 13 14 15

    # g = (add(n, i) for i in g)  # 生成器表达式只有在被遍历时才会进行运算
    #第一次循环n=2,i 从0 1 2 3循环,因生成器具有惰性机制,n并没有取对应值,只是指向对应内存地址,g的值是
    # (
    #     add(n, 0),
    #     add(n, 1),
    #     add(n, 2),
    #     add(n, 3)
    # )
    #第二次循环n=10,i 从add(2, 0) add(2, 1) add(2, 2) add(2, 3)循环,同理,g的值是
    # (
    #     add(n, add(n, 0)),
    #     add(n, add(n, 1)),
    #     add(n, add(n, 2)),
    #     add(n, add(n, 3))
    # )
	#for循环完,系统会释放n,释放之前n先取值,g的值是
	 # (
    #     add(10, add(10, 0)),
    #     add(10, add(10, 1)),
    #     add(10, add(10, 2)),
    #     add(10, add(10, 3))
    # )
#遍历生成器开始运算输出结果
# print(list(g))
#输出[20, 21, 22, 23]

# n =2
# g = (add(n, i) for i in g)
# n = 10
# g = (add(n, i) for i in g)
# print(list(g))

#上次遗漏疑惑问题
# a = [1, 2]
# a[1] = a
#a[1]是a自己
#a=[1,a[1]] 
# print(a[1])

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!