Python学习笔记——(4)Python中的自定义函数与作用域

1 概述

  • 函数作为在汇编语言中就出现的东西,在python里一定也少不了。python对函数进行了功能的拓展,可以实现很多强大的功能

2 自定义函数

  • 使用def定义一个新的函数。
  • 在函数名下方添加注释,可以使用help查看时输出注释。
>>> def square(x):
...     """对输入的x进行平方处理"""
...     return x*x
... 
>>> help(square)
Help on function square in module __main__:

square(x)
    对输入的x进行平方处理

>>> square(3)
9

3 作用域

  • 作用域分为局部作用域和全局作用域
  • 在函数中的变量属于局部作用域
  • 值得注意的时,如果想在函数内修改全局变量的值,需要在函数中对全局变量进行global声明之后,才可以进行修改。
  • 以下代码参考Python global变量中的第二小节,作者:M_GBO
#usr/bin/python
#encoding=utf-8
sumAB = 0
print '最早的sumAB的id',id(sumAB)
def printsumAB(a,b):
    global sumAB
    print '初始sumAB = ',sumAB
    print '初始sumAB的id = ',id(sumAB)
    sumAB = a+b
    print '修改后的sumAB = ',sumAB
    print '修改后的sumAB的id = ',id(sumAB)
printsumAB(1,2)
print '最终的sumAB = ',sumAB
print '最终的sumAB的id = ',id(sumAB)
  • 打印后:
最早的sumAB的id 140430981252272
初始sumAB =  0
初始sumAB的id =  140430981252272
修改后的sumAB =  3
修改后的sumAB的id =  140430981252200
最终的sumAB =  3
最终的sumAB的id =  140430981252200

4 闭包函数(嵌套函数)

  • 嵌套函数的一个特点是,内层函数可以调用在外层函数中定义过的局部变量

5 灵活的函数参数

5.1 默认参数

  • 默认参数可以减少代码量,提高代码运行速度
  • 默认参数一般以参数名=默认值的形式组成,比如def pow(x, n = 2):,这里x是位置参数,n是默认参数。如果在调用函数的时候不设定n的值,则n=2。
  • 【注意】在输入参数的时候,位置参数必须在默认参数的左边

5.2 变长参数(*args)

  • 在某些情况下,输入的参数个数是不确定的,于是python提供了这个方法,可以输入个数不确定的参数
def function1(*args):
    """返回多个参数的和"""
    for i in args:
        print(i)

    def sum_all():
        """求和"""
        result = 0
        for i in args:
            result += i
        return result
    return sum_all() + 1
  • 注意,在上面的函数中还使用到了第4节学过的闭包函数
  • 输出结果:
>>> function1(1)
1
2
>>> function1(1,2,3,4,5,6,7)
1
2
3
4
5
6
7
29
  • 可变长度参数被广泛应用在各种函数之中,比我我们经常使用的print()打印这个函数,用help看他就可以明白:
print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

5.3 关键字参数(**kwargs

  • python中提供了关键字参数来大幅度简化函数调用过程中的参数传递。
  • 关键字参数中变量名称为,参数为,和字典中的键值对非常类似。
def function2(**kwargs):
    """关键字参数"""
    for k, v in kwargs.items():
        print(k, ':', v)
  • 运行函数后的输出为
>>> function2(name='小明', home='中国')
name : 小明
home : 中国
  • 其实还可以这样,在python中是支持中文命名的对象名称的:
>>> function2(姓名='小明', 国籍='中国')
姓名 : 小明
国籍 : 中国

6 匿名函数lambda 参数 : 表达式

  • 匿名函数仅支持一句话,其可以实现非常强大的功能
>>> square = lambda x, y: x**y
>>> square(2,5)
32
  • 上述代码实现的是计算x的y次方

7 高阶函数

  • 高阶函数是以函数对象最为参数的函数
  • 高阶函数是可以嵌套的
  • 和匿名函数结合可以实现更强大的功能
  • 高阶函数求值具有惰性,需要使用遍历的方法迫使高阶函数执行计算过程

7.1 map函数

  • 该函数通过接收一个函数作为处理函数,然后接收一个(或多个)序列,并使用处理函数对秀娥中的每个元素逐一处理,达到映射功能
  • 【注意】map本身是惰性计算的,因此返回的结果并不是真实结果,而是一个需要被显示迭代的迭代器。
>>> a = [1,2,3,4,5]
>>> y = map(lambda x:x**2, a)
>>> y
<map object at 0x000001615D7CA948>
>>> list(y)
[1, 4, 9, 16, 25]
  • 这里使用list方法隐式遍历y
  • 再举一个接收多个序列的例子,a与b的对应项相加,我觉的这个例子很重要呀:
>>> a = [1,2,3,4,5]
>>> b = [6,7,8,9,10]
>>> list(map(lambda x,y:x+y, a,b))
[7, 9, 11, 13, 15]

7.2 reduce函数

  • 以下文案参考Python reduce() 函数 | 菜鸟教程
  • 语法:
    reduce(function, iterable[, initializer])
    
  • 参数解释
        function -- 函数,有两个参数
        iterable -- 可迭代对象
        initializer -- 可选,初始参数
    
  • 该函数的功能是对序列(即iterable,可迭代对象)进行状态的叠加。一般参数function有两个参数,首先这两个参数是可迭代对象的第1和第2个元素。function运算后,后将结果作为第一个参数传回function,然后第二个参数变为可迭代对象的第3个元素,再次进行计算。以此类推得到最终结果。一下举两个例子进行说明:
# 例1
>>> reduce(lambda x, y: x+y, [1,2,3,4,5])
15
# 例2
>>> reduce(lambda x, y: 10 * x + y, map(lambda ch: ord(ch) - 0x30, '123456'))
>>> 123456
  • 在例1中,匿名函数的作用是求两个输入参数的和,于是使用reduce会首先计算1+2,然后将结果3和列表的第三个元素3相加,得到6,最终实现列表整体的求和。
  • 在列2中,实现了reduce函数和map函数的嵌套调用。map函数中匿名函数的作用是将字符串通过二进制编码的方式转换成数字,其中ord函数的作用是将字符串转换成二进制编码。而字符“1”和数字“1”的二进制编码相差48,即0x30,从而实现字符到数字的转化。通过map函数,会生成一个可迭代的对象,将这个对象作为reduce的第二个参数输入其中,就完成了由字符串到整形数字的转换。

7.3 filter函数

  • 这个函数对于一个Django程序员很是迷惑。。。
  • filter函数用于筛选数据,拥有两个参数。第一个参数是一个返回bool值的函数,第二个参数是一个可迭代对象。
  • filter对可迭代对象中的每一个元素放入函数中运算,将返回值为True的对象留下,将返回值为False的对象去掉。
def is_odd(n):
    return n % 2 == 1
    
newlist = list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
print(newlist)
  • 输出为
[1, 3, 5, 7, 9]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值