python函数思维导图:
![](https://i-blog.csdnimg.cn/blog_migrate/d7c89440f91976159ffa0c9425c34a2d.jpeg)
函数是对特定功能模块的封装,利于代码的整洁和复用。python函数的定义和使用较为简单,具体如下:
1.定义和使用
def foo()://定义函数,foo为函数名,(arg1,arg2,....)为参数列表
print('a function')//函数体
foo() //函数调用
有返回值的函数定义:
def foo(a,b):
return a+b//使用return关键字返回
foo(10,20)
返回多个值:
def foo(a,b):
return a,b//返回多个值,用逗号隔开
type(foo(1,2)) //返回的是元组类型
使用yield关键字返回函数值:
def foo(a):
for x in range(1,a):
yield x
x+=1
f=foo(5)//返回的是迭代器,通过next(f)调用
next(f)//1
next(f)//2
next(f)//3
next(f)//4
next(f)//报错,已经跌代完
def foo(a,b,*args):
print(a,b)
# print(type(args)) #<class 'tuple'>
print(sum(args))
foo(1,2,3)
foo(1,2,3,5,6)
l1=[1,2,3]
# l1=(1,2,3)
foo(*l1)
foo(1,2,*t1)
yield关键字的逻辑:函数执行时,遇到yield就返回,下次调用next(f)时,从上次yield语句的下一句开始执行。
2.参数传递
通常情况下,函数定义时,参数个数是确定的,但是有时函数需要接受变长的参数,这个时候可以使用python的不定长参数来处理。python参数分为位置参数和关键字参数,具体如下:
一个位置参数的例子:
def foo(a,b,*args):
print(a,b)
# print(type(args)) #<class 'tuple'>
print(sum(args))
foo(1,2,3,5,6)
l1=[1,2,3]
# l1=(1,2,3)
foo(*l1)
foo(1,2,*t1)
*args表示可以接受变长的参数,args的类型实际上是一个元组。还有一种简便的参数传递方式,就是可以先定义参数列表(或元组),再通过*l1的方式传递, 如上的foo(*l1),foo(1,2,*t1)。另外,参数定义时,可以赋值默认值,调用时不传递该参数值则使用默认值:
def foo(a,b=5):
print(a,b)
foo(8)//8,5
关键字参数的例子:
def foo(a,year='2018年',**kwargs):
print(a+year+"各个班级成绩:")
for k,v in kwargs.items():
print(k,v)
foo('清华大学',计算机科学与技术=95,信息工程=97,管理学院=89)
# dict={'计算机科学与技术':95,'信息工程':97,'管理学院':89}
# foo('清华大学',**dict)
此处不做另外说明,用法和上类似,注意在使用字典作为参数时,单引号不能丢。
关于参数传递:
a='python'
l1=['c','.net']
def foo(arg):
a='java'
l1.append('c#')
print('>>>>',a)
print('>>>>',l1)
foo(a)
print('>>>>',a)
print('>>>>',l1)
从上述可以看出a在函数调用之后值没有发生改变,但是l1却发生了改变。a是基于值传递不会改变参数本身,而l1则是基于指针引用的传递,会改变参数本身。
3.偏函数
import functools
mymax=functools.partial(max,100)//100是固定的
mymax(20)//调用
如上所述,偏函数是在参数定义时,固定部分参数的函数。
4.高阶函数
高阶函数中的参数是一个函数,即函数名作为参数传递给另外一个函数。eg:
def mysum(data,funct)://funct是另一个函数名称
return funct(data)
mysum([1,2,3,4],max)//调用
有一些内置的比较常用的高阶函数:比如map,reduce,filter等。具体用法如下:
from functools import reduce
l1=[1,2,3,4,5,6,2,3,3,6]
list(map(lambda x:(x,l1.count(x)),l1 ))
list(filter(lambda x:True if x>4 else False,l1))
reduce(lambda x,y:x+y,l1)
5.匿名函数
foo=lambda x,y:x+y//匿名函数的定义,不用return
foo(1,2)
匿名函数通常用在高阶函数的定义上。
6.回调和闭包
一个闭包的例子:
def foo(arg):
def foo1():
return max(arg)
return foo1
foo([1,2,3,4,5,6])()
foo中的foo1函数没有参数,但是其可以访问foo的参数,可以记住其外部变量的作用域。
一个回调的例子:
def callback():
return max
callback()(10,20)
容易理解,不做详解。
python关于函数的基础内容大致就这些,本文只是一个扫盲,细节还需查阅官方文档。