zoukankan      html  css  js  c++  java
  • 价值2000块钱知识点

    主要是 迭代器和相关使用

    人生若只是初见

    1函数名的应用

     函数名就是变量

     可以相互赋值.

    可以作为容器的元素

    可以作为返回值进行返回

    可以作为参数传递给函数

    2 闭包

    在内部函数使用外部函数的变量.

    Def outer ():

    a=10

    Def inner(“”)

    Print(a)

    Return inner

    Outer()()

    Outer()()

    Ret =outer()

    Ret()

    Ret()

    闭包好处:

    1. 保护变量
    2. 可以让一个变量常驻内存
    3. 迭代器

       -iter-()  可迭代对象.获取迭代器

      _next_()   + _inter_()

    特点:

    1. 惰性机制
    2. 只能向前
    3. 节省内存

    For 循环的内部就是迭代器

    Lst=[1,3,5]

    It =lst._iter_()#获取迭代器

    While 1:

    Try:

    It._next_()

    Except StopIteration

    Break

    Iterable: 可迭代的

    Iterator:迭代器

    ,今日主要内容

    1. 生成器

    (1) 生成器的本质就是迭代器

    (2) 生成器的特点和迭代器一样,取值方式和迭代器一样(_next_(),send():给上一个yield)

    (3) 生成器一般由生成器函数或者生成器表达式来创建

    (4) 其实就是手写的迭代器

    1. 生成器函数

    和普通函数在执行的时候,默认不会执行函数体,返回生成器)

    通过生成器的_next_()分段执行这个函数.

    Send()给上一个yield传值,不能在开头(因为没有上一个yield),

    最后一个yield也不可能用send()

    1. 推导式
      1. 列表推导式[结果 for 循环 条件筛选]
      2. 字典推导式[k:v for 循环 条件筛选]
      3. 集合推导式{ k for 循环 条件}
    1. 生成器表达式

    (结果 for 循环 条件)

    特点:

    1. 惰性机制
    2. 只能向前
    3. 节省内存(鸡蛋)

    生成器函数的特点:

    函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数

     yield: 相当于return 可以返回数据. 但是yield不会彻底中断函数. 分段执行函数.

    gen.__next__() 执行函数. 执行到下一个yield.

     gen.__next__()  继续执行函数到下一个yield.

    send() __next__()是一样的. 可以执行到下一个yield, 可以给上一个yield位置传值

     def func():

         print("我是第一个段")

         a = yield 123

         print(a)

         print("石头人是第二段")

         b = yield 456

         print(b) # ??

         print("哈赛是第三段")

         c = yield 789

         print(c)

         print("刘伟是最后一个段")

         yield 79  # 最后收尾一定是yield

    print(g.__next__()) # 没有上一个yield 所以不能使用send() 开头必须是__next__()

    for i in func(): # for的内部一定有__next__()

         print(i)

     print(list(func())) # 内部都有__next__()

     推导式:就是用一句话来生成一个列表

    Lst=[“python”+str(i)  for i in range(1,16)]

    Print(lst)

    100以内能被3整除的数的平方

    Lst=[i*i for i inrange(100) if i%==0]

    字典的推导式 就一行

    Dic={i:lis[i] for i in range(len(lst))  if  i<2}

    Print(dic)

    dic = {"jj": "林俊杰", "jay": "周杰伦", "zs": "赵四", "ln":"刘能"}

    d = {v : k for k,v in dic.items()}

    S={i for i  in range(100)}可删除重复

    生成器表达式

    Tu=(i for i inrange(10))#没有元祖推导式.   括号是生成器表达式

    Print(tu) 生成器

    Lst=[i for i in range(10)]# 列表

    Print(lst)

    Gen=(i for i inrange(10))

    生成器函数

    Def func():

    Print(111)

    Yield 222

    Yiled 333

    G = func()  获取生成器

    g1 =(i  for i in g)   生成器

    G3=func()

    G2=(i for i in g3) # 生成器带括号的就是生成器表达式

    Print(list(g))      [222,333]  源头,从源头把数据拿走了

    Print(list(g1))     这里执行的时候. 源头已经没有数据了

    print(list(g2)) # ??? [] 这里也没有值了

    面试题  值钱的题

    ef add(a, b):

        return a  + b

    # 生成器函数 #  0-3

    def test():

        for r_i in range(4):

            yield  r_i

    # 0,1,2,3

    g = test() # 获取生成器

    for n in  [2, 10]:

        g = (add(n, i) for i in g)

    print(g)

    相当于白菜上的害虫

    大致意思是 上面定义了一个求和函数

    中间 test  是一个生成器函数 不会被执行

    然后到最后列表通过list 把生成器函数进行转化然后开始传值

    如果列表中有多个元素

    可以看成是

    N= 2;

    g = (add(n, i) for i in g)

    N=5:

    g = (add(n, i) for i in g)

    这是俩个生成器  都不执行  因为是惰性机制

    然后等list(g)开始执行

    执行  n =10 然后开始循环有几个元素就有几层  

    每个上层元素都赋值到下个g

    索引  根据最开始的函数0.123 n=5

    循环2次  到最后向里面放数据

    5*3+(0,4)结果就是15.16.17.18

  • 相关阅读:
    Linux部署项目因为配置文件导致项目启动失败
    SQL Server数据库安装过程中遇到的问题
    jsp页面提交的时候,浏览器提示未响应,因为脚本长时间运行
    Jquery获取列表中的值和input单选、多选框控制选中与取消
    回调函数的理解历程
    类型转换之转String
    LigerUI开发过程中踩过的坑
    常用方法
    线段树维护区间平均值和方差
    线段树维护区间最大子段和
  • 原文地址:https://www.cnblogs.com/zzy7372/p/9468069.html
Copyright © 2011-2022 走看看