SZTU-ACM 第三周

        这周我继续Python 的学习,接下来是我的一些笔记(接上一篇):

一,高阶函数

        1.filter

                filter接收的是一个函数和一个序列,作用是过滤序列,实现筛选,把传入函数依次作用于序列中的每个元素,根据返回值是Ture还是False决定元素要保留还是舍去

                注意:必须用list()函数获得结果并返回list

#在一个list中删除偶数保留奇数
def is_odd(n):
    return n%2==1
print(list(filter(is_odd,[1,2,3,4,5,6,7,8,9,10])))
#输出[1,3,5,7,9]
#删掉序列中的空字符串
def not_empty(s):
    return s and s.strip()
print(list(filter(not_empty,['a','B',None,'c',' '])))
#输出:['a','B','c']

        2.sorted

        排序作用:

list=[-16,19,23,-33,24]
print(sorted(list))
#输出[-33, -16, 19, 23, 24]

        可用key()函数进行自定义排序:

list=[-16,19,23,-33,24]
print(sorted(list,key=abs))
#输出[-16, 19, 23, 24, -33]
#字符串排序
print(sorted(['about','Zoo','Creat','bob']))
#默认情况下字符串的排序是按照ASSIC表的大小排的,其中'Z'<'a'
#输出 ['Creat', 'Zoo', 'about', 'bob']
#字符串排序(忽视大小写的排序)
print(sorted(['about','Zoo','Creat','bob'],key=str.lower))
#输出 ['about', 'bob', 'Creat', 'Zoo']
#反向排序 之 字符串排序(忽视大小写的排序)
print(sorted(['about','Zoo','Creat','bob'],key=str.lower,reverse=True))
#输出 ['Zoo', 'Creat', 'bob', 'about']

二,返回函数

        高阶函数除了可以将函数作为参数外还能将函数作为结果值返回。

        注意:

        返回的函数没有被立即执行,要直到被调用时才执行。且每次调用都会返回新的函数哪怕传入相同的参数,调用结果也不相互影响。

        闭包:

        一种程序结构,即在外部函数中定义一个内部函数,内部函数可以引用外部函数的局部变量和参数,返回内部函数后,外部函数的参数和变量就会被保存在内部函数中。

        注意:

        返回闭包时不要引用循环变量或者后续会发生变化的变量,如果非要使用,可以再次定义一个函数,将该函数的参数与当前的循环变量绑定。

def lazy_sum(*arg):
    def sum():
        ans=0
        for n in arg:
            ans=ans+n
        return ans
    return sum
f1=lazy_sum(1,3,5,7,9)
f2=lazy_sum(1,3,5,7,9)
print(f1)#输出函数:<function lazy_sum.<locals>.sum at 0x000001675D182FC0>
print(f1())#输出25
print(f1==f2)#输出False

       

def count():
    fs=[]
    for i in range(1,4):#每次循环都形成一个新的函数
        def f():
            return i*i
        fs.append(f)
    return fs
f1,f2,f3=count()#新的函数不会每次都立即执行,而是等到运行到f3再一起输出
#但此时,i=3,故输出的全部为9
print(f1())
print(f2())
print(f3())
def count():
    def f(j):
        def g():
            return j*j
        return g#注意不能写成g()会报错
    fs=[]
    for i in range(1,4):
        fs.append(f(i))
    return fs
f1,f2,f3=count()
print(f1())
print(f2())
print(f3())
#输出 1,4,9

        nonlocal 非局部说明:

                使用闭包时,内部函数引用外部函数的局部变量,如果只是调用外部函数的变量,则返回的闭包函数调用一切正常,但如果对外部函数的变量进行赋值,则解释器会把外部函数变量当作内部函数变量,这时就需要加上nonlocal声明,防止报错。

def inc():
    x=0
    def fn():
        return x+1#直接返回外层变量,调用一切正常
    return fn
f=inc()
print(f())
print(f()) 
#输出 1,1
def inc():
    x=0
    def fn():
        nonlocal x   #注意格式:没有冒号,不要漏写x
        x=x+1
        return x
    return fn
f=inc()
print(f())
print(f()) 
#输出:1,2

三,匿名函数lambda

               用法格式:

                        lambda+参数+:

               特点:

                        只有一个表达式,没有return,表达式的结果就是返回值

                注意:

                        匿名函数可以赋值给一个变量;可以把匿名函数作为返回值返回。

print(list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9])))
#输出:[1, 4, 9, 16, 25, 36, 49, 64, 81]
#注意用map()时前面也要有list(),使结果返回一个list
def build(x, y):
    return lambda: x * x + y * y
f=build(1,2)
print(f())
#输出:5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值