python小菜的学习之路之函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxgdll/article/details/66972287

1、为什么要使用函数
函数的作用就是将相同的代码封装成一个固定模块,已达到节约代码量的目的。基本上的所有的高级语言都支持函数,python也是。
举一个简单地例子,加法求和
例子:1+2+3+…+100
如果只是单纯的计算这么一个公式的话,我们可以这么写

sum=0
for i in range(1,101):
    sum+=i

但是,如果我们是计算1到200,1到300,1到400…的值,那么这种几乎相同的代码就会被重复写若干次,此时使用函数则会节约许多的代码量。可以将这类功能封装成一个类似于以下的函数:

def sum(a,b)
    res=0
    for i in range(a,b+1):
        res+=i
    return res

2、函数的定义与调用
python的基本库及第三方库已经给我们提供了许多内置的函数,如数据类型转换函数(int()、float()、str()等等),绝对值函数abs()以及等等。
对于这类内置函数和第三方库函数,我们在调用时,需要确定是否需要加载第三方库,对于python内置的函数,我们不需要加载,直接可以调用,但是如正则表达式等第三方库函数则需要import之后,才能调用。
举个简单地例子,求任意实数的绝对值

abs(n) #n表示任意实数

除了python内置的函数和第三方库函数,在很多情况下,编程人员需要自己根据实际情况编写函数,以实现一些功能。
python中定义函数 使用关键字def,一次写出函数名,括号,括号内的参数,最后以冒号结束。python对代码格式要求十分严格,同一作用域的内容在相同缩进块内。如果有返回值则用return返回。
例子:定义个判断正负的函数num_judge为例:

def num_judge(x):
    if x==0:
        print("非正非负")
    elif x<0:
        print("负")
    else:
        print("正")

函数自己的定义的函数时,需要注意函数的参数个数,个数不对,python编译器会自动检查出来,报错,但是类型不对时,如果自己的定义的函数不够完善的话,无法检查出错误类型,但是程序依旧无法通过。如上面我们自己定义的判断正负的函数,如果传进去的不是实数,程序将无法检查出错误提示编程人员修正。
因此,可以将上面的代码修改为:

def num_judge(x):
    if not isinstance(x,(int,float)):
        raise TypeError('bad operand type')
    if x==0:
        print("非正非负")
    elif x<0:
        print("负")
    else:
        print("正")

3、函数参数
python函数定义时,灵活度较高,可以支持必选参数、默认参数、可变参数和关键字参数。
必选参数
指的是定义一个含参函数时,括号内的参数,如定义个寻找两个数较大数的函数,max(x,y)

def max(x,y):  #x,y就是必选参数
    if x>=y:
        return x
    else:
        return y

默认参数
指的是函数内一些参数的值如果不是经常改变,则可以将其设定为默认参数,但是使用默认参数需要遵循以下几点规则:
1、必选参数在前,默认参数在后
2、默认参数中。容易变化的在前,不容易变化的在后

默认参数举例,判断一个数和60,谁大?

def max(x,y=60):  #x是必选参数,y是默认参数
    if x>=y:
        return x
    else:
        return y

注意!!!
默认参数必须指向不变对象。

可变参数
python的可变参数定义,是一个十分方便且有用的用法,即传入的参数个数是可变,允许0到n个。可变参数在函数调用时自动组成为一个tuple。
以计算数字和为例,如果我们需要计算1,5,7….的和,如果我们不使用可变参数,可能会选择一个list或者tuple传进函数,这类的函数定义可能定义为:

def sum(numbers):
    res=0
    for number in numbers:
        res+=number
    return res
#调用过程如下:
sum([1,5,7])
sum([1,5,7,8,9])

如果使用可变参数,则可以将调用简化成

sum(1,5,7)
sum(1,5,7,8,9)

但此时函数定义更改为:

def sum(*numbers): #定义可变函数,只需要在函数变量前添加*
    res=0
    for number in numbers:
        res+=number
    return res

如果是list或者tuple要传进定义了可变参数的函数,怎么办?
第一种办法:
a=[1,3,5]
sum(a[0],a[1],a[2]) #十分繁琐不建议使用
第二种办法:
a=[1,3,5]
sum(a) #在list或tuple类型的变量前加 ,可以将其转化为可变参数传进去,用法常见,推荐使用

关键字参数
不命名关键字
关键字参数允许传入0个或任意个参数变量,这些关键字参数在函数内部自动组装为一个dict.
举例:存储个人信息p_info

def p_info(name,age,**k):
    print 'name:',name,'age:',age,k
#普通调用
p_info('a',12) #输出为 name:a age:12
#更多信息补充
p_info('a',12,sex='male') #输出为 name:a age:12 {'sex':'male'}
#dict信息作为参数传入
other={'sex':'male','job':'none'}
p_info('a','12',**other) #输出为 name:a age:12 {'sex':'male','job':'none'} , 函数内的k对other进行了拷贝,但对k的操作不会影响other

关键字参数主要用来扩展函数功能,如用户信息注册时,除了名字年龄等必须信息外,也可接受其他的身份信息。

命名关键字
命名关键字主要是限定传入关键字的参数
比如上面例子中,如果限定传入的参数为sex,job
则函数定义应该更改为:

def p_info(name,age,*,sex,job):#命名关键字需要特殊分割符 *
    print 'name:',name,'age:',age,'sex:',sex,'job:',job
p_info('a',12,sex='male',job'none')#输出为 name:a age:12 sex:male job:none

如果函数定义时,使用了可变参数,则不需要再使用分隔符 *

def p_info(name,age,*arg,sex,job):
    print name,age,arg,sex,job
#关键字参数必须传入参数名
p_info('a',12,sex='male',job='none') #输出 a 12 male none

以上介绍了函数中常见的几种参数类型,必选参数、默认参数、可变参数、关键字参数和命名关键字参数。在实际使用时,可以将这几种参数进行组合使用,但是需要注意的是:必选参数、默认参数、可变参数、命名关键字参数、关键字参数的顺序。

猜你喜欢

转载自blog.csdn.net/zxgdll/article/details/66972287