设为首页 加入收藏

TOP

Python高阶函数与函数装饰器-day4(一)
2017-09-30 12:54:41 】 浏览:1467
Tags:Python 高阶 函数 装饰 -day4
  • 上节回顾
  • 高阶函数
  • 闭包函数
  • 函数装饰器
  • 模块导入

 

一、上节回顾

  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]  #形参中的num
def 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 = leon
l()

#函数可以被当做参数
def yan(x):  #这里x形参,其实就是我们调用实参的函数名
    x()        #运行函数

y = yan(leon)


#函数当做返回值
def jian(x):   和上面一样这这也必须传入一个函数
    return x
j = jian(leon) #这里需要注意一点就是这里的意思是运行jian这个函数而这个函数返回的是x 也就是leon这个函数的内存地址,也就是说这时候leon这个函数并没有被执行
j()  #运行 leon函数

#可以做为容器类型的元素
leon_dict = {"leon":leon}

leon_dict["leon"]() #这样也可以运行leon这个函数

三、闭包函数

1.什么是闭包?我来看一下,比较官网的概念(这不是我在官网上面找的,不过没有关系,反正你们也看不懂):

  闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,闭包是由函数和与其相关的引用环境组合而成的实体。

  懵逼了?不存在的。下面我用简洁的说一下,但是有一点很重要,闭包是装饰器中的重点,如果没有把闭包正真理解,那么学完装饰器之后会很快忘记。我们通过一个列子来说明下

import requests   #首先导入一个模块,这个可以不用记

def get(url):    #定义一个get函数里面需要传一个url的位置参数
    def wapper():  #在定义一个wapper函数
        res = requests.get(url) #这一步就是打开一个网页
        return res.text   #将网页以文字的形式返回
    return wapper   #返回最里层的wapper函数

g = get("http://www.baidu.com")  #调用:首先因为作用域的原因,我们无法访问到里层的wapper函数,所以我们直接调用get函数这里返回了一个wapper函数
print(g())  # 然后我在调用g(get函数)的对象,这样是不是就访问到里层的wapper函数呢

PS:这里我们可以把函数当做一个特殊的变量,当代码从上向下执行的时候,如果函数不被调用话,函数内的代码是不会被执行的。就拿上面的上面的举例,当我们执行get函数的时候,这时候会返回一个wapper函数的内存地址,但是这个时候wapper函数并没有被执行也就是说g()这时候返回的状态其实就是wapper,这是我们只需要将g运行,就等于运行了wapper内的代码。

 

四、函数的嵌套调用

  嵌套调用其实很好理解,就是在一个函数中调用另一个函数的结果,也就是return的东西,同样的我们看一段非常简单的代码来看一下。

#嵌套调用,在一个函数中调用另一个函数的功能
#calc这个函数就是在对比两个数字的大小
def calc2(x,y):
    if x >y :
        return x
    else:
        return y

#我靠老板非常变态,然你直接计算四个数字的大小,擦。
def calc4(a,b,c,d):
    res1 = calc2(a,b)   #res1的值,这里不就是calc2这个函数比较时最大的哪一个吗。
    res2 = calc2(res1,c)
    res3 = calc2(r
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇洗礼灵魂,修炼python(4)--从简.. 下一篇洗礼灵魂,修炼python(6)--活起..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目