一、创建一个函数
关键字def,函数名后面必须加()括号
>>> def MyFirstFunction():
print('这是我创建的第一个函数')
>>> MyFirstFunction()
这是我创建的第一个函数
Python中函数的使用规范和C/C++没有太大区别。也是先声明后使用。
函数的返回值,直接在函数中用return就可以。
二、形参和实参
类C/C++
三、说明文档
每一个函数都应该有良好的注释习惯。写好说明文档是必备的,可以用内置的函数的__doc__属性查看说明文档。如下:
def MyFirstFunction(name):
'函数定义过程中的name是叫形参'
#因为他只是一个形式,表示占据一个参数位置
print("传递进来的" + name + "叫做实参,因为他是具体的参数值")
MyFirstFunction("小明")
print(MyFirstFunction.__doc__)
代码中带引号括起来的地方就是说明文档,#号后面的是注释文档,不会保存在__doc__属性中。
用help(MyFirstFunction)也可以查看说明文档。
四、关键字参数
关键字参数是为了防止多个参数时,顺序难以记忆容易出错的问题。
>>> def SaySome(name,words):
print(name+'->'+words)
>>> SaySome('小甲鱼','让编程改变世界!')
小甲鱼->让编程改变世界!
>>> SaySome('让编程改变世界!','小甲鱼')
让编程改变世界!->小甲鱼
>>> SaySome(words='让编程改变世界!',name='小甲鱼')
小甲鱼->让编程改变世界!
可以用参数名=参数的样子来指定。
五、默认参数
>>> def SaySome(name='小甲鱼',words='让编程改变世界!'):
print(name+'->'+words)
>>> SaySome()
小甲鱼->让编程改变世界!
>>> SaySome('小明')
小明->让编程改变世界!
当函数存在默认参数时,如果使用者不指定参数将使用默认参数。
六、收集参数(可变参数)
用*来表示参数,如def test(*params),这样不指定参数的个数。可以由任意个参数。实际是将参数打包,传入了一个元组。效果如下:
>>> def test(*params):
print('参数的长度是:',len(params))
print('第二个参数是:',params[1])
>>> test(1,'a',2.1,[1,2,3])
参数的长度是: 4
第二个参数是: a
如果除了收集参数,还有一个参数 def test(*params,name),则使用第二个参数时一定要指定参数,否则会默认都赋给收集参数。
七、函数与过程
函数是有返回值的,过程不会返回任何值。即使是空函数也会返回一个None。只是不显现。
Python可以用列表返回多个值。也可以直接用逗号隔开,返回一个元组。
八、函数变量的作用域
局部变量和全局变量。在函数内部直接更改全局变量的话是无法实现的,函数内部会产生一个和全局变量一样名称的变量覆盖全局变量,全局变量并没有修改。但是全局变量在函数中也是可以正常使用的,但不能直接更改。
在函数内部用global声明一下全局变量,就可以更改全局变量的值。
九、内嵌函数
允许在一个函数内部创建另一个函数。
>>> def fun1():
print('fun1()正在被调用...')
def fun2():
print('fun2()正在被调用...')
fun2()
>>> fun1()
fun1()正在被调用...
fun2()正在被调用...
fun2函数的所有定义都是在fun1中定义的,只能在fun1中调用,不能在外部调用。
十、闭包
如果在一个内部函数里,对外部作用域(但不是在全局作用域的)的变量进行引用,那么内部函数就会被认为是闭包。如下:
>>> def FunX(x):
def FunY(y):
return x*y
return FunY
>>> i=FunX(8)
>>> i
<function FunX.<locals>.FunY at 0x000001715C59CD30>
>>> type(i)
<class 'function'>
>>> i(5)
40
FunY是内部函数,他使用了外部函数FunX的变量。所以FunY就是闭包的。在程序中i得到的是FunX返回的函数FunY等同于FunY。
也可以直接用FunX(8)(5)调用,直接返回40
注意,在内部函数中使用外部函数的变量要注意,如下,更改时会报错(引用没问题,不能更改),类似于全局变量和局部变量
def Fun1():
x=5
def Fun2():
x*=x
return x
return Fun2()
print(Fun1())
为了解决问题可以使用列表类型或者在内部函数中使用nonlocal关键字声明x
十一、匿名函数
lambda关键字创建匿名函数。
>>> lambda x:2*x+1
<function <lambda> at 0x00000224907B30D0>
>>> g=lambda x:2*x+1
>>> g(5)
11
在程序中,冒号前是变量,冒号后是函数表达式。函数是没有名字的,所以叫做匿名函数,所以给函数起一个名字g,用g(5)便可调用函数。
lambda表达式的作用:
Python写一些执行脚本时,使用lambda就可以省下定义函数过程,比如说我们只是需要写个简单的脚本来管理服务器时间,我们就不需要专门定义一个函数然后再写调用,使用lambda就可以使得代码更加精简。
对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候给函数起个名字也是比较头疼的问题,使用lambda就不需要考虑命名的问题了。
简化代码的可读性,由于普通的函数阅读经常要跳到开头def定义部分,使用lambda函数可以省去这样的步骤。
十二、两个内置函数filter和map
(一)filter()过滤器
filter会筛选出值为True的数据。filter的第一个参数为函数,第二个参数为序列,会将序列中的每一个参数代入函数中,保留下返回值为True的值组成新的列表,如下:
>>> filter(None,[1,0,False,True])
<filter object at 0x00000224907A7910>
>>> list(filter(None,[1,0,False,True]))
[1, True]
可以结合lambda写出简洁的代码:
>>> def odd(x):
return x%2
>>> temp=range(10)
>>> show=filter(odd,temp)
>>> list(show)
[1, 3, 5, 7, 9]
>>> list(filter(lambda x:x%2,range(10)))
[1, 3, 5, 7, 9]
(二)map()映射
map的参数也是第一个为函数,第二个为可迭代列表。将序列的每一个元素作为函数的参数进行运算加工直到可迭代的序列每个元素都加工完毕,返回一个新的序列。
>>> list(map(lambda x:x*2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> list(map(lambda x,y:x*2+y,range(10),range(10)))
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]