python之函数

一、认识函数

概念:函数也叫方法,实现特定功能的代码段。要用的时候,只需要调用下函数名即可。

使用函数的好处:

  • 简化代码,减少重复性代码的编写,提高代码的复用性
  • 提高代码可维护性,函数功能需要修改时,只需要修改函数内部的代码,所有用到函数的地方也能及时更新

函数的定义:

#函数调用时才会被执行,调用时用函数名()
def 函数名(参数列表):
    函数体
def my(name,sex):#my是函数名,name和sex是位置参数,也叫形参
    #位置参数,必填
    print("姓名:%s"%name)
    print("性别:%s"%sex)
    #默认值参数
     #函数体
my("liuyihan","")#liiyihan,女这是调用时实际传入的参数,即实参

 1.1 return的作用

def add(a,b):
    c=a+b
    return c
def add2(a,b):
    c=a+b
    print(c)

print(add(2,3))#打印调用函数的返回值,add中有返回值
print(add2(1,2))#打印调用函数的返回值,add2中没有return时,默认返回None
运行结果:
5
3
None

在函数中,return中两个作用:

  • 结束函数,只要在函数里遇到return,函数立即结束运行
  • 返回函数处理的结果

注意:无return时,默认返回值为None

二、函数的参数类型

定义函数时的参数为形参,调用函数时实际传入的值为实参。

形参只有在函数调用时才分配内存空间,调用结束后,立即释放内存空间,所以形参只在函数体内存在。

实参可以是常量,变量,表达式,函数,函数调用时,必须传入的是具体值,把具体的数值传给形参。

2.1 位置参数(必填参数)

ef my(name,sex):#my是函数名,name和sex是位置参数,也叫形参
    print("姓名:%s"%name)
    print("性别:%s"%sex)
my("liuyihan","")#liiyihan,女这是调用时实际传入的参数,即实参
运行结果:
姓名:liuyihan
性别:女

顾名思义,根据位置来传参,有几个参数,调用时相应地传几个参数,多或少了都会报错。上述程序中,name和sex是位置参数,调用时必填。

2.2 默认参数(非必填)

def db_connect(ip,port=3306):#port=3306就是kebian默认参数
    print(ip,port)
db_connect('118.24.3.40',3307)#指定默认参数的值为3307
db_connect('118.24.3.40')#没有指定默认参数的值

就是定义函数时给某个参数给个默认值,调用时,若给默认参数传了值,就用你传入的值;不传就用默认值,不会报错。

注意:定义默认参数必须指向不变对象!

2.3 可变参数(非必填)

 可变参数用于参数比较多且不确定的情况下,定义函数时,直接写参数组*args,可以不填。

def users(name,userid,*args):
        print("姓名:%s,学号:%s"%(name,userid))
        print("其他个人信息:%s",args)
users("liuyihan",'2011212968','深圳','18','160')
#args是参数组
#可变参数都是放在一个元组里的
#不限制参数的个数
上述代码,运行结果:
姓名:liuyihan,学号:2011212968
其他个人信息:%s ('深圳', '18', '160')

2.4 关键字参数(非必填)

不限制参数的个数,通常用**args表示

def users(**kwargs):
    #1、不是必传的
    #2、不限制参数个数
    #3、传入的参数放到key-value字典里
    print(kwargs)
users()
users(name='liuyihan',sex='nv')
users(addr='北京',country='中国',c='abc',f='kkk')
运行结果:
{}
{'sex': 'nv', 'name': 'liuyihan'}
{'addr': '北京', 'c': 'abc', 'country': '中国', 'f': 'kkk'}

注意:如果四种参数一起使用,顺序是位置参数>默认参数>可变参数>关键字参数

   函数有多个返回值时,定义多个变量a,b,c=my()或者定义一个变量a=my(),多个返回值放进元组里。 

2.5 命名关键字参数(限制传入参数的类型)

   命名关键字参数需要一个特殊分隔符*,*后面的参数是命名关键字参数,即必须要传入的参数。

三、变量作用域

 

全局变量:在变量所有范围都能使用;局部变量:在一定区域内才能使用。

所有函数都能使用全局变量,只能在函数内部使用局部变量

#第一种情况,函数内部有name变量,取值时取函数内部name值
name = 'wangcan'#全局变量
def get_name():
    name='hailong'
    print(name)
get_name()
运行结果:
hailong
#第二种情况,函数内部无name变量,取值时先在函数内部找,找不到,在函数外部找,找到打印出来
name = 'wangcan'#全局变量
def get_name():
    print(name)
get_name()
运行结果:
wangcan
#第一种情况
name = 'wangcan'#全局变量
def get_name():
    name='hailong'
    print("函数内部的变量:",name)
get_name()
print("函数外部的变量:",name)
运行结果:
函数内部的变量: hailong
函数外部的变量: wangcan
#第二种情况,函数内部的值可见于函数外
name = 'wangcan'#全局变量
def get_name():
    global name#声明全局变量,在函数内部的变量值可用于全局变量
    name='hailong'
    print("函数内部的变量:",name)
get_name()
print("函数外部的变量:",name)
运行结果:
函数内部的变量: hailong
函数外部的变量: hailong

 四、递归函数

函数内部可调用函数,如果一个函数在内部调用自己,那就是递归函数。递归函数可起到循环的作用  

def test():
    num=int(input("请输入一个数字"))
    if num%2==0:
        return True#如果是偶数,就返回True,结束函数,遇到return就立即结束函数
    print("如果不是偶数,请重新输入!:")
    return test()
print(test())

五、高阶函数

一个参数是函数的函数称为:高阶函数

def srint(n):#将n转换成int类型
    return int(n)

def add(x,y,z):#三个参数,z是函数
    return(z(x)+z(y))#z函数的返回值相加

print(add(9.2,4.5,srint))#注意函数作为参数时,不需要带括号

 

posted @ 2018-09-21 21:59  Balllyh  阅读(279)  评论(0编辑  收藏  举报