价值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

原文地址:https://www.cnblogs.com/zzy7372/p/9468069.html