1 生成器(函数的变异)

判断一个函数是否是生成器函数:只需看函数内部是否有yield

# 生成器函数(内部是否包含yield)
def func():
print('F1')
yield 1
print('F2')
yield 2
print('F3')
yield 100
print('F4')
# (只要有yield)函数内部代码不会执行,返回一个 生成器对象 。
v1 = func()
# 生成器是可以被for循环,一旦开始循环那么函数内部代码就会开始执行。
for item in v1:
print(item)

循环流程:

    1. for循环开始第一次循环,先执行yield前面的代码,执行到yield时,返回yield的值给item并停止第一次循环。
    2. 第二次循环:从上次循环的yield后面开始执行代码,执行到第二个yield(yield2)时,返回yield2的值给item并停止第二次循环。
    3. 直到循环完所有的yield,循环自动终止
    def func():
    count = 1
    while True:
    yield count
    count += 1 val = func() for item in val:
    print(item)

    总结:函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数会返回一个生成器,生成器只有被for循环时,生成器函数内部的代码才会执行,每次循环都会获取yield返回的值。

    def func():
    count = 1
    while True:
    yield count
    count += 1
    if count == 100:
    return val = func()
    for item in val:
    print(item)

    示例:读文件

    def func():
    """
    分批去读取文件中的内容,将文件的内容返回给调用者。
    :return:
    """
    cursor = 0
    while True:
    f = open('db', 'r', encoding='utf-8')# 通过网络连接上redis
    # 代指 redis[0:10]
    f.seek(cursor)
    data_list =[]
    for i in range(10):
    line = f.readline()
    if not line:
    return
    data_list.append(line)
    cursor = f.tell()
    f.close() # 关闭与redis的连接 for row in data_list:
    yield row for item in func():
    print(item)

    redis源码示例

    生成器作用:

    • 生成数据

    • 是一种特殊的迭代器

      def func():
      yield 1
      yield 2
      yield 3 v = func()
      result = v.__next__()
      print(result)
      result = v.__next__()
      print(result)
      result = v.__next__()
      print(result)
      result = v.__next__()
      print(result)
    • 也是特殊的可迭代对象

      def func():
      yield 1 v = func()
      result = v.__iter__()
      print(result)

    其他知识:

    • yeild from关键字 (从xxx中一点点获取)

      def base():
      yield 88
      yield 99 def func():
      yield 1
      yield 2
      yield from base() # 从base()中一点点获取
      yield 3 result = func() for item in result:
      print(item)

    生成器的send方法

    def func():
    print(123)
    n = yield 'aaa'
    print('-->',n)
    yield 'bbb' g = func()
    print(g)
    n = next(g)
    print(n)
    print('-'*20)
    next(g) # g.send('uysdfhfoiusyg')与next(g)的作用一样

    注意:

    • 1.生成器取一次就没有了,再次取时内部为空

    • 2.惰性运算 :不取不执行

      ret = filter(lambda n:n%3==0,range(10))
      # ret是迭代器
      print(len(list(ret))) # 4 # list(ret) = [0,3,6,9]
      print(len(list(ret))) # 0 # list(ret) = []

2 推导式

2.1 列表推导式

  • 1.目的

    方便的生成一个列表

  • 2.基本格式

    • 变量 = [for循环的变量 for循环一个可迭代对象]

    • v1 = [i for i in 可迭代对象 ]

      v2 = [i for i in 可迭代对象 if 条件 ] # 条件为true时才进行append

    • 练习

      v1 = [ i for i in 'alex' ]   # ['a','l','e','x']
      v2 = [i+100 for i in range(10)] # [100,101,102,103,104,105,106,107,108,109]
      v3 = [99 if i>5 else 66 for i in range(10)] # [66,66,66,66,66,66,99,99,99,99] def func():
      return 100
      v4 = [func for i in range(10)] # [func,func,func,func,func,func,func,func,func,func,] v5 = [lambda : 100 for i in range(10)] # [lambda : 100,lambda : 100,lambda : 100,lambda : 100,lambda : 100,lambda : 100,lambda : 100,lambda : 100,lambda : 100,lambda : 100]
      result = v5[9]() # 100 v6 = [lambda :i for i in range(10)] # [lambda :i,lambda :i,lambda :i,lambda :i,lambda :i,lambda :i,lambda :i,lambda :i,lambda :i,lambda :i,]
      result = v6[5]() # 9 v7 = [lambda x:x*i for i in range(10)]
      # 1.请问 v7 是什么?
      v7 = [lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i,]
      # 2.请问 v7[0](2) 的结果是什么? v7[0](2) = 18 def num():
      return [lambda x:i*x for i in range(4)]
      # num() -> [函数,函数,函数,函数]
      print([ m(2) for m in num() ]) # [6,6,6,6] # ##################### 筛选 #########################
      v8 = [i for i in range(10) if i > 5] # [6,7,8,9]

2.2 集合推导式

  • 1.目的

    方便的生成一个集合

  • 2.基本格式

    • 变量 = {for循环的变量 for循环一个可迭代对象}

    • v1 = { i for i in 可迭代对象 }

      v2 = { i for i in 可迭代对象 if 条件 } # 条件为true时才进行append

      v1 = { i for i in 'alex' }   # {'a','l','e','x'}

