一、Python函数介绍
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率,可以被用户调用。
二、Python函数定义
语法:
def functionname( parameters): #没有参数可以不写()
"函数_文档字符串" #存放函数说明
function_suite
return [expression] #没有返回值可以不加[]内容,也可以省略return
三、Python函数调用
调用函数的一般形式是:
函数名(参数表)
例:函数定义与调用
#函数定义
#-*-coding:utf-8-*-
def printstr(str):
"Printstring"
print str
return #此处可替换为return str或直接省略不写
#函数调用
printstr('Hello Python!')
运行结果如下:

四、Python函数参数
1、形式参数和实际参数
在定义函数时,函数名后面圆括号中的变量名称叫做形式参数,或简称“形参”;
在调用函数时,函数名后面圆括号中的变量名称叫做“实际参数”,或简称为“实参”。
例1:单参数
def fun(x):#x形参
print x
fun(1) #1实参
运行结果如下:

例2:多参数
def pet (x,y):
print 'I wanta',x,y
pet('black','dog')
注:形参与实参要一一对应。
2、缺省参数
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。函数取值是从左到右的。如果有实参,默认值就被覆盖。
例1:设定默认值
def pet (x='white',y='cat'):
print 'I want a',x,y
pet()
运行结果如下:

注:如果没有实参,传入默认值。如果有实参,默认值就被覆盖。
例2:两个参数,一个默认值
def pet (x,y='cat'):
print 'I want a',x,y
pet('black')
运行结果如下:

例3:将第一个参数值改为默认,第二个参数值不默认
def pet (x='white',y):
print 'I want a',x,y
pet('dog')
运行结果如下:

注:函数取值是从左到右,实际应用中可将没有默认值得置前,有默认值的置后。
例4:例3交换X,Y位置可达到效果。
def pet (y,x='white'):
print 'I want a',x,y
pet('dog')
运行结果如下:

3、多类型传值
向函数传元组和字典。
例1:传入多类型值
def f(x):
print x
f(10) #整型
f('hello') #字符串
f([1,2,3]) #列表[]
f((1,2,3)) #元组()
f({'name':'emma','age':18})#字典{}
运行结果如下:

例2:传入多类型多个值
def f(x,y):
print('My name is %s.My old is %d.')%(x,y)#格式化
f('emma',18)
运行结果如下:

例3:将元组传给函数(*)
def f(x,y):
print('My name is %s.My old is %d.')%(x,y)#格式化
t=('emma',18) #定义元组
f(*t)
运行结果如下:

例4:将字典传给函数(**)
deff(name='name',city='city'):
print "name:%s"%name
print"city:%s"%city
d={'name':'emma','city':'Beijing'}
f(**d)
运行结果如下:

例4:将字典传给函数-形参与实参不对应(**)
deff(name='name',city='city'):
print "name:%s"%name
print"city:%s"%city
d={'a':'emma','b':'Beijing'}#形参和实参名称不对应
#f(**d)#直接传参会报错
f(d['a'],d['b'])#指定键值对方式
运行结果如下:

注:形参和实参要一一对应(数量、顺序)。
4、不定长(冗余)参数处理
示例一:
def func(x,*args):
print x,args
示例二:
def func(x,*args,**kw):
print x,args,kw
例1:
def f(x,*args):
print x
print args
f(1,2,3)# args多余实参传递到args元组中
运行结果如下:

例2:
def f(x,*args,**dic):
print x
print args
print dic
f(1,2,3,y=7,z=10) #前面有个1给X赋值,这里不能再写一遍x=某值,否则会因重复赋值而报错。 作为值、元组、字典传递
运行结果如下:

注:处理映射关系用字典
五、Python函数返回值return
1.可以返回任意数据类型,默认为None
2.执行完return,函数退出
3.注意区分return和print
例1:
def fun():
return 'Hello Python'
print fun()
运行结果如下:

例2:
def fun():
return range(10)#返回列表
print fun()
运行结果如下:

