前引:

上节课思考:多个装饰器的加载和运行分析

def deco1(func1): #func1=warpper2
def wrapper1(*args,**kwargs):
print('正在运行===>deco1.wrapper1')
res1=func1(*args,**kwargs)
return res1
return wrapper1 def deco2(func2):#func2=warpper3
def wrapper2(*args,**kwargs):
print('正在运行===>deco2.wrapper2')
res2=func2(*args,**kwargs)
return res2
return wrapper2 def deco3(x):
def outter3(func3): #func3=index
def wrapper3(*args,**kwargs):
print('正在运行===>deco3.outter3.wrapper3')
res3=func3(*args,**kwargs)
return res3
return wrapper3
return outter3
@deco1
#@deco1 ==>warpper2=deco1(warpper2) ==>warpper2=warpper1
@deco2
#@deco2 ==>warpper3=deco2(warpper3) ==>warpper3=warpper2
@deco3(111)
#deco3(111)=outter3 @outter3==>index = outter3(index)==>index = warpper3
#装饰器的加载顺序,从下到上
#运行顺序,从上到下
def index(x,y):
print('from index %s:%s' %(x,y))

一、yield表达式

1 yield表达式基本用法

yield关键字只要出现在函数中,调用这个函数不会执行,会返回一个生成器(自定义迭代器),这里可以对yield传值,在函数内通过一个变量接受这个值

def func(name):
while True:
print(f"我是{name}")
x = yield
print(f"我爱吃{x}")
g = func("hz")
#给函数传参hz调用函数,此时发现函数内有yield关键字,挂起函数,函数调用的返回值是生成器
g.__next__()#执行迭代器功能查找下一个值,运行函数至yield处
g.send("水果")#给yield传值
#注意:这不是yield的返回值,返回值在函数定义的时候就写好了
g.send("巧克力")#给yield传值
>>>我是hz
>>>我爱吃水果
>>>我是hz
>>>我爱吃巧克力
>>>我是hz

二、三元表达式

三元表达式是一种代码简写的方式

语法格式:条件成立时运行的代码 if 条件 else 条件不成立时运行的代码

x= 1
y =2
if x > y :
print(x)
else:
print(y)
>>>2
print(x if x>y else y)
>>>2
print(x) if x>y else print(y)
>>>2

三、生成式

1 列表生成式

l = ["a","b","c2","adsa","z"]
#需求:把列表内长度大于1的值添加到新列表new_l中
#基础做法:
for i in l :
if len(i)>1:
new_l.append(i) #列表生成式做法:
new_l = [i for i in l if len(i)>1]

2 字典生成式

d = {"a":1,"b":2,"c":3}
#生成一个新的字典,key是d中的所有key,value为none
#基础做法:
new_d = {}
for i in d:
new_d[i] = None #字典生成式做法:
new_d = {key:None for key in d }

3 集合生成式

#生成一个含有数字1-9的集合
#基础做法:
set1 = set()
print(type(set1))
for i in range(1,10):
set1.add(i) #集合生成式做法:
s ={i for i in range(1,10)}

4 生成器表达式

#生成一个生成器
g = (i for i in range(10) if i >3)
#此刻g内部一个值都没

四、函数的递归

1 递归的定义

是函数嵌套的一种特殊形式

在调用一个函数的过程中间接或者直接调用了本身

#直接调用本身
def foo():
foo()
foo()
#间接调用本身
def f1():
f2()
def f2():
f1()
f1()

2 详解递归

如果我们执行了上述代码会发现pycharm在1000次左右递归后报错,因为递归本身是一种很危险的行为,如果我们对递归不做任何处理让他永久的调用下去会直接造成内存溢出。

#需求:生成一个含有1-10的列表
#for循环方式
l=[]
for i in range(1,11):
l.append(i)
#函数递归方式
def appen(n):
if n == 11:
return
else:
l.append(n)
n+=1
appen(n)
appen(1)

递归的两个阶段

回溯:一层一层调用下去

#运行递归函数的过程
def func ():
func()
func()

递推:满足某种结束条件,结束递归调用,然后一层一层返回

