前引:

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

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. HttpUtil工具类,发送Get/Post请求,支持Http和Https协议

    HttpUtil工具类,发送Get/Post请求,支持Http和Https协议 使用用Httpclient封装的HttpUtil工具类,发送Get/Post请求 1. maven引入httpclien ...

  2. Windows下搭建Apache网站

    目录 Apache下载 Apache安装 httpd.conf文件格式说明 启动服务并测试 Apache下载 在Apache官网底部找到APACHE PROJECT LIST里的HTTP Server ...

  3. 阻塞队列一——java中的阻塞队列

    目录 阻塞队列简介:介绍阻塞队列的特性与应用场景 java中的阻塞队列:介绍java中实现的供开发者使用的阻塞队列 BlockQueue中方法:介绍阻塞队列的API接口 阻塞队列的实现原理:具体的例子 ...

  4. HTML5 3D 粒子波浪动画特效DEMO演示

    需要thress.js插件:     http://github.com/mrdoob/three.js // three.js - http://github.com/mrdoob/three.js ...

  5. [转] C++中的namespace

    点击阅读原文 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都 ...

  6. pip 安装使用国内镜像

    pip国内的一些镜像 阿里云 https://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple ...

  7. spark源码分析以及优化

    第一章.spark源码分析之RDD四种依赖关系 一.RDD四种依赖关系 RDD四种依赖关系,分别是 ShuffleDependency.PrunDependency.RangeDependency和O ...

  8. ca33a_demo_c++_新旧代码的兼容char数组与vector_string相互转换

    /*ca33a_demo_c++33_CppPrimer_新旧代码的兼容_txwtech旧代码:数组和c风格字符串新代码:vector和string相互转换:c风格字符串<- ->stri ...

  9. WeChair项目Beta冲刺(6/10)

    团队项目进行情况 1.昨日进展    Beta冲刺第六天 昨日进展: 前后端并行开发,项目按照计划有条不絮进行 2.今日安排 前端:扫码占座功能和预约功能并行开发 后端:扫码占座后端逻辑开发,编码预约 ...

  10. java 中对hashmap进行排序

    public class HashMapSort { public static void main(String[] args) { HashMap<Integer, Student> ...