python--006

2019-07-24 09:07:54来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

一、函数的作用域

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)
总结

 


原文链接:https://www.cnblogs.com/zp0923/p/11100131.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:多线性方程组迭代算法——Gauss-Seidel迭代算法的Python实现

下一篇:python入门