python-day11-闭包,迭代器,递归及递归版二分查找

今日大纲:

1.函数名的使用

2.闭包

3.迭代器

4.递归

 

 

1.函数名的使用

# 1.通过另一个变量名调用该函数
def func():
    print(123)

temp = func
temp()

# 2.函数名可以当作元素放进容器
def a1():
    print(1)
def a2():
    print(2)
lis = [a1,a2]
print(lis)
# [<function a1 at 0x000002AE39365A60>, <function a2 at 0x000002AE3936ED08>]
for func in lis:
    func()
"""
1
2
"""

# 3.函数名可以当作返回值,嵌套函数返回内部函数的内存地址调用
def func2():
    def func3():
        print(456)
    return func3

temp = func2()
temp()

# 4.函数名可以当作参数传递
def t1(t):
    print(11)
    t()
    print(11)

def t2():
    print("t2!!")

t1(t2)

 

 

2.闭包

闭包的特性:

    1.是一个嵌套函数

    2.在嵌套函数的内部函数调用上一层非全局的变量

    注:以上两点已经可以判断是个闭包

    3.在嵌套函数里返回了内部函数的内存地址

 

闭包和普通函数的不同:

  python中闭包,会在内存中驻留 (闭包会占内存) ,而普通函数执行完毕则销毁。

 

检查一个看函数是否是闭包:

func.__closure__    # 如果返回的不是None,该函数就是一个闭包

def func1():
    a = 100
    def inner():
        print(a)   #在嵌套函数内部使用上一层非全局变量的值
    return inner

inner = func1()
inner()
print(inner.__closure__)  # 如果返回的不是None,该函数就是一个闭包
"""
(<cell at 0x00000118CBB09618: int object at 0x000000006F718CD0>,)
100
"""

 

3.迭代器

迭代器的特性:

  1.惰性机制,需要一个给一个

  2.不能从后往前取数据

  3.一次性,取完就没了,不可再取

 

判断一个对象是否是可迭代对象:

    这个对象如果有__iter__方法就代表它是个可迭代对象。

 

判断一个对象是否是迭代器:

  具有__iter__和__next__方法就是迭代器。

 

for循环的机制:

lis = [1,2,3,4,5,6]
# 创建一个迭代器,格式:可迭代对象.__iter__()
temp = lis.__iter__()
# 取迭代器的值,需要__next__()方法,当迭代器为空抛出StopIteration
while 1:
    try:
        print("%s"%temp.__next__(),end=" ")
    except StopIteration:
        break
"""
1 2 3 4 5 6 
"""

 

4.递归

函数调用函数本身,有明确的结束条件。

 

递归的应用场景:

  1.在不明确循环的次数时候,可以用递归

  2.递归操作文件目录

注:递归的效率低,而且占内存,推荐使用堆栈

 

递归修改最大递归层数:

import sys

sys.setrecursionlimit(number)

注:默认最大递归层数官方是1000,实际998/997层

 

二分查找例子:  # 随意写的

def my_find(lis,value):
    mid = len(lis) // 2
    print("1")
    if mid:
        if value == lis[mid]:
            print("找到了!")
            return lis[mid]
        elif value > lis[mid]:
            return my_find(lis[mid:],value)
        else:
            return my_find(lis[:mid],value)
    elif lis[mid] == value:
        print("找到了!")
        return lis[mid]
    else:
        return "%s not in the list!"%value


a = [33,55,66,77,88,99,100,122,166,177,178,184,199,203,233,294,305,402,666,834,992,1022]
result = my_find(a,233)
print(result)
"""
1
1
1
1
找到了!
233
"""

 

转载于:https://www.cnblogs.com/zezhou/p/10537495.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值