python递归,装饰器,函数, 高阶函数
在函数内部,可以调用其它函数,如果一个函数在内部调用自身本身,这个函数就是递归函数
递归特性:1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模比上次递归都有所减少(10-8-5等)
3.递归效率不高,递归层次过多会导致栈溢出,(计算机中,函数调用时通过栈(stack堆)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,函数返回栈就会减一层栈帧,由于栈的大小不是无限的,所以递归调用次数过度,会导致栈溢出)
默认最大的递归层数是999层
import sys
sys.setrecursionlimit(1500) # (recursion,递归,)(limit,限制,),导入sys修改最大递归数 def calc(n):#计算,
print(n)
return calc(n+1)
calc(0) def calc(n):
print(n)
if int(n/2)>0:#如果n除以2大于0那就不断递归
return calc(int(n/2))
print('--->',n)
calc(10)#将10传进去
斐波拉契
#斐波拉契数列(Fibonaccl):除第一个和第二个数外,任意一个数都可以由前两个数相加得到(1.1.2.3.5.8.13.21.34....)
def fib(max):#10,斐波拉契数列从小往大推
n,a,b=0,0,1
while n<max:#n<10
print(b)
a,b=b,a+b#a,b重新赋的值,1,2=2,1+2
n=n+1
return 'done'
fib(10)
作业:
写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者
def f5(depth,a1,a2):
if depth == 10:
return a1
a3 = a1+a2
r = f5(depth + 1,a2,a3)
return r
ret = f5(1,0,1)
print(ret)
装饰器
Décorator,装饰器也叫语法糖
1. 装饰器:本质是函数,是由def(装饰其它函数)就是为其它函数添加附加功能
原则:1.不能修改被装饰的函数的源代码(因为程序已经在运行了)
2.不能修改被装饰的函数的调用方式
实现装饰器知识储备:1.函数即‘变量’(函数也可以和变量一样通过赋值的方式调用,他们在内存中储存的方式是一致的)
2.高阶函数(a.把一个函数名当做实参传给另外一个函数【在不修改被装饰函数源代码的情况下为其添加功能】b.返回值中包含函数名【不修改函数的调用方式】)
3.嵌套函数(在一个函数里用def去申明一个新的函数)
高阶函数+嵌套函数=》装饰器
def outer_0(func):
def inner(*args,**kwargs):
print('3.5')
ret = func(*args,**kwargs)
print('')
return ret
return inner
def outer(func):#最外层需要装饰的函数
def inner(*args,**kwarge):
print('')
ret = func(*args,**kwarge)#获取的是旧函数index的值
print('')
print(ret)
return ret
return inner
@outer_0
@outer#只要函数定义装饰器,那么def index()函数就会被重新定义:重新定义为装饰器的内层函数def inner
def index(a1,a2):#执行outer将index做为参数传递,将outer返回值重新赋值给index
print('好难')
return a1 + a2
index(1,2)
@outer
def f1(a1,a2,a3):#装饰器装饰带有参数的函数,一个函数可以应用多个装饰器.
print('f1')
return 'f1'
f1(1,2,3)
装饰带有参数的函数内部调用关系:
Import time
@timmer
装饰器案例
import time#
def timer(func):#1,3,timer(test1) , func=test1,func=test2高阶函数
def deco(*args,**kwargs):#4,7,嵌套函数
start_time=time.time()#8,
func(*args,**kwargs)#9,
stop_time=time.time()#13,
print('the func run time is %s'%(stop_time-start_time))#14,
return deco#5,返回这个函数的内存地址
@timer,2,10,test1=timer(test1) ,没有调用变量的赋值动作
def test1():
time.sleep(1)#11,
print('in the test1')#12,
@timer#test2=timer(test2),test2=deco,test2()=deco()
def test2(name,age):
time.sleep(1)
print('test2',name,age)
test1()#6,->deco
test2('zhangchao',29)
装饰器高级案例
user,passwd='alex','abc123'
def auth(auth_type):
print('outer func:', auth_type)
def outer_wrapper(func):
def wrapper(*args, **kwargs): # (wrapper包装)
print('wrapper func args:',*args,**kwargs)
if auth_type=='local':
username = input('username:').strip()
password = input('password:').strip()
if user == username and passwd == password:
print('\033[32;1m 通过\033[0m')
res = func(*args, **kwargs)
print('-------')
return res
else:
exit('\033[32;1m 退出\033[0m')
elif auth_type=='ldap':
print('-------')
return wrapper
return outer_wrapper def index():
print('welcome to index page')
@auth(auth_type='local')
def home():
print('welcome to index home')
return 'from home'
@auth(auth_type='ldap')
def bbs():
print('welcome to index bbs')
index()
print(home())
bbs()
函数即‘变量’,匿名函数
# 变量存在于内存中
# python的内存回收机制是通过解释器去做的,没有引用会被立马回收
calc=lambda x:x*3#匿名函数 可读性变差
print (calc(3))
def bar():#先申明
print('in the bar')
def foo():#先申明
print('in the foo')
bar()
foo()#再调用,只要在调用前存在就ok. def foo():#先申明
print('in the foo')
bar()
def bar():#先申明
print('in the bar')
foo()#再调用,只要在调用前存在就ok. def foo():
print('in the foo')
bar()
foo()
def bar():#在调用后,无法打印,报错
print('in the bar')
高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这就是高阶函数
def add(a,b,f):#绝对值,正值负值绝对一下会变成正值
return f(a)+f(b) res=add(3,-6,abs)#把abs函数当做参数传给f,拿f处理a,b
print(res)
def bar():
print('in the bar') def test1(func):
print(func)
func()
test1(bar)
bar()
func=bar#函数也可以通过这种方式赋值
func()
函数名当实参传给另外一个函数
import time
def bar():
time.sleep(3)#4.沉睡3S
print('in the bar')#5.打印
def test1(func):#1.把bar传到func里面
start_time=time.time()#2.运行test1记录当前时间
func()#3.运行bar函数
stop_time=time.time()#6.截取结束时间
print('the func run time is %s' %(stop_time-start_time))#7.统计bar运行时间
test1(bar)#1.调用test1传入bar 返回值中包含函数名
import time
def bar():
time.sleep(3)
print('in the bar')
def test2(func):
print(func)
return func
#print(test2(bar))
bar=test2(bar)#直接bar把内存地址传给func
bar()#run bar
#test2(bar())把bar的返回值传给了他,不符合高阶函数
嵌套函数
def foo():
print('in the bar')
def bar():#嵌套函数用def申明
print('in the bar')
bar()
foo() #局部作用域和全局作用域的访问顺序
x=0
def grandpa():
x=1
def dad():
x=2
def son():
x=3
print (x)
son()#儿子
dad()#爸爸
grandpa()#爷爷
python递归,装饰器,函数, 高阶函数的更多相关文章
- Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】
装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...
- 初学 Python(十二)——高阶函数
初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)
原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...
- Learning Python 012 函数式编程 1 高阶函数
Python 函数式编程 1 高阶函数 高阶函数 Q:什么是高阶函数? A:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数. 简单举个例子: def add(x, y, f): return ...
- python学习三十四天函数高阶函数定义及用法
python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def tes ...
- python基础之常用的高阶函数
前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...
- python六十四课——高阶函数练习题(二)
总结:高阶函数以及匿名函数之间的配合使用 from functools import reduce #模块一:lambda和filter的结合使用 #lt = [1,2,3,4,5,6,7,8,9] ...
- python 解除装饰器,调用原本函数。
假设fun函数被装饰器装饰了,name调用fun,就不是调用fun本身了,那么如何继续调用本身呢.使用fun_raw = fun.__wrapped__这样使用fun_raw就是调用没被装饰器修饰后的 ...
随机推荐
- 【iCore4 双核心板_FPGA】例程一:GPIO输出实验——点亮LED
实验现象: 三色LED循环点亮. 核心源代码: module led_ctrl( input clk_25m, input rst_n, output fpga_ledr, output fpga_l ...
- centos 7 配置tomcat开机启动
1. tomcat 需要增加一个pid文件 在tomca/bin 目录下面,增加 setenv.sh 配置,catalina.sh启动的时候会调用,同时配置java内存参数. #add tomcat ...
- Unity和Android混合开发
通用的流程 https://blog.csdn.net/zhangdi2017/article/details/65629589 应用场景 Unity游戏中一些功能需要安卓系统的支持,如搜索wifi等 ...
- 9patch图的尺寸尽量为偶数
美工做了一张.9的背景图,宽度110*80 像素,描点如下: 放到720p的智能电视上观看,总感觉怪怪的.仔细观看可以发现,前景图总是不能完全的覆盖掉背景图.总有那么一个像素的点多余出来,如图所示: ...
- Halcon 2D测量
* This program shows how to detect the edges of a diamond * with subpixel accuracy and calculate the ...
- 性能优化系列八:MYSQL的配置优化
一.关键配置 1. 配置文件的位置 MySQL配置文件 /etc/my.cnf 或者 /etc/my.cnf.d/server.cnf 几个关键的文件:.pid文件,记录了进程id.sock文件,是内 ...
- JS中lambda表达式的优缺点和使用场景(转)
add by zhj: 最近在看ES6,看到了箭头函数,我个人感觉箭头函数适用于函数体中不用this的匿名函数,在箭头函数中使用this是一个坑 原文:http://ourjs.com/detail/ ...
- Java -- POI -- 随笔汇总
1. 判断指定的单元格是否是合并单元格 /** * 功能:判断指定的单元格是否是合并单元格 * 原理:excel中的合并单元格其实就是首单元格,只不过该单元格增加了 rowspan和colspan两个 ...
- iOS mac终端下的SQL语句
本文转载至 http://blog.csdn.net/majiakun1/article/details/41281801 我们都知道数据库的创建可以借助图形化的数据库工具软件,但也可以在Mac终端下 ...
- 二分求幂/快速幂取模运算——root(N,k)
二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...