Python内建函数解析

map()函数:接收两个参数,一个是Iterable,一个是map,map将传入的函数依次作用到序列的每一个元素。并把结果以新的Iterable返回。

def fac(n):
    return n*n
print(list(map(fac,[1,2,3,4,5,6,7,8,9])))

##[1,4,9,16,25,36,49,64,81]

reduce()函数:把一个函数作用到一个序列上,必须接收两个参数,reduce把结果和序列的下一个元素做累积。
from functools import reduce
def fac(n,a):
    return n+a
print(reduce(fac,[1,2,3,4,5,6,7,8,9]))
----返回值45: 1+2=3 3+3=6.....36+9=45
def fac(n,a):
    return n*n+a*a
print(reduce(fac,[1,2,3,4,5,6,7,8,9]))
返回160623854392948285208011982134507489923477046669785452499236264188406112786126885439804859615624545
n*n+a*a=(n+a)^2-2*n*a;(1+2)^2-2*1*2=5 (5+3)^2-2*3*5=34......

filter函数:用于过滤序列。接受一个函数和一个序列。把传入的函数依次作用于每一个元素,用于根据返回值是True还是false来取决保留还是丢弃该元素。
比如1:要去除一个列表中的奇数
def fac(n):
    return n%2==0
print(list(filter(fac,[1,2,3,4,5,6,7,8,9])))
--返回值[2,4,6,8]
比如2:去除一个序列中的空字符串
def fac(n):
    return n+n.strip()
print(list(filter(fac,["a","","c"])))
返回值:["a","c"]
-------------------------------------------------------------------------------------------___________________________________________
filter的高级用法:求素数,埃氏筛法。
思路:1、首先定义生成一个从3开始的奇数的函数  2、定义筛选出一个素数的函数 3、使用filter函数将传入的函数依次作用于每一个元素,起到筛选 4、由于序列是无限生成,必须有退出.

def _old_iter():
    n=1
    while True:
        n=n+2
        yield n
def _not_primser(n):
    return lambda x:x%n>0
def primser():
    yield 2
    it=_old_iter() #初始化序列
    while True:
        n=next(it) #返回序列的第一个数值
        yield n
        it=filter(_not_primser(n),it) #构造新序列
for n in primser():
    if n<1000:
        print(n)
    else:
        break
___________________________________________________________________________________________________________________
sorted 排序算法
无论是冒泡排序还是快速排序.核心是比较两个元素的大小,如果是数字,可以直接比较,字符串和字典dict也可以排序。
数字上的排序,sorted排序
sorted([1,6,87,-56,-12,100]) #对数值的简单排序
返回值:[-56,-12,1,6,87,100]
sorted是一个高阶函数,接受key函数来实现自定义排
sorted([1,6,87,-56,-12,100],key=abs) #对数值先执行key函数,再排序。
返回值:[1,6,-12,-56,87,100]
对于字符串,默认的排序方法是按照ascii的大小比较的,大写的字母都在小写的字母之前。
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) #首先将序列里面的字符串小写,然后排序,可以忽略大小写
返回值:['about', 'bob', 'Credit', 'Zoo']
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower,reverse=True)#进行反向排序
返回值:['Zoo', 'Credit', 'bob', 'about']
返回函数
高阶函数除了可以接收函数作为参数之外,还可以把函数作为结果值返回。
def lazy_sum(*args): 
    def sum(): 
        ax = 0 
        for n in args: 
            ax = ax + n 
        return ax 
    return sum
传入参数返回的是一个函数,如果需要返回值还需要对返回的值再次调用.
f=lazy_sum(1,2,3,4,5)
print(f)#返回的是一个函数<function lazy_sum.<locals>.sum at 0x0000024631592378>
f()   #返回的是一个数值15
我们在定义lazy_sum函数,又定义了sum函数,内部的sum函数可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种被称为闭包。
当我们单独传入参数的时候,每一次调用,都会产生一个新的函数,即使传入相同的参数.
f1=lazy_sum(1,2,3,4,5)
f2=lazy_sum(1,2,3,4,5)
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()
print(f1())    #返回值为9
print(f2())    #返回值为9
print(f3())    #返回值为9
原因分析:返回的函数引用了变量i,但是并非i传入后就立即执行,而是i的最后一个参数传递之后,它们引用的变量就变成了3,最终结果都为9
————————————————————————————————————返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。 
如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
def count():
    def f(j):
        def g():
            return j*j
        return g
    fs=[]
    for i in range(1,4):
        fs.append(f[i])
    return fs
f1,f2,f3=count()
print(f1())    #返回值为1
print(f2())    #返回值为4
print(f3())    #返回值为9
————————————————————————————————————————————————————————————————————————————————————————————————————————
匿名函数:隐式的调用函数。匿名函数可以不要考虑函数名名称相同冲突
以map()函数为例:
list(map(lambda x:x*x+2,[1,2,3,4,5,6,7,8,9]))
装饰器:
函数是个对象,函数的对象也可以被赋给变量,通过变量也可以调用该函数。
def now():
    print("ladygogogogogo")
f=now
f()  #使用变量f调用now函数
___________________________________________________________________________________________________________
函数对象也有自己的属性:  _name_ 也可以拿到函数的名称
以now函数为例:
now._name_   #返回值:  "now"
f._name_     #返回值:  "now"
我们要增强now函数的功能,比如在函数调用前后自动打印日志,但又不希望改变now函数的定义,代码在允许期间动态增加功能的方式,称为装饰器.

偏函数:设定参数的默认值,可以降低函数调用的难道。
从functools模块提供一些特定的函数。其中一个叫偏函数。
int()函数将字符串转为整数.还提供额外的base参数.base进制.
print(int("123456",base=10)) #123456 123456以10进制转10进制
print(int("123456",base=8))  #123456以8进制转10进制,显示为42798
当然如果存在大量的数值需要转换,也可以通过函数的形式转换,利用默认参数和返回函数实现.
def int2(x,base=2):
    return int(x,base)
________________________________________________________________________________________
import functools
int2=functools.partial(int,base=2)














































 












 

————————————————————————————————————————

 
 
 


 

猜你喜欢

转载自blog.csdn.net/qq_24726509/article/details/81068060