2.3 字典推导式

  • 1.目的

    方便的生成一个字典

  • 2.基本格式

    v1 = { 'k'+str(i):i for i in range(10) }
    #{'K0':0,'K1':1,'K2':2,'K3':3,'K4':4,'K5':5,'K6':6,'K7':7,'K8':8,'k9':9} v1 = { 'k':i for i in range(10) } # {'k':9} #字典的键存在,则新值覆盖旧值,不存在则更新。

2.4 生成器推导式

# def func():
# result = []
# for i in range(10):
# result.append(i)
# return result
# v1 = func()
v1 = [i for i in range(10)] # 列表推导式,立即循环创建所有元素。
print(v1) # def func():
# for i in range(10):
# yield i
# v2 = func()
v2 = (i for i in range(10)) # 生成器推导式,创建了一个生成器,内部循环为执行。
# 示例一
def func():
result = []
for i in range(10):
result.append(i)
return result
v1 = func()
for item in v1:
print(item) # 示例二
def func():
for i in range(10):
def f():
return i
yield f
v1 = func()
for item in v1:
print(item()) # 示例三:
v1 = [i for i in range(10)] # 列表推导式,立即循环创建所有元素。
v2 = (lambda :i for i in range(10))
for item in v2:
print(item())

3 递归

递归就是 函数自己调用自己(缺点:效率低)

python默认支持的递归最大数是1000次

def func():
print(1)
func() func()
def func(i):
print(i)
func(i+1) func(1)
def func(a,b):          # 只能递归1000次的斐波那契
# 1
# 1
# 2
# 3
# 5
print(b)
func(b,a+b) func(0,1)
def func(a):
if a == 5:
return 100000
result = func(a+1) + 10
return result v = func(1)

# 递归的返回值
def func(a):
if a == 5:
return 100000
result = func(a+1) + 10 v = func(1)
name = 'alex'
def func():
def inner():
print(name)
return inner
v =func()

python — 生成器、推导式、递归的更多相关文章

  1. Python——生成器&推导式

    生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. ...

  2. Python生成器/推导式/生成器表达式

    一   生成器 生成器的本质就是迭代器 生成器的特点和迭代器一样,取值方式和迭代器一样(__next__(),  send():  给上一个yield传值) 生成器一般由生成器函数或者生成器表达式来创 ...

  3. python 生成器推导式与列表推导式的区别

    生成器表达式现用现生成,列表推导式一次性生成静态数据 L = [2, 3, 5, 7] L2 = (x**2+1 for x in L) it = iter(L2) print(next(it)) L ...

  4. 12.Python略有小成(生成器,推导式,内置函数,闭包)

    Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...

  5. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  6. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

  7. Python函数04/生成器/推导式/内置函数

    Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...

  8. Python之路-迭代器 生成器 推导式

    迭代器 可迭代对象 遵守可迭代协议的就是可迭代对象,例如:字符串,list dic tuple set都是可迭代对象 或者说,能被for循环的都是可迭代对象 或者说,具有对象.__iter__方法的都 ...

  9. python 列表推导式,生成器推导式,集合推导式,字典推导式简介

    1.列表推导式multiples = [i for i in range(30) if i % 2 is 0]names = [[],[]]multiples = [name for lst in n ...

  10. python的推导式 —— 列表推导式、集合和字典推导式

    python的推导式是用于快速处理数据的方法. 主要有:列表推导式.集合推导式和字典推导式 import time import numpy as np 列表推导式: 1. 速度快 t1 = time ...

随机推荐

  1. linux密码忘记的处理步骤

    linux忘记密码 centos7忘记密码如何解决?进入到单用户模式下去修改root密码step 1:开机时按住向下箭头,选择第一个,按住e进入gurb界面:step 2:在编辑模式下找ro 修改为  ...

  2. 关系型数据库的树形结构查询(Oracle、Postgres)

    Oracle : start with… connect by 的用法.语法:select * from table [where 条件1] connect by[条件2] start with[条件 ...

  3. 感知机与BP神经网络的简单应用

    感知机与神经元 感知机(Perceptron)由两层神经元组成(输入层.输出层),输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”(threshold logic un ...

  4. the requested PHP extension dom is missing from your system

    composer  出错 the requested PHP extension dom is missing from your system 解决办法    yum install  php70w ...

  5. mysql数据库学习二

    最近又复习了mysql中的一些概念:视图,触发器,存储过程,函数,事务,记录下. 1.视图 视图是一个虚拟表,本身并不存储数据,当sql在操作视图时所有数据都是从其他表中查出来的,因此其本质是:根据S ...

  6. [MyBatis]浅谈如何实现事务处理

    要实现事务处理,就得从SqlSession中取出connection来,然后对connection采用setAutoCommit,commit,rollback等操作,最后的时候,不能像JDBC一样关 ...

  7. [SQL]as的是否可以省略的问题

    数据库中as主要作用是起别名,常规来说都可以省略,但是为了增加可读性,不建议省略.

  8. Storm和Hadoop 区别

    Storm - 大数据Big Data实时处理架构   什么是Storm? Storm是:• 快速且可扩展伸缩• 容错• 确保消息能够被处理• 易于设置和操作• 开源的分布式实时计算系统- 最初由Na ...

  9. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_16-页面静态化-模板管理-模板制作

    这是轮播图的原始文件 运行门户需要把 nginx启动起来 单独运行轮播图.把里面的css的引用都加上网址的url 这就是单独访问到的轮播图的效果 轮播图模板的地址: 阶段5 3.微服务项目[学成在线] ...

  10. sparkStream---1

    1.本地scala版 import org.apache.spark._ import org.apache.spark.streaming._ import org.apache.spark.str ...