首页 > 编程 > Python > 正文

详谈Python高阶函数与函数装饰器(推荐)

2020-02-16 10:20:42
字体:
来源:转载
供稿:网友

一、上节回顾

Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误。我在这里简单归纳Python3和Python2各自的区别。

首先是Python3-->代码文件都是用utf-8来解释的。将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以“翻译”所以格式编码的格式。Python3中str和bytes是两种格式,bytes可以当做二进制的表现形式。

Python2使用系统默认的字符编码解释代码,所以要用utf-8解释代码,就必须在头部申明;并且Python2中有解码和编码,但是解码动作是必须的而编码动作可以忽略,因为Python代码加载到内存中就是Unicode,这一点和python3一样;Python2中还需要注意的就是str和bytes是一个意思。Python2 里面的str就是Python3中的bytes格式,而Python3中的str其实就是Unicode.

函数基础(这里我就是用递归函数中的二分查找)

为什么使用函数:将将程序进行模块设计

定义函数有三种形式:

- 无参函数

- 有参函数

- 空函数

PS:如果函数有多个返回值,那么返回的来的数据格式是元组

- 如何在函数传入参数时限定参数数据格式。

def leon(x:int,y:int)->int:

pass

其中这里指定了x,y都必须是int类型 " -> "的意思是函数返回值也必须是int类型

print(yan.__annotations__):显示形参的限定数据格式以及返回值的格式

a = [1,2,3,4,5,7,9,10,11,12,14,15,16,17,19,21] #形参中的numdef calc(num,find_num): print(num) mid = int(len(num) / 2)   #中间数的下标 if mid == 0: #递归函数非常重要的判断条件 if num[mid] == find_num:  print("find it %s"%find_num) else:  print("cannt find num") if num[mid] == find_num: #直接找到不用递归,结束函数 print("find_num %s"%find_num) elif num[mid] > find_num: #find_num应该在左边,向下递归 calc(num[0:mid],find_num) elif num[mid] < find_num: #find_num应该在右边,向下递归 calc(num[mid+1:],find_num)calc(a,12)

匿名函数

c = lambda x:x+1 #x就是形参,c就是这个匿名函数的对象print(c(22)) 

高阶函数-特性

1. 把一个函数的内存地址传给另外一个函数,当做参数

2.一个函数把另外一个函数的当做返回值返回

def calc(a,b,c):print(c(a) + c(b))calc(-5,10,abs) #引用上一节的实例,将-5和10绝对值相加

 

二、高阶函数(补充)

函数是第一类对象

函数可以被赋值

可以被当做参数

可以当做返回值

可以作为容器类型的元素

#函数可以被赋值def leon(): print("in the leon")l = leonl()#函数可以被当做参数def yan(x): #这里x形参,其实就是我们调用实参的函数名 x() #运行函数y = yan(leon)#函数当做返回值def jian(x): 和上面一样这这也必须传入一个函数 return xj = jian(leon) #这里需要注意一点就是这里的意思是运行jian这个函数而这个函数返回的是x 也就是leon这个函数的内存地址,也就是说这时候leon这个函数并没有被执行j() #运行 leon函数#可以做为容器类型的元素leon_dict = {"leon":leon}leon_dict["leon"]() #这样也可以运行leon这个函数            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表