Python学习杂记_11_函数(二)
函数的高级运用这部分知识的核心内容就是你要把“函数即变量”这个概念理解并运用得出神入化... 一、函数的递归调用
所谓递归调用就是函数自己调用自己,在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_函数(二)的更多相关文章
- Python学习杂记_11_函数(一)
函数也叫方法,就是把实现某种功能的一组代码封装起来,当你需要这个功能时直接调用函数即可. 定义函数:定义函数时要注意 “def”关键字,“:”,“函数体缩进”:用“return”使函数有具体返回值,没 ...
- Python学习杂记_12_函数(三)
内置函数 Python有很多内置函数,以下这些是常用且必须要掌握的: 强制类型转换: bool() # 把一个对象转换成布尔类型 int() # 整形 float() # 小数 str() # 字符 ...
- 《Python学习手册》(二)
<Python学习手册>(二) --类型和运算 数字 十六进制 八进制 二进制 0x 0o 0b hex() oct() bin() >>>int('10',2) 2 & ...
- Python学习笔记之函数
这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...
- Python 学习:常用函数整理
整理Python中常用的函数 一,把字符串形式的list转换为list 使用ast模块中的literal_eval函数来实现,把字符串形式的list转换为Python的基础类型list from as ...
- 【Python学习之五】函数
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 Python不但能非常灵活地定义函数,而且本身内置 ...
- Python学习-第一天-函数和模块的使用
目录 Python学习-第一天总结 print输出的一种简单格式 函数参数之可变参数 模块管理函数 if else语句的单行实现(简洁) 变量作用域 函数书写格式 Python学习-第一天总结 pri ...
- python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)
1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...
- 小甲鱼:Python学习笔记003_函数
>>> # 函数>>> def myFirstFunction(params1,params2...): print("这是我的第一个函数!") ...
随机推荐
- 3,Python常用库之三:Matplotlib
一.Matplotlib基础知识 Matplotlib中的基本图表包括的元素 x轴和y轴 axis水平和垂直的轴线 x轴和y轴刻度 tick刻度标示坐标轴的分隔,包括最小刻度和最大刻度 x轴和y轴刻度 ...
- setBackgroundResource和setImageResource的区别
setBackgroundResource是设置view的背景图片 setImageResource是设置ImageView的图片 对于一个imagevewButton来说,你既可以setBackgr ...
- php中utf-8转unicode
public function utf8_unicode($str) { $unicode = array(); $values = array(); $lookingFor = 1; for ($i ...
- SVN迁移到Git原因说明
1.Git分布式的源码管理 每位开发人员计算机本地会有一份代码库,开发人员可在不受其他人代码提交影响的前提下对源码进行提交/回滚/撤销等操作. 在独立的开发任务中即可实现对源码管理又不受其他开发人员提 ...
- 关于mysqldump备份非事务表的注意事项
Preface We're used to get a logical backup set(whole instance) by simply specifying "-- ...
- PL/SQL 循环语句
1.基本 LOOP 循环语句 语法: LOOP 语句序列; END LOOP; 其中,语句序列中需要一个EXIT语句或一个EXIT WHEN语句来中断循环. 实例: DECLARE x ) :; BE ...
- Oracle 遇到的问题:IMP-00041: 警告: 创建的对象带有编译警告解决办法
出现IMP-00041: 警告: 创建的对象带有编译警告:以后再做数据迁移的时候需要额外注意,尤其用户中有视图或者触发器对象的时候.用户的环境是这样的,在库里有三个oracle的用户,其中一个用户中有 ...
- 孤荷凌寒自学python第二十三天python类的封装
孤荷凌寒自学python第二十三天python类的封装 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.从怎么样访问类的内部代码块中定义的私有属性说起 类中定义的私有属性和私有方法是无法被 ...
- 1064 Complete Binary Search Tree (30 分)(二叉查找树)
中序遍历建树 #include<bits/stdc++.h> using namespace std; ; int s[N]; int n; int tree[N]; int cnt; v ...
- 用archlinux作为日常开发机的感受
机器配置 CPU: Intel Core i5-6200U RAM: 8G Resolution: 1920x1080 我在arch下常用的软件 图形桌面环境 i3wm wifi无线管理 Networ ...