генератор Python / генератор функций / вывод / вывод функции

1. Генератор
  Генератор является по существу итератора

  Есть три способа в питоне ⽅ ⽣ генератора для получения:

    1. Функционального генератор
    2. Генератор достигается с помощью различных отведений ⽣
    3. пути переключения данных может быть приобретен генератор

  Особенности генераторов и итераторы точно так же , как значения и итераторы (__Next __ (), отправить. (): Передать значение доходности).
  Генератор обычно создаются с помощью выражения генератора генератора или функций
  на самом деле почерк итератор

2. Функциональный генератор
  и нормальную функцию без различия. Выход есть функция генератора функции.
  Функция генератора при выполнении по умолчанию не выполняет его функции. Возвращает генератор
  через генератор __next __ () Постановка эта функция.
  отправить () , чтобы передать значение текучести, а не начало другого (не на выход), конечный выход не может отправить ()

Поэтому особенно Во-первых, мы рассмотрим очень простую функцию:

Защиту FUNC (): 
    печать ( "111") 
    возвращают 222 
RET = FUNC () 
печать (RET) 
结果: 111 222

 

Возврат функционального генератора изменяется с получением

Защиту FUNC (): 
    печать ( "111") 
    выход 222 
RET = FUNC () для 
печати (RET) 
结果: 
<объект генератора FUNC в 0x10567ff68>

  Когда работает результат тот же и экран не делает. Почему. Так как функция существует выход. Так что это ⼀ функция генератора функции. На этот раз мы снова выполнять функцию времени. Это уже не зависит от исполнения. ⽽ чтобы получить застройщику., как использовать его? хочу итератор. суть генератор итератор, поэтому мы можем направить выполнить __next __ () выполняется

Следующий генератор:

FUNC DEF (): 
    печати ( "111") 
выход 222 
. Функция Gener = FUNC () не выполняется в это время # ⽽ генератор получается 
RET = Gener .__ следующей __ () # Эта функция выполняется только когда эффект выхода. ., и возвращаются в виде возвращаемых данных 
печати (RET) 
результатов: 
111 
222

 

Таким образом, мы можем видеть, выход и вернуть эффект тот же. Что разница? Урожайность зависит от сегмента Perform линию. Верните? Выполните прямую функцию останова.

def func():
    print("111")
    yield 222
    print("333")
    yield 444
gener = func()
ret = gener.__next__()
print(ret)
ret2 = gener.__next__()
print(ret2)
ret3 = gener.__next__() # 最后⼀个yield执⾏完毕. 再次__next__()程序报错, 也就是说. 和return⽆关了.
print(ret3)
结果:
111
Traceback (most recent call last): 222
333
  File "/Users/sylar/PycharmProjects/oldboy/iterator.py", line 55, in
<module>
444
ret3 = gener.__next__() # 最后一个yield执行完毕. 再次__next__()程序报错, 也就是说. 和return⽆关了.
StopIteration

当程序运⾏完最后一个yield. 那么后⾯继续进行__next__()程序会报错.

我们来看send⽅方法, send和__next__()⼀一样都可以让⽣生成器执⾏行行到下⼀一个yield.

def eat(): 
    print("我喜欢玩王者荣耀的:") 
    a = yield "鲁班" 
    print("a=",a)
    b = yield "程咬金" 
    print("b=",b)
    c = yield "安琪拉" 
    print("c=",c) 
    yield "GAME OVER"

gen = eat() # 获取⽣成器
ret1 = gen.__next__() 
print(ret1)
ret2 = gen.send("大乔") 
print(ret2)
ret3 = gen.send("后裔) 
print(ret3)
ret4 = gen.send("马克") 
print(ret4)

send和__next__()区别:

1. send和next()都是让⽣成器向下走一次
2. send可以给上一个yield的位置传递值,不能给最后一个yield发送值.在第一次执⾏⽣成器代码的时候不能使用send()

⽣成器可以使⽤for循环来循环获取内部的元素:

def func():
    print(111)
    yield 222
    print(333)
    yield 444
    print(555)
    yield 666
gen = func()
for i in gen:
  print(i)
结果: 111 222 333 444 555 666

3. 推导式
  1. 列表推导式 [结果 for循环 条件筛选]\

首先我们先看一下这样的代码, 给出一个列列表, 通过循环, 向列表中添加1-14 :

lst = []
for i in range(1, 15):
    lst.append(i)
print(lst)

替换成列列表推导式:

lst = [i for i in range(1, 15)]
print(lst)

列表推导式是通过⼀行来构建你要的列表, 列表推导式看起来代码简单. 但是出现错误之后很难排查.

筛选模式:
  [ 结果 for 变量量 in 可迭代对象 if 条件 ]

# 获取1-100内所有的偶数
lst = [i for i in range(1, 100) if i % 2 == 0] 
print(lst)

⽣成器表达式和列表推导式的语法基本上是一样的. 只是把[]替换成()

gen = (i for i in range(10))
    print(gen)
结果:
<generator object <genexpr> at 0x106768f10>

⽣成器表达式也可以进行筛选:

# 获取1-100内能被3整除的数
gen = (i for i in range(1,100) if i % 3 == 0) 
for num in gen:
    print(num)

  2. 字典推导式 {k:v for循环 条件筛选}

# [11,22,33,44] => {0:11,1:22,2:33,3:44}
lst = [11,22,33,44]
dic = {i:lst[i] for i in range(len(lst)) if i < 2}
    print(dic)
# 语法:{k:v for循环 条件筛选}

  3. 集合推导式 {k for循环 条件}

 

# Набор толкающего типа 
LST = [1,1,4,6,7,7,4,2,2 ] 
S = {ЭЛ для EL в LST}
 печати (S) , 
S = SET (ЛСТ)
 для печати (S) ,

 

Выражение 4. Генератор

  ⽣ списочные и генераторные выражения разницы:

  1. Когда список потребления памяти, полученный компаратор одноразовые нагрузки. Генератор Используя выражение составляет почти без памяти. Использование только распределенную память и использование

  2. Значение, полученное не ⼀ соед. Формула получен список представляет собой список столбцов получены. ⽣ выражение генератора получен представляет собой генератор.

  (Результаты для условий езды на велосипеде)
  Характеристики:
    1. Инертной механизм
    2. Только вперед
    3. сохранить память

рекомендация

отwww.cnblogs.com/shagudi/p/10962976.html