函数的高级运用这部分知识的核心内容就是你要把“函数即变量”这个概念理解并运用得出神入化...

一、函数的递归调用
所谓递归调用就是函数自己调用自己,在Python中如果不做限制递归调用的死循环最多可循环调用999次,当超过999次的时候就会报错。
函数递归调用的效率很低,我们在写代码时不提倡使用,如果使用一定要有明确的结束条件。 def is_even():
num = int(input("Please input a number here: "))
if num % 2 == 0:
print("Good, the number is even number.")
return True
print("Your input is not Even number, please input again!")
is_even()
is_even() 二、高阶函数
如果一个函数的入参是个函数名的话,那这个函数就是个高阶函数。 def sum(x , y , z ):
res = z(x) + z(y)
return res
print(sum(1.98,3.14,int)) 三、嵌套定义函数
函数的里面是可以再定义函数的,多层嵌套函数的作用域是采取就近并从内向外的原则,另外,函数只有被调用时才被执行。 def warpper():
print("我在外面")
def deco():
print("我在里面")
def hhh():
print("xxx")
warpper() 函数的结果: 我在外面 因为在执行过程中只有warpper()函数被调用了,至于它里面的函数只是被定义了没有被调用过。 name = 'python'
def warpper():
name = '函数第一层'
def deco():
name = '函数第二层'
print (name)
def hhh():
name = '函数第三层'
print(name)
hhh()
deco()
print(name)
warpper()hhh    函数结果:
函数第二层
函数第三层
函数第一层
因为首先调用warpper(): name 被赋值 ‘函数第一层’,之后定义函数deco只是定义不用管它,
接下来是调用deco(): name 被赋值为‘函数第二层’,紧接着打印输出这个name即函数第二层,之后定义hhh只是定义不用理它,
接下来是调用hhh(): name 被赋值为‘函数第三层’,紧接着打印输出这个name即函数第三层,到此deco()调用完毕,
接下来继续执行warpper的最后一句,打印输出 name,之前的name都是局域的变量执行完局部代码就消失了,此处的neme仍然是最初
被赋值为‘函数第一层’的name,所以刚刚被打印输出。 三、装饰器
装饰器的定义其实就是函数嵌套加高阶函数。它的用途是,给函数添加了功能,但调用函数时扔保持原样不变,好像什么四也米有发僧。   举个栗子: import time
def run(): # 定义一个简单函数
print ("run ...")
time.sleep(3)
run() # 调用这个简单函数 有需求,要查看这个函数执行的时间,于是程序变成下面的样纸:   import time
def run():
print ("run ...")
time.sleep(3)
start_time = time.time() # 在函数调用之前获取时间
run()
end_time = time.time() # 在函数执行结束是获取时间
print("run()函数运行的时间是:", end_time - start_time) 继续演化: def run_time(func):
start_time = time.time()
func()
end_time = time.time()
print("run()函数的运行时间是:",end_time-start_time)
run_time(run) 继续演化:其实这里已经差不多是个装饰器了 def timer(func):
def deco():
start_time = time.time()
func()
end_time = time.time()
print("runtime is: ", end_time-start_time)
return deco
run = timer(run)
run() 解释如下: def timer(func): # 定义一个对func进行处理的函数,func是个函数名,如何处理看里面定义。
def deco(): # deco()即是把原func()丰富了计时功能后的那个函数 即变厉害了的func(),deco即是新func,我们就是要用它来偷换原来的旧func。
start_time = time.time()
func()
end_time = time.time()
print("runtime is: ", end_time-start_time)
return deco # 对func进行处理后返回变厉害了新func名,deco。
run = timer(run) # 对run()处理后,把变厉害的run()的名字再交给run,这时候run已经不是原来的run,而是变厉害的run。
run() # 这里不是run()在跑,而是厉害的新run()在跑,但看起来好像还是原来的run()在跑。   上面这一整段代码即是处理+置换的过程,而这个过程,把“函数即变量”运用得炉火纯青...   装饰器在定义的时候要更加适应被处理(或者叫做被装饰)的函数参数的多样化,这是第一点;
再有,实现偷天置换的关键语句run = timer(run),要让这句看起来更具有伪装性。
基于以上俩原因,标准的装饰器写法出炉了: import time def timer(func): # 定义装饰器
def deco(*args,**kwargs): # 传非必填形式参数,这样便可应对被处理对象函数各种参数的情况
start_time = time.time()
func(*args,**kwargs) # 传非必填形式参数,这样便可应对被处理对象函数各种参数的情况
end_time = time.time()
print("runtime is: ", end_time-start_time)
return deco @timer # 在定义被处理函数之前@装饰器名字
def run():
print("run ...")
time.sleep(3) run() 过程可以总结为:定义装饰器 ---> 在定义被处理的函数之前写@装饰器名字 ---> 最后在调用函数。
前后顺序不对的话,会报错哦 ...

