zoukankan      html  css  js  c++  java
  • python--006

    一、函数的作用域

    1、作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变

    例一:
    name='alex'
    
    def foo():
        name='lhf'
        def bar():
            print(name)
        return bar
    
    func=foo()
    func()
    
    
    例二:
    name='alex'
    
    def foo():
        name='lhf'
        def bar():
            name='wupeiqi'
            def tt():
                print(name)
            return tt
        return bar
    
    func=foo()
    func()()
    foo()()()

     二、匿名函数

    #匿名函数
    #格式:lambda关键字  形参:表达式
    fun=lambda  x:x+1
    print(fun(3))
    

     

    name='张鹏'
    fun=lambda  x:x+'帅锅'
    red=fun(name)
    print(red)

     

    name='name'
    funn=lambda x,y:(x.startswith('n'),y+'1')
    print(funn('knnnn','dddddd'))

    三、函数式编程

    函数的参数传入,是函数吃进去的食物,而函数return的返回值,是函数拉出来的结果,

    面向过程的思路就是,把程序的执行当做一串首尾相连的函数,一个函数吃,拉出的东西给另外一个函数吃,另外一个函数吃了再继续拉给下一个函数吃。。。

    1、不可变,不用变了保存状态,不修改变量

    2、第一类对象:函数即‘变量’

      函数名可以当参数传递

      返回值可以是函数名
    例如:
    用户登录流程:前端接收处理用户请求-》将用户信息传给逻辑层,逻辑词处理用户信息-》将用户信息写入数据库
    验证用户登录流程:数据库查询/处理用户信息-》交给逻辑层,逻辑层处理用户信息-》用户信息交给前端,前端显示用户信息

    函数式编程: 

    (以下部分内容摘自网络)

    11 高阶函数

    满足俩个特性任意一个即为高阶函数

    1.函数的传入参数是一个函数名(把函数当做参数,传给另外一个函数;)

    1 def foo (n):
    2     print(n )
    3 def bar(name):
    4     print('my name is %s'%name)
    5 foo(bar('张三'))

    2.函数的返回值是一个函数名(返回值中包含函数)

    尾调用

    map()函数

    array=[1,3,4,71,2]

    ret=[]
    for i in array:
    ret.append(i**2)
    print(ret)

    #如果我们有一万个列表,那么你只能把上面的逻辑定义成函数
    def map_test(array):
    ret=[]
    for i in array:
    ret.append(i**2)
    return ret

    print(map_test(array))

    #如果我们的需求变了,不是把列表中每个元素都平方,还有加1,减一,那么可以这样
    def add_num(x):
    return x+1
    def map_test(func,array):
    ret=[]
    for i in array:
    ret.append(func(i))
    return ret

    print(map_test(add_num,array))
    #可以使用匿名函数
    print(map_test(lambda x:x-1,array))


    #上面就是map函数的功能,map得到的结果是可迭代对象
    print(map(lambda x:x-1,range(5)))

      map函数

    array=[1,3,4,71,2]
    
    ret=[]
    for i in array:
        ret.append(i**2)
    print(ret)
    
    #如果我们有一万个列表,那么你只能把上面的逻辑定义成函数
    def map_test(array):
        ret=[]
        for i in array:
            ret.append(i**2)
        return ret
    
    print(map_test(array))
    
    #如果我们的需求变了,不是把列表中每个元素都平方,还有加1,减一,那么可以这样
    def add_num(x):
        return x+1
    def map_test(func,array):
        ret=[]
        for i in array:
            ret.append(func(i))
        return ret
    
    print(map_test(add_num,array))
    #可以使用匿名函数
    print(map_test(lambda x:x-1,array))
    
    
    #上面就是map函数的功能,map得到的结果是可迭代对象
    print(map(lambda x:x-1,range(5)))
    
    
    

      

    filter()函数
    move_people=['zp','sb','sb_ls','alex']
    ret=[]
    for p in move_people:
        if not p.startswith('sb'):
            ret.append(p)
    print(ret)
    move_people1=['sgzp','sb','sb_lssb','sbalexsb','sbooppp','sssddhfhfhhdhsb']
    """
    开始位置查询或排除
    """
    def sb_(p):
        return p.endswith('sb')
    '''
    结尾处查找或排除
    '''
    def _sb(p):
        return p.startswith('sb')
    '''
    总的调用
    '''
    def save(area,func):
        ret = []
        for p in area:
            if not func(p):
                ret.append(p)
        return ret
    n=save(move_people1,sb_)
    print('好人1:',n)
    n=save(move_people1,_sb)
    print('好人2:',n)
    '''终极版
    '''
    n=save(move_people1,lambda  x: p.startswith('sss'))
    print('好人3:',n)
    print('好人4',list(filter(lambda  p:not p.endswith('hsb'),move_people1)))#move_people1是一个可迭代对象
    

     reduce()函数

     1 from functools import reduce
     2 #合并,得一个合并的结果
     3 array_test=[1,2,3,4,5,6,7]
     4 array=range(100)
     5 
     6 #报错啊,res没有指定初始值
     7 def reduce_test(func,array):
     8     l=list(array)
     9     for i in l:
    10         res=func(res,i)
    11     return res
    12 
    13 # print(reduce_test(lambda x,y:x+y,array))
    14 
    15 #可以从列表左边弹出第一个值
    16 def reduce_test(func,array):
    17     l=list(array)
    18     res=l.pop(0)
    19     for i in l:
    20         res=func(res,i)
    21     return res
    22 
    23 print(reduce_test(lambda x,y:x+y,array))
    24 
    25 #我们应该支持用户自己传入初始值
    26 def reduce_test(func,array,init=None):
    27     l=list(array)
    28     if init is None:
    29         res=l.pop(0)
    30     else:
    31         res=init
    32     for i in l:
    33         res=func(res,i)
    34     return res
    35 
    36 print(reduce_test(lambda x,y:x+y,array))
    37 print(reduce_test(lambda x,y:x+y,array,50))
    38 
    39 reduce函数

     总结

    map()
    处理序列中的每个元素,得到的结果是一个’列表‘,该‘列表’元素个数及位置与原来一样
    filter()
    遍历序列中的每个元素,得到的每个元素得到的布尔值,如果是true则保留下来
    reduce()
    处理一个序列,然后将序列合并操作

     1 #当然了,map,filter,reduce,可以处理所有数据类型
     2 
     3 name_dic=[
     4     {'name':'alex','age':1000},
     5     {'name':'wupeiqi','age':10000},
     6     {'name':'yuanhao','age':9000},
     7     {'name':'linhaifeng','age':18},
     8 ]
     9 #利用filter过滤掉千年王八,万年龟,还有一个九千岁
    10 def func(x):
    11     age_list=[1000,10000,9000]
    12     return x['age'] not in age_list
    13 
    14 
    15 res=filter(func,name_dic)
    16 for i in res:
    17     print(i)
    18 
    19 res=filter(lambda x:x['age'] == 18,name_dic)
    20 for i in res:
    21     print(i)
    22 
    23 
    24 #reduce用来计算1到100的和
    25 from functools import reduce
    26 print(reduce(lambda x,y:x+y,range(100),100))
    27 print(reduce(lambda x,y:x+y,range(1,101)))
    28 
    29 #用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb
    30 name=['alex','wupeiqi','yuanhao']
    31 
    32 res=map(lambda x:x+'_sb',name)
    33 for i in res:
    34     print(i)
    总结
  • 相关阅读:
    SQL行转列问题
    pgAdmin III 单表数据的导出导入
    window 服务的安装和卸载
    将Excel表格转成DataTable
    “Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应”解决方法
    form-data提交
    由于本公司项目需要,现急需拥有微软MCSE证书的人才,一经录用,待遇从优!
    Head First设计模式悟道
    entityframwork
    .net 开源模板引擎jntemplate 教程:基础篇之在ASP.NET MVC中使用Jntemplate
  • 原文地址:https://www.cnblogs.com/zp0923/p/11100131.html
Copyright © 2011-2022 走看看