三、函数+

一、函数可以当作数据传递

1、可以被引用

2、可以被当作参数传递

3、返回值可以是函数

4、可以当作容器类型的元素

二、函数嵌套

1、嵌套定义

def aaa():
    def bbb():
        def ccc():
            print('hello')
     ccc()
  bbb()

2. 嵌套调用

def max(x,y):
    return x if x > y else y

def max4(a,b,c,d):
    res1=max(a,b)
    res2=max(res1,c)
    res3=max(res2,d)
    return res3
print(max4(1,2,3,4))

 三、局部变量与全局变量

1. 函数内部使用变量名时,现在函数内部找局部变量,如果内部没有局部变量,再使用全局变量

    局部变量名和全局变量名相同时,修改局部变量值,全局变量不变

name='hao'
def change_name():
    name='quan'
    print(name)
change_name()
print(name)
   
quan
hao

2. 当定义局部变量时,全面加global,则会同时改变全局变量值

 nonlocal

name='hao'
def change_name():
    global name
    name='quan'
    print(name)
change_name()
print(name)

quan
quan

 nonlocal

num=5
def outer():
    num=8
    def innn():
        num = 10
        def inner():
            nonlocal num   # nonlocal关键字声明同时改变上一层变量值
            num = 100
            print(num)
        inner()
        print(num)
    innn()
    print(num)
outer()    
print(num)

100
100
8
5

 

3. 前向引用

def aaa():
    print('hello')
    bbb()
#报错,在调用函数bbb前必须先定义
def aaa():
    print('hello')
    bbb()
def bbb():
    print('everyone')
aaa()

#aaa在调用bbb时bbb还没有定义,但是在执行aaa之前已经定义,故不会报错
def aaa():
    print('hello')
    
def bbb():
    print('everyone')
    aaa()
bbb()

四、函数嵌套及作用域

name='alex'
def name1():
    name='alex1'
    def name2():
        name='alex2'
        print(name)
    name2()
    print(name)
    
name2()
print(name)

#函数name2是在name1中定义的,不可以直接调用name2
name='alex'
def foo():
    name='lhf'
    def bar():
        name='wu'
        def tt():
            print(name)
        return tt
    return bar

foo()()()


运行结果:
wu
#函数tt内没有给定变量name的值,则使用时向外一层寻找name值
#执行函数时使用foo()()(),foo()调用函数foo得到返回值bar,此时再加一对括号才能完成调用函数bar,得到返回值tt,再加括号调用函数tt

五、递归调用

  递归特性:

    1. 必须有一个明确的结束条件

    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

    3. 递归效率不高,递归层次过多会导致栈溢出

def cal(n):
    print(n)
    if int(n/2)==0:
        return n
    return cal(int(n/2))
cal(10)

10
5
2
1
#当n=1时,if语句为真,执行return n,不再运行后面的语句

 六、匿名函数 lambda

calc=lambda x,y:x+x*y
print(calc(5,2))

15
res=map(lambda x:x**2,[1,2,3,4,5])
print(list(res))

[1,4,9,16,25]

七、高阶函数

   满足以下两个特性任意一个即为高阶函数:

    1.函数的传入参数是一个函数名

    2.函数的返回值是一个函数名

1. map函数

  map(函数,可迭代对象)

    将可迭代对象中每个元素取出来,进行函数运算,得到新的可迭代对象

def func(x):
    return x**2
aa=[1,2,3,4]
print(list(map(func,aa)))  #map返回的是内存地址,需使用list

#一步到位
print(list(map(lambda x:x**2,[1,2,3,4])))

2. reduce函数

  reduce(函数,可迭代对象,默认值)

    数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 (有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用  函数    运算,最后得到一个结果,如果指定了默认值,默认值也参与运算

from functools import reduce
aaa=[1,2,3,4]
print(reduce(lambda x,y:x+y,aaa,50))

#60
from functools import reduce
aaa=[1,2,3]
print(reduce(lambda x,y:x*2+y,aaa,5))

运行结果:51
5*2+1=11
11*2+2=24
24*2*3=51

3. filter函数

  filter(函数,可迭代对象)

  依次取出可迭代对象的元素,用前面函数的逻辑判断true/false,返回判断为true的元素

aaa=['ahsug','dghud','asdf','sdgd']
print(list(filter(lambda x:x.startswith('a'),aaa)))

['ahsug','asdf']

 

name_dic=[
    {'name':'alex','age':1000},
    {'name':'wupeiqi','age':10000},
    {'name':'yuanhao','age':9000},
    {'name':'linhaifeng','age':18},
]

def func(x):
    age_list=[1000,10000,9000]
    return x['age'] not in age_list


res=filter(func,name_dic)
for i in res:
    print(i)

res=filter(lambda x:x['age'] == 18,name_dic)
for i in res:
    print(i)

{'name':'linhaifeng','age':18}
{'name':'linhaifeng','age':18}

 

posted @ 2019-01-12 15:25  猪光宝气  阅读(170)  评论(0编辑  收藏  举报