浏览量: 384 次浏览

python函数

2020年2月15日 1 作者 Nie Hen

函数的定义与使用

函数的定义、形式

如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数

形式

    def 函数名():
        代码

例如:

    # 定义一个函数,能够完成打印信息的功能
    def printInfo():
        print ('------------------------------------')
        print( '         人生苦短,我用Python')
        print ('------------------------------------')

带有参数的函数
为了让一个函数更通用,即想让它计算哪两个数的和,就让它计算哪两个数的和,在定义函数的时候可以让函数接收数据,就解决了这个问题,这就是 函数的参数

更常用的是 带有参数的这种函数
一般有返回值
返回值 用return 语句

    def add2num(a, b):
        c = a+b
        return c

形参与实参
定义时小括号中的参数,用来接收参数用的,称为 “形参”
调用时小括号中的参数,用来传递给函数用的,称为 “实参”

调用函数

定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它

调用函数很简单的,通过 函数名() 即可完成调用

如 调用上面的 函数

printInfo()

调用带参数的方程

    def add2num(a, b):
        c = a+b
       return c

    print( add2num(11, 22)) #调用带有参数的函数时,需要在小括号中,传递数据

最终结果 会打印出来 33

参数与返回值的关系
函数根据有没有参数,有没有返回值可以相互组合
定义函数时,是根据实际的功能需求来设计的,所以不同开发人员编写的函数类型各不相同

函数的嵌套调用

一个函数里面又调用了另外一个函数,这就是所谓的函数嵌套调用

例:

    def testB():
        print('---- testB start----')
        print('这里是testB函数执行的代码...(省略)...')
        print('---- testB end----')


    def testA():

        print('---- testA start----')

        testB()

        print('---- testA end----')

    testA()

enter description here

如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置

函数参数

缺省参数
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入:

def printinfo( name, age = 35 ):
   # 打印任何传入的字符串
   print "Name: ", name
   print "Age ", age

# 调用printinfo函数
printinfo(name="miki" )
printinfo( age=9,name="miki" )

输出结果:
Name: miki
Age 35
Name: miki
Age 9

注意:带有默认值的参数一定要位于参数列表的最后面。

不定长参数
有时可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,声明时不会命名。

基本语法如下:

    def functionname([formal_args,] *args, **kwargs):
       "函数_文档字符串"
       function_suite
       return [expression]

加了星号(* )的变量args会存放所有未命名的变量参数,args为元组;而加 * * 的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典。

>>> 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)  # 注意传递的参数对应
a = 1
b = 2
args = (3, 4, 5)
kwargs: 
p = 8
m = 6
n = 7
>>>
>>>
>>>
>>> c = (3, 4, 5)
>>> d = {"m":6, "n":7, "p":8}
>>> fun(1, 2, *c, **d)    # 注意元组与字典的传参方式
a = 1
b = 2
args = (3, 4, 5)
kwargs: 
p = 8
m = 6
n = 7
>>>
>>>
>>>
>>> fun(1, 2, c, d) # 注意不加星号与上面的区别
a = 1
b = 2
args = ((3, 4, 5), {'p': 8, 'm': 6, 'n': 7})
kwargs:
>>>
>>>

引用传参
Python中函数参数是引用传递(注意不是值传递)。对于不可变类型,因变量不能修改,所以运算不会影响到变量自身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量。

>>> def selfAdd(a):
...     """自增"""
...     a += a
...
>>> a_int = 1
>>> a_int
1
>>> selfAdd(a_int)
>>> a_int
1
>>> a_list = [1, 2]
>>> a_list
[1, 2]
>>> selfAdd(a_list)
>>> a_list
[1, 2, 1, 2]
局部变量和全局变量

局部变量,就是在函数内部定义的变量
不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用

enter description here

如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量

enter description here

局部变量的工作范围是 一个函数内
全局变量的工作范围是函数外

global
如果想要在 函数内使用全局变量 需要声明
只需要在函数内 变量前面加上 global
enter description here

递归函数

递归函数 其实就是数学上讲的递归 也可理解为循环
递归函数 也就是值在满足条件下 在函数内调用本身函数

我们来计算阶乘 n! = 1 * 2 * 3 * … * n
解决办法1使用循环:
enter description here

解决办法1使用递归:
enter description here