Python学习计划(七)
函数
一、函数的定义与调用
1、函数的定义格式:
def函数名():
代码
2、调用函数:定义了函数之后,就相当于有了一个具有某更能的代码,想要让这些代码能够执行,需要调用它
调用函数很简单的,通过 函数名() 即可完成调用
3、函数的文档说明:相当于函数的注释
Def test(a,b):
“用来完成对2个数求和”
Print("%d"%(a+b))
二、函数的一般参数
1、定义带有参数的函数:
为了让一个函数更通用,既想让它计算那两个数的和,就让它计算那两个数的和,在定义函数的时候可以让函数接收数据,就解决了这个问题,这就是函数的参数
def add2num(a,b):
c=a+b
Print ©
add2num(11,22) #调用带有参数的函数时,需要在小括号中传递数据
2、引用参数:
可变类型与不可变类型的变量分别作为函数参数时,会有什么不同吗?
python有没有类似C语言中的指针传参呢?
def selfAdd(a):
a+=a;
ma =1
selfAdd(ma)
print(ma)
list=[1,2]
selfAdd(list)
print(list)
python中函数参数是引用传递(注意不是传递)对于不可变类型,因变量不能修改,所以运算不会影响到变量自身;对于可变类型来说,函数体中的运算可能会更改传入的参数变量
3、but why?:
def selfAdd(a):
a=a+a;
ma=1
selfAdd(ma)
print(ma)
list=[1,2]
selfAdd(list)
print(list)
三、函数的返回值
1、想要在函数中把结果返回给调用者,需要在函数中使用return
def add2num(a,b):
c = a+b
return c
或者:
def add2num(a,b):
return a+b
如果一个函数返回了一个数据,那么想要用这个数据,那么就需要用变量进行保存
#定义函数
def add2num(a,b):
return a+b
#调用函数,顺便保存函数的返回值
result=add2num(100,98)
#因为result已经保存了安定的add2num的返回值,所以接下来就可以使用了
print result
注意参数的顺序!:(a=1,b=2)(b=1,a=2) (b=1,2) X
2、多个返回值:其本质返回的是多个返回值的原值
四、四种函数的类型
函数根据有没有参数,有没有返回值,可以相互结合,一共有4种
- 无参数,无返回值
- 无参数,有返回值
- 有参数,无返回值
- 有参数,有返回值
函数根据有没有参数,有没有返回值可以相互结合
定义函数时,是根据实际的功能需求来设计的,所以不同开发人员编写的函数类型各不相同
五、函数的嵌套调用
一个函里面又调用了另外一个函数,这就是所谓的函数嵌套调用
def test():
Print('---testB start---')
Print('这里是testB函数执行的代码…')
Print('---testB end---')
def testA():
Print('---testA start---')
testB()
Print('---testA end---')
testA()
六、局部变量与全局变量
1、局部变量
局部变量,就是在函数内部定义的变量
不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
局部变量的作用,为了临时保存数据需要在函数种定义变量来进行存储,这就是它的作用
2、全局变量
如果一个变量,即能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量
3、全局变量和局部变量名字相同的问题:
在函数外边定义的变量叫做全局变量
全局变量能够在所以的函数中进行访问
如果在函数中修改全局变量,那么就需要使用global进行生命,否则出错
如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,小技巧强龙不压地头蛇
4、注意,对于可变对象的全局变量而言:
在函数中不使用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据
对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量
对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可以修改全局变量
七、函数的默认参数
调用函数时,默认参数的值如果没有传入,则被认为是默认值
比如:对一个数字进行N次方运算,一般常用2,那么3,4,5怎么办?
def pow(x,n=2):
s=1;
While n>0:
n=n-1;
s=s*x;
Return s;
pow(3);
pow(3,2);
pow(3,6);
注意:
必选参数在前,默认参数在后
默认参数必须指向不可变对象
def add_end(L=[]):
lappend('END');
return L;
八、函数的不定长参数
有时可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数。
def calc(list):
sum=0;
for I in list;
sum=sum+i*I;
return sum
这样的话我们就得传入一个列表或元组。
calc([1,2,3]);
麻烦!所以:
def calc(*list):
sum=0
for I in list:
sum=sum+i*I
return sum
调用时:
calc(1,2,3)
如果已有列表或元组
list=[1,2,3]
calc(*list)
九、函数的关键字参数
关键字参数允许传入含有参数名的参数,在函数内部自动组装为一个dict
意思就是,不定长参数没有参数名!访问参数得遍历。而关键字参数也是不定长参数,只不过给每个参数起名了!所以键值对!dict!
def person(name,age,**kw)
print("name:",name,"age:",age,"other",kw)
person('Bob',15,city="xian")
extra={'city':'beijing','job':'engineer'}
person('jack',24,**extra)
十、函数的命名关键字参数
- 不定长参数需要遍历序列访问,为了方便调用参数给每个参数起名,从而诞生了关键字参数
- 关键字参数如果过多九会产生冗余,则以指定参数名限定关键字参数的个数,从而诞生命名关键字参数
- 传参时必须写参数名
- 命名关键字参数可以有默认值
Def person(name,age,*,city,job):
Print(name,age,city,job)
若有可变参数
Def person(name,age,*args,city,job):
Print(name,age,args,city,job)
注意:综合一下,看看什么结果
Def fun(a,b,*args,**kwargs):
Print("a=",a)
Print("b=",b)
Print("args=",args)
Print("kwargs:")
For key,value in kwargs.items():
Print(key,"=",value)
Fun(1,2,3,4,5,m=6,n=7,p=8)
c=(3,4,5)
d={"m":6,"n":7,"p":8}
Fun(1,2,*c,**d)
Fun(1,2,c,d)
十一、函数的递归
通过前面的学习知道一个函数可以调用其他函数。
如果一个函数在内部不调用其他的函数,而是自己本身的话,这个函数就是递归函数
Def factorial(num):
If num >= 1:
Result=num*factorial(num-1)
Else:
Result=1
Return result
a=factorial(3)
Print(a)
十二、匿名函数
首先,在python中函数名其实也是变量名!
Abs(-10) #10
f=abs
f(-10) #10
Abs=10
Abs(-10) #错误!
函数本身也可以赋值给变量,变量可以指向函数!
Def add(x,y,f):
Return f(x)+f(y)
Add(-5,6,abs)
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
lambda函数的语法只包含一个语句,如下:
Lambda [arg1[,arg2,……argn]]:expression
如下实例:
Sum=lambda arg1,aeg2:arg1+arg2
#调用sum函数
Print("value of total:"sum(10,20))
Print("value of total:"sum(20,20))
lambda函数能解收任何数量的参数但只能返回一个表达式的值
匿名函数不能之间调用print,因为lambda需要一个表达式
应用场合:函数作为参数传递
(1)自定义函数
Def fun(a,b,opt):
Print("a=",a)
Print("b=",b)
Print("result=",opt(a,b))
Fun(1,2,lambda x,y:x+y)
(2)作为内置函数的参数
Stus=[
{"name":"zhangsan","age":18}
{"name":"list","age":19}
{"name":"wangwu","age":17}
]
Stus.sort(key=lambda x:x['name'])
十三、高阶函数
1、map函数
接收两个参数,一个是函数,一个是lterable
将传入的函数一次作用到序列的每个元素,并把结果作为新的iterator
Def f(x):
Return x*x
r=map(f,[1,2,3,4,5,6,7,8,9])
List(r)
2、reduce函数
接收两个参数,一个是函数,一个是iterable
把前两个的元素的计算结合继续和序列的下一个元素做累积计算,其效果九是
Reduce(f,[x1,x2,x3,x4])=f(f(f(x1,x2),x3),x4)
例如:将[1,3,5,7,9]变成整数13579
From functools import reduce
Def fn(x,y):
Return x*10+y
Reduce(fn,[1,3,5,7,9])
3、filter函数
f把传入的函数一次作用于每个元素,然后根据返回值是true或false决定保留还是丢弃该元素
例如:删除偶数留下奇数
Def is_odd(n):
Return n%2 == 1
List(filter(is_odd,[1,2,3,4,5,6,7,8,9]))
4、sorted函数
内置排序函数
Sorted(list,key=abs)
对字符串比较默认ASCII码顺序比较
Sorted(list,key=str.lower(),reverse=True)
创作者:Eric· Charles