例3:执行完return,函数退出
1)
def fun(x,y):
if x>y:
return 1 #条件成立返回1
print "Hello Python" #条件不成立直接打印Hello Python
fun(1,2)
运行结果如下:

2)
def fun(x,y):
if x>y:
return 1 #条件成立返回1
print "Hello Python"
print fun(2,1)
运行结果如下:

注:条件成立返回1后,函数并没有打印Hello Python,说明执行完return,函数退出了,不执行下面语句。
例4:多个return语句-逻辑关系的返回
#-*-coding:utf-8-*-
def fun (x,y):
if x>y:
return 1
elif x
return -1
else:
return 0
#print fun(1,2)#第一次执行
#print fun(2,1) #第二次执行
print fun(2,2) #第三次执行
运行结果如下:

例5:区分return和print
1)def fun (x,y):
print x+y #此处为print
a=fun(1,2)
print a
运行结果如下:

注:第一次打印x+y=3,第二次打印a的值为None(无返回值)。
2)def fun (x,y):
return x+y#此处为return
a=fun(1,2)
print a
注:函数的返回值为x+y。
运行结果如下:

六、Python变量作用域-全局变量与局部变量
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。
两种最基本的变量作用域如下:全局变量、局部变量
局部变量是函数内部定义,仅在函数内有效。
全局变量在函数外部定义,可以被其他程序段调用。
函数内部通过global可以强制定义全局变量,当函数调用时全局变量生效。
例1:区分全局变量和局部变量的作用域
a=1 #全局变量
def fun():
a=2 #局部变量
print a
fun()
print a
运行结果如下:

注:调用fun()函数,先执行函数内的打印a值(局部变量);函数外的print a打印的是全局变量。
例2:global强制定义全局变量,在函数调用时才生效
1)a=1
deffun():
a=2
global b
b=3
print a
b #没调用函数,直接打印b
运行结果如下:

注:没调用函数,直接打印b,b没有被定义。
2) a=1
deffun():
a=2
global b
b=3
print a
fun()
b #先调用函数后,再打印b
运行结果如下:

注:先调用函数后,再打印b,b=3。
七、Python匿名函数
lambda函数是一种快速单行定义函数的方法,使代码更简洁,避免了不必要的函数体定义。
func(x,y):
return x*y
与上面正常函数等价的匿名函数写法:
func=lambda x,y:x*y
注:冒号:前面是参数,可以有多个,中间用逗号隔开,后面是返回值。
例1:
def func(x,y):
return x*y
print func(2,3)
与上面函数等价的匿名函数如下:
func=lambda x,y:x*y #一行搞定
print func(2,3)
注:输出的值都是6。
例2:
1)计算累加用reduce与lambda函数示例
def add(x,y):
return x+y
print reduce(add,(1,2,3,4,5,6))
与上面函数等价的匿名函数如下:
add=reduce(lambdax,y:x+y,(1,2,3,4,5,6))
print add
注:结果输出1+2+3+4+5+6的结果即21。
2)计算阶乘用reduce与lambda函数示例
def multiply(x,y):
return x*y
print reduce(multiply,range(1,7))
multiply=reduce(lambdax,y:x*y,(1,2,3,4,5,6))
print multiply
注:结果输出1*2*3*4*5*6的结果即720。
知识点详解:python中的reduce函数
python中的reduce内建函数是一个二元操作函数,用来将一个数据集合(列表、元组等)中的所有数据进行下列操作:用传给reduce中的函数func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。reduce内建函数有两个参数,第一个参数是函数,第二个是要运算的数据。
如:
1、def add(x,y):
return x+y
print reduce(add,(1,2,3,4,5,6))
注:结果输出1+2+3+4+5+6的结果即21。
2、def multiply(x,y):
return x*y
print reduce(multiply,range(1,7))#计算6的阶乘
注:结果输出1*2*3*4*5*6的结果即720。
网友评论