热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python—生成器、推导式、递归

目录1生成器(函数的变异)2推导式3递归1生成器(函数的变异)判断一个函数是否是生成器函数:只需看函数内部是否有yield#生成器函数(内部是否包含yield)deffunc():

目录

  • 1 生成器(函数的变异)
  • 2 推导式
  • 3 递归

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源码示例

    《python — 生成器、推导式、递归》

    生成器作用:

    • 生成数据

    • 是一种特殊的迭代器

      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 '#'
    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绘制拟合回归散点图_机器学习之利用Python进行简单线性回归分析
    前言:在利用机器学习方法进行数据分析时经常要了解变量的相关性,有时还需要对变量进行回归分析。本文首先对人工智能机器学习深度学习、相关分析因果分析回归分析 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了高效算法求解数独相关的知识,希望对你有一定的参考价值。title:高效算法求解数独 ... [详细]
  • 本文是我在学习期间的笔记,看的书是《python语言及其应用》。转载请注明出处,谢谢。本文链接https:blog.csdn.netMing201712 ... [详细]
  • python做一个数独小游戏
    最近看了下python的一些知识,在这里记载一下。1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADDTOPATH,安装的时候会自动写入到环境变量里面,如果没有勾选, ... [详细]
  • NodeAddonNodeAddon是官方的C++模块开发途径,可实现Node与底层技术结合,如驱动、操作系统等。开发环境需要安装nodev8.11.1npmv5.6.0node- ... [详细]
  • 为何存在requests库,pycharm依然报错解决方法
    今天在使用pycharm的时候,用到了第三档库requests,提示有错误,报错显示Nomodulenamedrequests,于是请教了大神们,然后让我在pycharmconso ... [详细]
  • 点击:【第一章:Java开发岗:基础篇】计算机基础问题、HashMap、Fail-safe机制Fail-fast机制、Synchronized、ThreadLocal、AQS、线程 ... [详细]
  • Node.js 事宜轮回事情流程 & 生命周期
    本文,将会细致的解说node.js事宜轮回事变流程和生命周期一些罕见的误会在js引擎内部的事宜轮回最罕见的误会之一,事宜轮回是Javascript引擎(V8,spiderMonke ... [详细]
  • 我是Django的初学者。现在,我正在使用API​​。我面临一个问题。我无法在 ... [详细]
  • 经过一段时间的使用,笔者发现Sympy还是非常强大的存在!本次分享中,笔者将解决上一篇分享的结尾遗留的问题,那就是计算高次方 ... [详细]
  • 前言木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握。另外࿰ ... [详细]
  • 在项目开发中我们经常会遇到应用突然崩溃的问题,如果AndroidStudio上有Log日志,我们能很快找到Bug并解决,但很多情况下,我们的手机并没有连接AndroidStudio ... [详细]
  • Java对接支付宝的支付、退款、提现
    本篇主要是正对Java对接支付宝的常用功能,需要开通个人的沙箱环境和内网穿透(我用了阿里云服务器)。集成前提:开发者在集成和开发前需要了 ... [详细]
  • 援用范例援用范例的值(对象)是援用范例的一个实例。建立新对象:new操纵符后跟一个组织函数varpersonnewObject();上面:援用范例:Object组织函数:Objec ... [详细]
  • 利用Python进行航空公司数据的数据挖掘与预处理
    本文根据航空公司系统的客户基本信息数据(文末提供数据和代码),使用Python分别完成数据清洗、数据集成和数据可视化的操作,并给出了完整代码及图文说明,感兴趣的朋友可以 ... [详细]
author-avatar
TTTTTTTT-Tang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有