Python部分函数总结
函数进阶(1)
函数的参数传递
-
参数定义与传递的基本顺序
位置参数→关键字参数→可变数量参数
举例如下:
def test_fun(a,b=6,*c,**d):#(*)是元组,(**)传入的是字典
print("a = ",a,",b = ",b,",c = ",c,",d = ",d)
>>>test_fun(1,2)
a = 1 ,b = 2 ,c = () ,d = {}
>>>test_fun(1,2,3)#元组
a = 1 ,b = 2 ,c = (3,) ,d = {}
>>>test_fun(1,2,3,4)#因为字典有key,有value,在传入的参数中没有对应的格式,故输出字典为空
a = 1 ,b = 2 ,c = (3, 4) ,d = {}
>>>test_fun(a=1)
a = 1 ,b = 6 ,c = () ,d = {}
>>>test_fun(a=1,b=2)
a = 1 ,b = 2 ,c = () ,d = {}
>>>test_fun(a=1,b=2,c=3)#直接把c=3放进了**d中
a = 1 ,b = 2 ,c = () ,d = {'c': 3}
>>>test_fun(1,b=2)
a = 1 ,b = 2 ,c = () ,d = {}
>>>test_fun(1,2,3,4,x=1)
a = 1 ,b = 2 ,c = (3, 4) ,d = {'x': 1}
>>>test_fun(1,2,3,4,5,6,x=1,y=2,z=3)
a = 1 ,b = 2 ,c = (3, 4, 5, 6) ,d = {'x': 1, 'y': 2, 'z': 3}
>>>test_fun(1,2,3,4,b=8)#这里对b进行二次赋值,所以会报错
----------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-14-d70e027b0821> in <module>()
10 test_fun(1,2,3,4,x=1)
11 test_fun(1,2,3,4,5,6,x=1,y=2,z=3)
---> 12 test_fun(1,2,3,4,b=8)
TypeError: test_fun() got multiple values for argument 'b'
函数文档
函数定义语法
def 函数名([参数列表]):
== ‘’’ 注释可以用来提示该函数的主要功能’’’==
函数体
lambda匿名函数
- lambda表达式
- lambda表达式可以用来声明匿名函数,也就是没有函数名
字的临时使用的小函数,尤其适合需要一个函数作为另一
个函数参数的场合。也可以定义具名函数。 - lambda表达式只可以包含一个表达式,该表达式的计算结
果可以看作是函数的返回值,不允许包含复合语句,但在
表达式中可以调用其他函数。
- lambda函数定义
- lambda函数返回函数名作为结果
- lambda函数是一种匿名函数,即没有名字的函数
- 使用Lambda保留字定义,函数名是返回结果
- lambda函数用于定义简单的、能够在一行内表示的函数
>>> f = lambda x, y, z: x+y+z #可以给lambda表达式起名字
>>> f(1,2,3) #像函数一样调用
6
>>> g = lambda x, y=2, z=3: x+y+z #参数默认值
>>> g(1)
6
>>> g(2, z=4, y=5) #关键参数
11
- lambda函数的应用
- 注意!!!谨慎使用lambda函数
- lambda函数主要用作一些特定函数或方法的参数
- lambda函数有一些固定使用方式,建议逐步掌握
- 一般情况, 建议使用def定义的普通函数
map/filter/zip/reduce/enumerate等函数运用
range函数
Python3 range()函数返回的是一个可迭代对象(类型是对象) ,而不是列表类型,所以打印的时候不会打印列表。
Python3 list()函数是对象迭代器,可以把range(返回的可迭代对象转为一个列表,返回的变量类型为列表。
Python2 range()函数返回的是列表。
-
函数语法
>>>range(stop) >>>range(start,stop[,step])
-
参数说明:
start: 计数从start开始。默认是从0开始。例如range (5)等价于range(0, 5);
stop: 计数到stop结束,但不包括stop。例如: range(0, 5)是[0, 1,2, 3, 4]没有5
step: 步长,默认为1。例如: range(0, 5)等价于range(0, 5, 1) -
举例说明:
>>>range(5)
range(0, 5)
>>>for i in range(5):
print(i)
0
1
2
3
4
>>>list(range(5))
[0, 1, 2, 3, 4]
>>>list(range(0))
[]
>>>list(range(0,30,5))
[0, 5, 10, 15, 20, 25]
>>>list(range(0,10,2))
[0, 2, 4, 6, 8]
>>>list(range(0,-10,-1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>>list(range(1,0))
[]
map函数
-
定义:
map()会根据提供的函数对指定序列做映射。
第一个参数function以参数序列中的每一个元素调用 function函数,返回包含每次function函数返回值的新列表。 -
语法:
map函数语法:
map(function,iterable)
- 参数:
- function: 函数
- iterable :个或多个序列
- 返回值:
- Python 2.x返回列表。
- Python 3.x返回迭代器。
def square(x):#计算平方数
return x ** 2
>>>map(square,[1,2,3,4,5])#这个输出的是“迭代器”
<map at 0x276529aa6d8>
>>>list(map(square,[1,2,3,4,5]))#只有我们告诉它想生成列表的时候,它才会返回这5个数的平方数
[1, 4, 9, 16, 25]
>>>list(map(lambda x:x**2,[1,2,3,4,5]))
[1, 4, 9, 16, 25]
def add(x,y,z):
return x+y+z
>>>l =[1,2,3]
>>>l2 = [1,2,3,4]
>>>l3 = [1,2,3,4,5]
>>>res = map(add,l,l2,l3)#当三个列表长度不够时,map有截断作用,以最短的列表为基准进行加减
>>>print(list(res))
[3, 6, 9]
filter函数
- 定义
- filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
- 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回True或False ,最后将返回True的元素放到新列表中。
-
语法
以下是fiter()方法的语法:
>>>filter(function, iterable)
- 参数
- function 判断函数。
- iterable 可迭代对象。
- 举例
- 内置函数filter()将一个单参数函数作用到一个序列上,返回该序列中使得该函数返回值为True的那些元素组成的filter对象,如果指定函数为None ,则返回序列中等价于True的元素。
>>> seq = ['foo', 'x41', '?!', '***']
>>>def func(x):
return x.isalnum() #测试是否为字母或数字
>>> filter(func, seq) #返回filter对象
<filter object at 0x000000000305D898>
>>> list(filter(func, seq)) #把filter对象转换为列表
['foo', 'x41']
def is_odd(n):
return n % 2 == 1
>>>newlist = filter(is_odd,[1,2,3,4,5,6,7,8,9])
>>>print(newlist)#这里输出的是一个迭代器
<filter object at 0x0000022E766DB160>
>>>print(list(newlist))#这里输出的才是列表
[1, 3, 5, 7, 9]
>>>list(filter(lambda x:x>2,[0,1,2,3,0,0]))
[3]
>>>list(filter(None,[0,1,2,3,0,0]))
[1, 2, 3]
zip函数
- 描述
-
zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组 ,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用*号操作符,可以将元组解压为列表。
注: zip方法在Python 2和Python 3中的不同:在Python 3.x中为了减少内存, zip() 返回的是一个对象。如需展示列表,需手动list()转换。
zip(seq[,seq…]): zip()函数可把两个或多个序列中的相应项合并在一起,并以元组的格式返回它们,在处理完最短序列中的所有项后就停止。
-
语法
zip语法:
>>>zip([iterable, ...])
- 参数说明
- iterabl 一个或多个迭代器;
-
返回值
返回元组列表。 - 举例
>>>a = [1,2,3]
>>>b = [4,5,6]
>>>zipped = zip(a,b)
>>>list(zipped)
[(1, 4), (2, 5), (3, 6)]
>>>a = [1,2,3]
>>>b = [4,5,6]
>>>zipped = zip(a,b)
>>>list(zip(*zipped))#与zip相反,zipped相当于解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]
>>>a = ['name','age','sex']
>>>b = ['Dong',38,'Male']
#可以用一个语句将列表内容转换为字典
>>>c = dict(zip(a,b))
>>>c
{'age': 38, 'name': 'Dong', 'sex': 'Male'}
enumerate函数
-
描述
enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。
- Python 2.3.以上版本可用, 2.6添加start参数。
-
语法
以下是enumerate()方法的语法:
>>>enumerate( sequence, [start=0])
-
参数
sequence :一个序列、迭代器或其他支持迭代对象。
start: 下标起始位置。返回值
返回enumerate(枚举)对象。 -
举例
>>>seasons = ['Spring','Summer','Fall','Winter']
>>>list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>>seasons = ['Spring','Summer','Fall','Winter']
>>>list(enumerate(seasons,start = 1 ))#下标从1开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
reduce函数
-
描述
reduce()函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:
用传给reduce中的函数function (有两个参数)先对集合中的第1、2个元素进行操作,得到的结果再与第三个数据用function函数运算,最后得到一个结果。
注: 在Python3中, reduce()函数已经被从全局名字空间里移除了,它现在被放置在functools模块里,如果想要使用它,则需要通过引入functools模块来调用reduce() 函数:
from functools import reduce
-
语法
reduce()函数语法:
>>>reduce(function, iterable[,initializer])
- 参数
- function: 函数,有两个参数
- iterable :可迭代对象
- itilizer: 可选,初始参数
-
返回值
返回函数计算结果。 - 举例
>>>from functools import reduce
>>>def add(x, y) :
return x + y
>>>reduce (add,[1,2,3,4,5])
15
>>>from functools import reduce
>>>reduce (lambda x,y: x+y,[1,2,3,4,5])
15