day19 生成器+函数递归的更多相关文章

  1. day19 生成器函数

    生成器总结: 语法上和函数类似:生成器函数和常规函数几乎是一样的.它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值. 自动实现迭代 ...

  2. python之旅:三元表达式、列表推导式、生成器表达式、函数递归、匿名函数、内置函数

    三元表达式 #以下是比较大小,并返回值 def max2(x,y): if x > y: return x else: return y res=max2(10,11) print(res) # ...

  3. python06-列表表达式、生成器表达式及其面试题、解耦简单介绍、函数递归相关

    目录: 一.列表推导式 二.生成器表达式 三.集合生成器 四.生成器面试题 五.解耦简单介绍 六.函数递归相关 一.列表推导式 需求:将[1,3,5]中的每个元素平方 正常思路: new_list = ...

  4. python之迭代器 生成器 枚举 常用内置函数 递归

    迭代器 迭代器对象:有__next__()方法的对象是迭代器对象,迭代器对象依赖__next__()方法进行依次取值 with open('text.txt','rb',) as f: res = f ...

  5. python 生成器和递归

    生成器 1.定义 问题:python会把对象放到内存中,我们每次定义变量.列表等都会在内存中占用对应的地址块,所以当内存容量一定时,列表的容量会受到内存的限制,而且假如我们创建了一个包含200万个元素 ...

  6. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  7. python中的生成器函数是如何工作的?

    以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函 ...

  8. Python标准库中的生成器函数

    一.用于过滤的生成器函数 - 从输入的可迭代对象中产出元素的子集,而不修改元素本身 import itertools l1 = [1,2,3,4,5] l2 = [True,False,True,Fa ...

  9. day13-迭代器、三元表达式、列表推导式、字典生成式、生成器与递归

    目录 迭代器 可迭代对象 迭代器对象 for循环原理 三元表达式(三目表达式) 列表推导式 字典生成式 zip()方法 生成器 生成器表达式 递归 递归的两个阶段 迭代器 迭代器即迭代的工具,迭代是一 ...

随机推荐

  1. 8、react 高阶组件

    1.高阶组件:封装 高阶组件使用得是react得一种模式,增强现有组件得功能 一个高阶组件就是一个函数,这个函数接收得是组件类作为参数得,并且返回得是一个新组件,再返回得新组件中有输入参数组件不具备得 ...

  2. curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to storage.googleapis.com:443

    安装nvm的时候, ➜  ~ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash 错 ...

  3. DedeCms 首页、列表页调用文章body内容的方法

    [第一种方法] arclist标签使用如下: {dede:arclist row='1' typeid='1' addfields='body' idlist='1' channelid='1'} [ ...

  4. Fibonacci(模板)【矩阵快速幂】

    Fibonacci 题目链接(点击) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20989   Accepted: 14 ...

  5. Linux使用手册

    一.开关机 sync :把内存中的数据写到磁盘中(关机.重启前都需先执行sync) shutdown -rnow或reboot :立刻重启 shutdown -hnow :立刻关机 shutdown ...

  6. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

  7. 【大厂面试08期】谈一谈你对HashMap的理解?

    摘要 HashMap的原理也是大厂面试中经常会涉及的问题,同时也是工作中常用到的Java容器,本文主要通过对以下问题进行分析讲解,来帮助大家理解HashMap的原理. 1.HashMap添加一个键值对 ...

  8. MFC套接字连接不成功-记得在app的cpp文件里面初始化套接字

    MFC套接字连接不成功-记得在app的cpp文件里面初始化套接字 stdafx.h文件中添加:#include "afxsock.h" BOOL CMFC_TCP_Client_c ...

  9. WeChair项目Alpha冲刺(2/10)

    团队项目进行情况 1.昨日进展    Alpha冲刺第二天 昨日进展: 前端完成小程序首页的html+css设计 后端springboot项目搭建完成 详情参见github 数据库也初步建成一些表格, ...

  10. vs code 初始化vue项目框架

    1.首先安装npm组件  下载地址:https://nodejs.org/en/ 安装完 2.配置环境变量 3.验证是否成功 node -v npm -v 4.替换npm 输入npm install ...