Python学习杂记_11_函数(二)的更多相关文章

  1. Python学习杂记_11_函数(一)

    函数也叫方法,就是把实现某种功能的一组代码封装起来,当你需要这个功能时直接调用函数即可. 定义函数:定义函数时要注意 “def”关键字,“:”,“函数体缩进”:用“return”使函数有具体返回值,没 ...

  2. Python学习杂记_12_函数(三)

    内置函数 Python有很多内置函数,以下这些是常用且必须要掌握的: 强制类型转换: bool() # 把一个对象转换成布尔类型 int() # 整形 float() # 小数 str() # 字符 ...

  3. 《Python学习手册》(二)

    <Python学习手册>(二) --类型和运算 数字 十六进制 八进制 二进制 0x 0o 0b hex() oct() bin() >>>int('10',2) 2 & ...

  4. Python学习笔记之函数

    这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...

  5. Python 学习:常用函数整理

    整理Python中常用的函数 一,把字符串形式的list转换为list 使用ast模块中的literal_eval函数来实现,把字符串形式的list转换为Python的基础类型list from as ...

  6. 【Python学习之五】函数

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 Python不但能非常灵活地定义函数,而且本身内置 ...

  7. Python学习-第一天-函数和模块的使用

    目录 Python学习-第一天总结 print输出的一种简单格式 函数参数之可变参数 模块管理函数 if else语句的单行实现(简洁) 变量作用域 函数书写格式 Python学习-第一天总结 pri ...

  8. python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)

    1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...

  9. 小甲鱼:Python学习笔记003_函数

    >>> # 函数>>> def myFirstFunction(params1,params2...): print("这是我的第一个函数!") ...

随机推荐

  1. 《Cracking the Coding Interview》——第3章:栈和队列——题目2

    2014-03-18 05:08 题目:实现一个栈,除了能进行push和pop之外,还能在O(1)时间内返回栈中最小的元素. 解法:用另一个“最小栈”存放最小的元素,每当有不小于当前最小值的元素进栈时 ...

  2. Pascal游戏 大富翁MUD

    大富翁MUD Pascal源码 Chaobs改编自百度网友作品 此源码非Chaobs原创,但转载时请仍注明出处. 估计90后以后就没有孩子知道MUD了. program wxtw; uses crt; ...

  3. wget下载https文件,服务器可以虚拟机中不行的问题

    用wget下载一个图片资源(https协议),在服务器上可以,但在本机的虚拟机中卡在下面这里了: [root@localhost ~]# wget 'https://gp1.wac.edgecastc ...

  4. 自动化测试(三)如何用python写个一函数,这个函数的功能是,传入一个数字,产生N条手机号,产生的手机号不能重复

    本期时间短没来得及写思路,不过我都加了注释,有问题可以@我 import randomimport timedef Phones(number):#生成手机号函数 s = "01234567 ...

  5. DWZ(J-UI)之路:错误

    1:关于左侧点击会把右边小窗口替换掉,导致右边永远只有一个小窗口. 方法:因为缺少了这个—— <li><a href="/admin/demo/index" ta ...

  6. 第一次玩博客 感觉自己特别low

    第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动第一天来  来好激动 ...

  7. CentOS 6.3安装配置LAMP服务器(Linux+Apache+MySQL+PHP5)

    服务器系统环境:CentOS 6.3 客户端系统环境:Windows 7 ultimate(x86)sp1 简体中文旗舰版 ※  本文档描述了如何在Linux服务器配置Apache.Mysql.PHP ...

  8. Python数据分析-Matplotlib图标绘制

    Matplotlib介绍 Matplotlib是一个强大的Python绘图和数据可视化的工具包. Matplotlib的主要功能 Matplotlib是python中的一个包,主要用于绘制2D图形(当 ...

  9. shell之ip命令

    转:出处我也不知道了,学习时候记下的笔记 1.作用 ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig.route等,使用权限为超级用户. ...

  10. ALPHA(10)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...