python函数(上)

局部变量:

包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。

a = 6688


def foo():
    a = 666

    def inner_foo():
        global a
        print(a)
        a = 888
        print("1", a)

    inner_foo()
    print("2", a)


print("3", a)
foo()
print("4", a)

'''
3 6688
6688
1 888
2 666
4 888
'''

可变类型的全局变量

li = ['a', 'b']


def foo():
    li.append('c')
    print(li)


foo()

#['a', 'b', 'c']

列表是可变数据类型,数字和字符串是不可变数据类型。

递归函数

在一个函数体内部,调用函数本身,就被称为递归函数。

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


print(func(10))

'''
10
5
2
1
1
'''

匿名函数(lambda)

格式:

lambda para1, para2, ... , paraN : expression using paras
f = lambda x="city", y="college", z="ZUCC": x + y + z
print(f("Zhejiang"))

#ZhejiangcollegeZUCC

高阶函数

把一个函数名,以实参的形式,传递给下颌骨函数的形参,这个函数就是高阶函数

def add(a, b, c):
    return c(a) + c(b)


a_value = add(-9, 1, abs)
print(a_value)

#10
li = ['Zhejiang', 'University', 'City', 'College']


def filter_test(para):
    ret = []
    for i in para:
        if not i.startswith("C"):
            ret.append(i)

    return ret


print(filter_test(li))

#['Zhejiang', 'University']

filter函数

li = ['Zhejiang', 'University', 'City', 'College']


def end(a):
    return a.endswith("ty")


def star(b):
    return b.startswith("C")


def filter_test(func, para):
    ret = []
    for i in para:
        if not func(i):
            ret.append(i)
    return ret


print(filter_test(end, li))
print(filter_test(star, li))

#['Zhejiang', 'College']
#['Zhejiang', 'University']

print(filter_test(lambda a: a.endswith("ty"), li))
print(filter_test(lambda b: b.startswith("C"), li))

print(list(filter(lambda a: not a.endswith("ty"), li)))# filter 内置函数
print(list(filter(lambda b: not b.startswith("C"), li)))
#三者结果相同

功能:

  • 过滤掉序列中不符合函数条件的元素。当序列中需要保留的元素可以用某些函数描述时,就应该想到filter函数。

调用格式:

  • filter(function, sequence)
    • function —> 可以是自定义的函数,也可以匿名函数
    • sequence —> 列表,元组,字符串

map 映射

功能:
  • 求一个序列或者多个序列进行函数映射后的值。(用list()强转)
格式:
  • map(function, iterable1, iterable2)
    • function的参数可以不止一个
    • iterable1,iterable2就是传入的参数
li = [1, 2, 3, 4, 5]
res = map(lambda x: x + 1, li)
print(list(res))

#[2, 3, 4, 5, 6]

x = [1, 2, 3, 4, 5]
y = [2, 3, 4, 5, 6]

res = map(lambda x, y: x * y + 2, x, y)
print(list(res))

#[4, 8, 14, 22, 32]

x = [1, 2, 3, 4, 5]
y = [2, 3, 4, 5, 6]


def f(x, y):
    return x * y + 2


res = map(f, x, y)
print(list(res))

#结果同上

用高阶函数显示和map一样的结果:

li = [1, 2, 3, 4, 5]


def f(x):
    return x * (x + 1) + 2


def map_test(func, para):
    ret = []
    for i in para:
        ret.append(func(i))
    return ret


print(map_test(f, li))

#[4, 8, 14, 22, 32]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值