学点编程吧60天python入门-函数4(迭代器生成器)

上期作业

#使用递归的方式,实现二分查找
def binary_search(lists,data):
    n=len(lists)
    if n<1:
        return "找不到"
    mid=n//2#中间索引
    
    if lists[mid]>data:
        #要是中间索引的值大于我们想要的值,我们就到中间索引的左边的列表去找
        return binary_search(lists[0:mid],data)
    elif lists[mid]<data:
        return binary_search(lists[mid +1 :],data)
    else:
        return mid

lists=[1,2,3,4,5,6,7,8,9]
print(binary_search(lists,3))

 

#函数的其他用法
#生成器,有些列表生成的时间很长,
#但是可能只使用列表的一小部分

def simpleGeneratorFun():
    n=1
    yield n
    n=n+2
    yield n
    n=n+3
    yield n

gen = simpleGeneratorFun()
#print(gen)
print(next(gen))
print(next(gen))
print(next(gen))
#生成器函数里的数用完了,再有next就会报错
#一般使用for函数
for value in simpleGeneratorFun():
    print(value,end=" ")

1
3
6
1 3 6

import time
def fun1(num):
    i=0
    while i<num:
        yield i #yield类似return,程序暂停执行,将值返回
        i+=1
t1= time.time()
fun1(100000)
for j in fun1(10):
    c=j
    print(c)
t2=time.time()
print(t2-t1)#计算一下程序的执行时间

0
1
2
3
4
5
6
7
8
9
0.0009999275207519531

#迭代器
#iterable
my_iter=iter([1,2])
[i**2 for i in my_iter]

[1, 4]

#但是第二次再调用迭代器就没有了
[i**2 for i in my_iter]

[]

numbers=[1,2,3]
en = enumerate(numbers)#这个函数返回的就是一个迭代器
print(en)
print(next(en))
print(next(en))
print(next(en))

<enumerate object at 0x00000246278DC2D0>

(0, 1)

(1, 2)

(2, 3)

zi=zip(numbers,numbers)#返回也是一个迭代器
print(zi)
print(next(zi))
print(next(zi))

<zip object at 0x00000246278D3A88>
(1, 1)
(2, 2)

re=reversed(numbers)#返回也是迭代器
print(next(re))
print(next(re))
print(next(re))

3
2
1

 ##
##函数的闭包

def function_outside():
    cnt=1
    def function_inside():
        print(cnt)
    function_inside()

function_outside()
#内侧函数没有输入值的时候,可以调用外侧函数的变量

1

def function_outside():
    cnt=1
    def function_inside():
        nonlocal cnt#如果没有这句话则会报错
        cnt+=1
        print(cnt)
    function_inside()

function_outside()

2

#函数的闭包
def function():
    say="Hello"
    def hello(name):
        print(say,name)
    hello("xdbcb8")
hello = function()

Hello xdbcb8

#闭包的条件
#首先创建一个嵌套函数
#这个嵌套函数必须引用外层函数定义的变量
#外层函数返回嵌套函数
def function():
    say="Hello"
    def hello(name):
        print(say,name)
    return hello

hello =function()
hello("xdbcb8")

Hello xdbcb8

#如果客户有不同的标准
#比如客户a要求大于1000有效,客户b要求大于100有效,则可以使用闭包函数
def vali_f():
    testx=eval(input("请输入一个测试数据"))
    def validata(x):
        if testx>x:
            return 1
        else:
            return 0
    return validata

validata=vali_f()
isval=validata(1000)
if isval:
    print("数据有效")
else:
    print("数据无效")

请输入一个测试数据100

数据无效

#闭包的延迟
def fun_out():
    numList=[]
    for i in range(10):
        def fun_inside(x):
            return i*x
        numList.append(fun_inside)
    return numList
for fun_iterm in fun_out():
    print(fun_iterm(1))

9
9
9
9
9
9
9
9
9
9

##
#函数的装饰器decorator
def selftest(work):
    def entertainment():
        print("电脑自检中……")
        work()
    return entertainment

def watching_movies():
    print("电影真好看")
def play_game():
    print("游戏真好玩")

interest=1
watching_movies=selftest(watching_movies)
play_game=selftest(play_game)
if interest ==1:
    watching_movies()
else:
    play_game()

电脑自检中……

电影真好看

def selftest(work):
    def entertainment():
        print("电脑自检中……")
        work()
    return entertainment

@selftest
def watching_movies():
    print("电影真好看")
@selftest
def play_game():
    print("游戏真好玩")

interest=1
#watching_movies=selftest(watching_movies)
#play_game=selftest(play_game)

if interest ==1:
    watching_movies()
else:
    play_game()

电脑自检中……

电影真好看

def selfClean(air_condition):
    def clean(feature):
        print("空调自清洁")
        air_condition(feature)
    return clean

def air_condition(select):
    if select==1:
        print("吹冷风")
    else:
        print("吹热风")
        
powerOn=selfClean(air_condition)
powerOn(1)

空调自清洁

吹冷风

def selfClean(air_condition):
    def clean(feature):
        print("空调自清洁")
        air_condition(feature)
    return clean
@selfClean
def air_condition(select):
    if select==1:
        print("吹冷风")
    else:
        print("吹热风")
        
air_condition(1)

空调自清洁

吹冷风

def selfClean(air_condition):
    def clean(*args,**kwargs):
        print("空调自清洁")
        air_condition(*args,**kwargs)
    return clean

def definiteTime(air_condition):
    def timing(*args,**kwargs):
        print("空调定时关机启动……")
        air_condition(*args,**kwargs)
    return timing

@selfClean
@definiteTime
#先执行上面的
def air_condition(select,wp):
    if select==1:
        print("吹冷风")
        print("风力强度:%s"%(wp))
    else:
        print("吹热风")
        print("风力强度:%s"%(wp))
air_condition(1,"自动")

空调自清洁
空调定时关机启动……
吹冷风
风力强度:自动

def selfClean(air_condition):
    def clean(*args,**kwargs):
        print("空调自清洁")
        air_condition(*args,**kwargs)
    return clean

def definiteTime(hour):
    def timing(air_condition):
        def poweroff(*args,**kwargs):
            print("空调定时{}小时后,自动关机……".format(hour))
            air_condition(*args,**kwargs)
        return poweroff 
    return timing
def windPower(wind):
    def level(air_condition):
        def windy(*args,**kwargs):
            print("目前空调风力:{}".format(wind))
            air_condition(*args,**kwargs)
        return windy
    return level
               

@selfClean
@definiteTime(3)
@windPower("自动")
#先执行上面的
def air_condition(select):
    if select==1:
        print("吹冷风")

    else:
        print("吹热风")

air_condition(1)

空调自清洁
空调定时3小时后,自动关机……
目前空调风力:自动
吹冷风
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值