python 函数进阶笔记

函数的参数传递

1.必选参数

必选参数也叫位置参数,定义:就是在给函数传参数时,按照顺序,依次传值。

举一个简单例子

def sum(a,b):
    return a+b
sum(2,3)

函数sum(a,b)中有两个参数,a和b,这两个参数都是位置参数,调用的时候,传入的两个值按照顺序,依次赋值给a和b。

2.默认参数

定义:就是在写函数的时候直接给参数传默认的值,调用的时候,默认参数已经有值,就不用再传值了。
作用:最大的好处就是降低调用函数的难度。也可以传值给函数。但如果没有传参,一律采用的是默认值。

def sum_1(a,b=2):
    return a+b
sum_1(3)#调用函数,只传入一个值,没有传进去的那个按默认值
#5
sum_1(3,3)#调用函数,传入两个值,都是按传进去的值计算
#6
设置默认参数注意事项

第一:必选参数在前,默认参数在后,否则python解释器会报错。
第二:默认参数一定要指向不变对象!指向不变对象!指向不变对象!
(注意:python中的字符串,数字,元组都可以看做对象。)
为什么要设计str、None这样的不变对象呢?因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象

3.可变参数

简单来说,就是没有设置传入参数的多少,可以传进去多个值也可以一个值
表示方法: *arges

我们常用的求和函数就是这样设置的。

def sum_2(*b):
    sum =0
    for i in b:
        sum +=i
    return sum
sum_2(1,2,3,4,5,6,7,8,9,10)
# 55

很多函数都用到了可变参数,比如max()和min()函数,这样的很多,我们以后要记得设置函数可变参数记得用‘*’号来标记。

关键字参数(字典)

定义:可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。在调用函数时,可以只传入必选参数:
作用:扩展函数的功能
特征:**kw

如果直接传值给它会报错,我们看下面一个例子。

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
person(2,3,x=3)
#name: 2 age: 3 other: {'x': 3}

多个参数结合的用法

python 函数进阶笔记
这个图片讲解了常用的传参和几种参数结合,各种传参方法可能出现的结果。
最后我们对函数参数进行一个总结

1,Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

2,默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

3,要注意定义可变参数和关键字参数的语法:

*args是可变参数,args接收的是一个tuple;

**kw是关键字参数,kw接收的是一个dict。

4,以及调用函数时如何传入可变参数和关键字参数的语法:

可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过args传入:func((1, 2, 3));

关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过kw传入:func({‘a’: 1, ‘b’:2})。

5,使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

6,命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

函数文档

这里我借鉴老师的课件,有兴趣的可以看一下,作为一个程序员还是应该多写注释。
python 函数进阶笔记
python 函数进阶笔记

匿名函数

lambda表达式
1.lambda表达式可以用来声明匿名函数,也就是没有函数名字的临时使用的小函数,尤其适合需要一个函数作为另一个函数参数的场合。也可以定义具名函数。
2.lambda表达式只可以包含一个表达式,该表达式的计算结果可以看作是函数的返回值,不允许包含复合语句,但在表达式中可以调用其他函数。

python 函数进阶笔记
下面我们来看几个简单例子
python 函数进阶笔记
通过这几个例子,我们也大致掌握了lambda函数的用法了。
最后让我们看一下几个常用的比较牛逼的函数。

常用复杂函数

1.range() 函数
语法我就不过多强调了,可以看一下这张图片。
python 函数进阶笔记
python 函数进阶笔记
2.map()函数
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
python 函数进阶笔记
3.zip()函数
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。
python 函数进阶笔记
4.enumerate函数
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
python 函数进阶笔记
5.reduce函数
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

def add(x, y) :            # 两数相加
   return x + y
reduce(add, [1,2,3,4,5])   # 计算列表和:1+2+3+4+5
15

6.filter函数

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
注意: Pyhton2.7 返回列表,Python3.x 返回迭代器对象。
python 函数进阶笔记
这几个函数大概就介绍这么多了,有兴趣的可以自己去网上看一下相关的资料。