文章目录
1、函数的基本使用
1.1函数的定义
函数是一段具有特定功能的、可重复的语句组,用函数名来表示并通过函数名进行功能调用。函数也可以看做是一段具有名字的子程序,可以在需要的地方调用执行,不需要在每个执行的地方重复编写这些语句。每次使用函数可以提供不同的参数作为输入,以实现对不同数据的处理;函数执行后,还可以反馈相应的处理结果。
使用函数主要有两个目的:降低编程难度和代码重用。函数是一种功能抽象,利用它可以&讲一个复杂的大问题分解成一系列简单的小问题,然后将小问题继续划分成更小的问题,当问题细化到足够简单时,就可以分而治之,为每个小问题编写程序,并通过函数封装,当各个小问题都解决了,大问题也就迎刃而解了。函数可以在一个程序中的多个位置使用,也可以用于多个程序,当需要修改代码时,,只需要在函数中修改一次,所有调用位置的功能都更新了,这种代码重用降低了代码行数和代码维护难度。
Python使用def保留字定义一个函数,语法形式如下:
def <函数名>(<参数列表>):
<函数体>
return <返回值列表>
函数名可以是任何有效的python标识符;参数列表是调用改函数是传递给它的值,可以与零个、一个或多个,当传递多个参数时各参数由逗号分隔,当没有参数时也要保留圆括号。函数定义中参数列表里面的参数是形式参数,简称为“形参”。函数体是函数每次被调用时执行的代码,由一行或多行语句组成。当需要返回值时,使用保留字return和返回值列表,否则函数可以没有return语句,在函数体结束位置将控制权返回给调用者。
函数调用和执行的一般形式如下:
<函数名>(<参数列表>)
此时,参数列表中给出要传入函数内部的参数,这类参数成为实际参数,简称为“实参”。
参数定义与传递的基本顺序:
位置参数
⟹
\Longrightarrow
⟹关键字参数
⟹
\Longrightarrow
⟹可变数量参数
1.2 函数的调用过程
程序调用一个函数需要执行以下4个步骤:
(1)调用程序在调用处暂停执行
(2)在调用时将实参复制给函数的形参
(3)执行函数体语句
(4)函数调用结束给出返回值,程序回到调用前的暂停处继续执行
1.3 lambda函数
lambda保留字用于定义一种特殊的函数——匿名函数,又称lambda函数。匿名函数并非没有名字,而是将函数名作为函数结果返回,语法格式如下:
<函数名> = lambda <参数列表> : <表达式>
lambda函数与政策函数一样,等价于下面形式:
def <函数名> (<参数类表>):
return <表达式>
简单的说,lambda函数用于定义简单的、能够在一行内表示的函数,返回一个函数类型,实例如下:
>>> f = lambda x, y : x**y
>>> f(3,4)
81
>>> def f(x,y):
z = x ** y
return z
>>> f(3,4)
81
lambda表达式只可以包含一个表达式,该表达式的计算结 果可以看作是函数的返回值,不允许包含复合语句,但在表达式中可以调用其他函数。
lambda函数应用:
谨慎使用lambda函数
- lambda函数主要用作一些特定函数或方法的参数
-lambda有一些固定使用方式,建议逐步掌握
-一般情况,建议使用def定义普通函数
2、函数的参数传递
2.1 可选参数和可变数量参数
在定义函数时,如果有些参数存在默认值,即部分参数不一定需要调用程序输入,可以在定义函数时直接为这些参数指定默认值。当函数被调用时,如果没有传入对应的参数值,则使用函数定义时的默认值替代。
由于函数调用时需要按顺序输入参数,可选参数必须定义在非可选参数的后面。
>>> def f(x, y =1):
return x+y
>>> f(1)
2
>>>f(2,8)
10
在定义时,也可以设计可变数量参数,通过在参数前增加星号(*)实现。带有星号的可变参数只能出现在参数列表的后面。
>>> def my_sum (a,b,**c):
total=a*b
for key in c:
total += c[key]
return total
>>> my_sum(3,1,rice=3,watermelon=10)
16
2.2 参数的位置和名称传递
函数调用时,实参默认采用按照位置顺序的方式传递给函数,例如2.1中 f(2,8)中第一个实参默认赋值给形参x,第二个实参赋值给形参y。这种按照位置传递参数的方法固然很好 ,但当参数很多时,这种调用参数的方式可读性较差。
为了解决可读性差的问题,Python提供了按照形参名称输入实参的方式,此时函数调用如下: f(x=2, y=8)
由于调用函数是制定了参数名称,所以参数之间的顺序可以任意调整。
2.3 函数的返回值
return语句用来退出函数并将程序返回到函数别调用的位置继续执行。return语句可以同时将0个、1个或多个函数运算后的结果返回给函数别调用处的变量
函数可以没有return,此时函数并不返回值,函数也可以用return返回多个值,多个值以元组类型保存。
3、 定义好的全局函数 filter,map,reduce,zip,enumerate
3.1 map 函数
描述:
map()函数会根据提供的函数对指定序列做映射。
第一个参数function以参数序列中的每一个元素调用function函数,返回包含每次function返回值的新列表。
语法:
map(function, interable, ... )
function——函数
iterable——一个或多个序列
返回值:
Python 2.x 返回列表
Python 3.x 返回迭代器
实列如下:
>>> map(lambda x: x**2,[1,2,3,4,5]) #使用lambda匿名函数
<map at 0x22f3c8616a0>
>>> x,y,z=map(str,range(3))
>>> y
'1'
>>> list(map(square,[1,2,3,4,5])) #要想显示出来,直接转换为想要的格式
[1, 4, 9, 16, 25]
>>> def add(x,y,z):
return x+y+z
>>> list1=[1,2,3]
>>> list2=[1,2,3,4]
>>> list3=[1,2,3,4,5]
>>> res=map(add,list1,list2,list3) # map有截断功能,当长度不一时
>>> print(list(res))
[3, 6, 9]
3.2 filter函数
描述
filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件的元素组成的新序列。
该函数接受两个参数,第一个为函数,第二个为序列,序列的每一个元素作为参数传递给函数进行判断,然后返回True或False,最后将返回True的元素放到新列表中。
语法
filter(function , interable )
function——判断函数
iterable——可迭代对象
返回值
Python 2.x 返回列表
Python 3.x 返回迭代器
实例如下:
>>> def is_odd(x):
return x%2 == 1
>>> newlist = filter(is_odd, [1,2,3,4,5,6,7,8,9,10])
>>>print(newlist)
<filter object at 0x0000026D0ED2E0B8>
>>> seq = ['foo', 'x41', '?!', '***']
>>> def func(x): return x.isalnum() #测试是否为字母或数字
>>> filter(func, seq) #返回filter对象
<filter object at 0x000000000305D898>
>>> list(filter(func, seq)) #把filter对象转换为列 表
['foo', 'x41']
3.3 reduce 函数
在Python 3中,reduce()函数已经被从全局名字空间里移除了,它现在被放置在functools模块里,如果想要使用它,则需要引入functools模块来调用reduce()函数:
from functools import reduce
描述:
reduce()函数会对参数列表中的元素进行积累
函数将一个数据集合(链表、元组等)中的所有数据进行下列操作:用传给 reduce 中函数 function (有两个参数)先对集合中的第1,2个元素进行操作,得到的结果再与第三个数据 function 函数进行运算,最后得到一个结果。
语法:
reduce(function, iterable[, initializer])
function——函数,有两个参数
iterable——可迭代对象
initializer——可选,初始参数
返回值:
返回函数计算结果
实例如下:
>>> def add(x,y)
return x+y
>>> reduce(add,[1,2,3,4,5])
15
>>> reduce(add,range(1,101))
5050
3.4 zip函数
描述:
zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一样,则返回列表长度与最短的对象相同,利用星号(*)操作符,可以将元组解压为列表。
语法:
zip([iterable,...])
iterable——一个或多个迭代器
返回值
返回元组列表
实例如下:
>>> # zip(整合),list转换后返回元组列表
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> c=[7,8,9,10]
>>> list(zip(a,b,c))# 自动剪切
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> zipped=zip(a,b)
>>> list(zip(*zipped))# 利用星号'*'操作,可以将元组转换为列表
>>> # zipped 可以理解为解压
[(1, 2, 3), (4, 5, 6)]
3.5 enumerate函数
描述:
enumerate()函数用于将一个可遍历的数据对象(如列表、元组和字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。
语法:
enumerate(sequence,[star = 0])
sequence——一个序列、迭代器或其他支持迭代对象
start——下标起始位置
返回值
返回enumerate(枚举)对象
实例如下:
>>> seasons = ['Spring', 'Summer', 'autumn', 'winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'autumn'), (3, 'winter')]
>>> list(enumerate(seasons,start = 1))
[(1, 'Spring'), (2, 'Summer'), (3, 'autumn'), (4, 'winter')]