您的位置:首页 > 编程语言 > Python开发

python基础知识梳理之函数

2018-05-05 08:34 344 查看

一 复习C函数概念:

    对于面向过程的语言,函数是其进行代码运行的主体,譬如C语言。在面向对象的语言之中,函数称为方法。我们可以把函数想象成工厂,函数的参数为工厂未加工的原料,而得到的返回值为该函数运算回来的结果。上面简述了一下函数的作用。下面我们来讨论在python中我们怎么定义一个函数。

   在python中用def关键字来定义一个函数。可以有参数也可以没有参数,在这里需要注意的是python是用tab来识别程序,所以在我们定义函数之后要注意缩进。在python中省略了返回值的类型,大大缩减了我们的开发时间。

二 函数深入刨析:

    我们都知道python的解释器是用C实现的,那么在C语言里,函数的名实际上是一个地址。学过汇编的同学可能会更加了解,在我们语言的底层,每一个函数为一个跳转的入口。所以你说函数是一个地址,是正确的。那么从内存角度来分析,内存的代码段就是存函数名的地方。而形参存放在栈里。在这里再深入一些。函数指针实际上是一个变量指向了某个函数的名。譬如,

int (*fun)(int ,int),我们定义了一个函数指针fun,我们给他赋值。fun = fun_test; 那么问题来了,我们在实际调用之中怎么办?该调用哪个函数呢。答案显而易见,我们应该调用fun。我之前就犯过这样的错误。这里说明两点。在我们给函数指针赋值的时候,函数的名是地址,是一个常量。我们无法去调用一个常量。我们定义函数指针的目的就是通过该变量去调用函数来实现功能。那么函数指针的作用在哪呢?

三 函数指针的作用:

    我们再提起指针的时候,我们不去管他是几级的指针,它的本质都是一个变量,一个存取地址的变量。不得不说,程序的先驱者们的智慧真的强大。那么在linux系统中常常用到一种数据结构,就是结构体封装函数指针。我们试想一下,操作系统的复杂程度岂是一堆函数就可以实现的?所以在C语言里常常用结构体封装函数指针来模拟类。类在描述一种特定功能时的强大是无可比拟的。这里强调两点,是模拟。因为结构体是封装不了函数的,但是结构体可以封装变量。我们在定义完这种数据结构之后,对每一个函数指针进行函数的赋值,就可以达到类的初步效果。在linux 中无论是驱动得编写和应用层代码得编写。都可使用类似得架构。在许多公司开发得平台中,只要是C语言作为主语言。一般都会有指定相应字符串来调用函数。这个功能就是用函数指针实现的。那么在工业仪器仪表中,SCPI协议得架构就是如此。

四 python中的函数:

    上面我们说过了,用def来定义函数。不用指定返回值相应的数据类型。返回用return 关键字即可。和C的很像但是灵活度大大提升。

五 关于多值返回:

    在C中如果返回多个参数的话,一般视情况而定,一般存在数组中,或者返回一个相应数据结构的索引地址。但是在python中呢,大大增加了代码的可读性。例如:

     def measure(): """返回当前的温度""" print("开始测量...") temp = 39 wetness = 10 print("测量结束...") return (temp, wetness)上述代码的返回值用元组括起来了,这里要说一下,不用括号也行,我们需要注意的是,返回值的个数一定要和调用函数处接收变量的个数一致,不一致会抛出异常。用元组来传递安全。

六 分享一个小小技巧:

    比如现在面试官让你来交换两个数,其实交换两个数有很多种方式,但是大多的方式都是有临时变量来做。下面分享一个不用的。

                                            a =a + b

                                            b =a - b

                                            a =a - b

在python中直接就是 a,b = b,a 利用元组。所以python的语言哲学是优雅的解决一些问题。

七  函数参数知识进阶:

    想一个问题,在函数内部对形参变量 使用赋值语句,会不会影响实参变量的值。答案是不会! 这里涉及的知识点与变量部分有关,在python中分为可变类型和不可变类型。那么无论是哪种类型,我们在函数内部使用了赋值语句,就会产生新的引用。而不去是修改实参本身。还有一个就是缺省参数,就是默认参数的意思。比如我们给一个列表排序直接用list.sort()方法,我们可以看到,结果总是升序排列的。降序不可以吗?可以的,只是该函数默认参数是升序的,因为这种需求更多。我们如果想要降序排列,gum_list(reverse=True)就可以了。那么我们怎么去指定一个一个默认参数呢。

     def print_info(name, gender=True): gender_text = "男生" if not gender:     gender_text = "女生"                         print("%s 是 %s" % (name, gender_text))上述代码可以看出来,在参数后面指定值,就可以当作默认参数。那么这种默认参数需要注意以下几点:

    1 缺省参数的定义位置,如果不在参数列表的末尾是不行的

    2 如果拥有多个多值参数,那么需要指定相应的名字,这样解释器才能知道参数的对应关系。

八 多值参数:

    python` 中有 **两种** 多值参数: * 参数名前增加 **一个** `*` 可以接收 **元组** * 参数名前增加 **两个** `*` 可以接收 **字典**   * 一般在给多值参数命名时,**习惯**使用以下两个名字 * `*args` —— 存放 **元组** 参数,前面有一个 `*` * `**kwargs` —— 存放 **字典** 参数,前面有两个 `*`

`args` 是 `arguments` 的缩写,有变量的含义
`kw` 是 `keyword` 的缩写,`kwargs` 可以记忆 **键值对参数**

```python
def demo(num, *args, **kwargs):

print(num)
print(args)
print(kwargs)

demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)

```
提示:**多值参数** 的应用会经常出现在网络上一些大牛开发的框架中,知道多值参数,**有利于我们能够读懂大牛的代码**


    






阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: