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. static关键字的用法小结

    static:是一个修饰符,用于修饰成员(成员变量,成员函数). 当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用,写法:类名.静态成员 static特点: 1.随着 ...

  2. eclipse将web项目部署到tomcat

    在 eclipse 中,选择 Window--->Preferences--->Server--->Runtime Environments,选择 Add 按钮 在弹出的对话框中,选 ...

  3. 使用PyMySQL连接MySQL错误

    使用PyMySQL连接MySQL错误 之前写了一个小项目,今天突然想起来,准备优化一下,但是原本好好的项目竟然跑不起来了 emmm....我真的啥都没干呀 具体错误是这样的: Traceback (m ...

  4. 写给新手看的 MyBatis 入门

    目录 MyBatis 使用前的准备 什么是 MyBatis 使用Maven 进行 MyBatis 开发环境搭建 MyBatis 入门 项目整体结构一览 MyBatis 的简单生命周期 1.获取 Sql ...

  5. UML期末复习题——2.6:Package Diagram

    第六题 包图 重要概念: 1.包图(package Diagram) 由若干个包以及包之间的关系组成.包是一种分组机制,其将一些相关的类集合为一个包,形成高内聚,低耦合的类集合,可以说,一个包相当于一 ...

  6. UML期末复习题——2.2:UML Activity Diagram.

    第二题:活动图 重要概念: 活动图:一种有助于使工作流和业务过程可视化的图. 绘制要点: 具体方法见:http://www.cnblogs.com/xiaolongbao-lzh/p/4591953. ...

  7. kotlin之高阶函数

    高阶函数是一种特殊的函数,它接受函数作为参数,或者返回一个函数 import java.awt.geom.Area fun main(arg: Array<String>) { val m ...

  8. Servlet的概述

    A: Servlet的概述: server applet , 是一个运行在服务器端的小应用程序 B: 就是一个接口,作用: servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web ...

  9. pandas总结

    ### 一.创建对象  # 1.可以通过传递一个list对象来创建一个Series,pandas会默认创建整型索引: # s=pd.Series([1,3,5,np.nan,6,8]) # print ...

  10. ajax结合mysql数据库和smarty实现局部数据状态的刷新

    效果状态:通过点击锁定状态实现状态锁定与不锁定之间的切换 1.主程序:01.php导入smarty和mysql类,取得数据导入列表模板 <?php    include './include/M ...