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

一、函数的递归调用
所谓递归调用就是函数自己调用自己,在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. Android AppUtil通用类

    1.整体分析 1.1.先看一下源码,可以直接Copy. public class AppUtil { /** * 获取当前程序包名 * * @param context 上下文 * @return 程 ...

  2. PHP.TP框架下商品项目的优化4-优化商品添加表单js

    优化商品添加表单js 思路 1.制作五个按钮 2.下面五个table 3.全部隐藏,点击则显示 4.点击第几个按钮就显示第几个table 具体操作 1.添加按钮 2.添加五个table并添加class ...

  3. CSS3裁剪与遮罩解析

    一.用途 CSS3裁剪与遮罩(Clipping and Masking)用来隐藏元素的一部分而显示另一部分 二.区别 CSS3裁剪与遮罩(Clipping and Masking)用来隐藏元素的一部分 ...

  4. PJMEID学习之视频的捕捉与播放

    pjmedia是pjsip的视频部分,官网明确提示,要想使用pjmedia离不开directshow/sdl/ffmpeg这三个库. 软件版本的限制: ffmpeg不能高于1.25.(建议下载1.01 ...

  5. 什么情况使用 weak 关键字,相比 assign 有什么不同?

    什么情况使用 weak 关键字? 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性 自身已经对它进行一次强引用,没有必要再强引 ...

  6. leetcode 【Rotate List 】python 实现

    题目: Given a list, rotate the list to the right by k places, where k is non-negative. For example:Giv ...

  7. 孤荷凌寒自学python第十一天初识Python的字典类

    孤荷凌寒自学python第十一天初识Python的字典类 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python的字典其实是一张二维对照表 下面举例说明: 键名Key 姓名 性别 身高 ...

  8. (原)Unreal 渲染模块 渲染流程

    @author:白袍小道 浏览分享随缘,评论不喷亦可.     扯淡部分: 在temp中,乱七八糟的说了下大致的UE过程.下面我们还是稍微别那么任性,一步步来吧.     UE渲染模块牵扯到场景遍历. ...

  9. PAT——乙级1028

    这道题花了我半个多小时,对呀乙级算是挺多时间的了. 1028 人口普查 (20 point(s)) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个 ...

  10. 【bzoj4822/bzoj1935】[Cqoi2017]老C的任务/[Shoi2007]Tree 园丁的烦恼 树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825530.html bzoj4822 题目描述 老 C 是个程序员.     最近老 C 从老板那里接到了一个任务 ...