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

一、函数的递归调用
所谓递归调用就是函数自己调用自己,在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. Hive 数据实战

    需求 remote_addr 用户IP 1.用于根据地址确认区域 2.用于统计来自同一个(外网)用户的访问数量 time_local 用户访问时间 1.分析用户访问时间段 2.合理安排客服上班时间 r ...

  2. git回滚到指定commit

    一次性commit好多文件,push上去之后,发现工程不可用,只能回滚,上网搜索回滚办法,下边这个是自己亲试的,特别好使: 操作步骤: 1.git checkout the_branch 2.git ...

  3. PHP代码审计6-实战漏洞挖掘-xdcms用户注册页面漏洞

    xdcms 源码:xdcms v2.0.8 1.配置 [一直下一步(仅为测试)] #数据库账号root,密码为空:管理员账号/密码:xdcms/xdcms #登录后台 2.查看后台登录页面的配置项[x ...

  4. SpringMVC---其它常用注解

    常用注解 PathVariable @RequestMapping注解中使用占位符的情况下,需要使用@PathVariable注解指定占位符参数.即指定占位符中的值与方法中哪一个参数进行匹配.如果方法 ...

  5. kafka生产者与消费者的生产消息与消费消息所遇到的问题

    当我们用API写kafka的时候 生产者生产消息,但是消费者接收不到消息?集群上启动消费者显示生产的消息.我们需要修改一下配置 (1)我们打开在虚拟机中修改kafka集群的配置文件 [root@spa ...

  6. 大数据服务大比拼:AWS VS. AzureVS.谷歌

    [TechTarget中国原创] 对于企业用户来说,大数据服务是一项较具吸引力的云服务.三大巨头AWS.Azure以及谷歌都在力争夺得头把交椅,但是最后到底是哪一家能够取得王座之战的胜利呢? 云市场正 ...

  7. VSX-2 搭建项目

    由于是公司的项目,也不可能直接拿过来写博客,所以准备搭建一个自己的VSX项目. 项目需求这里就不写了,大体可参考曾经的一篇文章,这个VSX项目就是用来简化插件式开发. 本文开始正式记录做这个VSX项目 ...

  8. 剑指Offer - 九度1519 - 合并两个排序的链表

    剑指Offer - 九度1519 - 合并两个排序的链表2013-11-30 22:04 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hi ...

  9. CSS UNIT 详解以及最佳实践

    分类 ■    绝对长度(Absolute units):cm,mm,in,pt,pc 绝对单位之间的换算:1in = 2.54cm=25.4mm=72pt=6pc 绝对长度在css中的表现和其他地方 ...

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

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