天天看点

复习 函数

1.1 函数定义

函数

(1)函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给他取一个名字。

(2)可以通过函数名在程序的不同地方多次执行(即,函数的调用)

(3)预定义函数,可以直接使用

(4)自定义函数,用户自己编写

(5)为社么使用函数:

         ① 降低编程难度

                - 通常将一个复杂的大问题分解成一系列小问题,然后将小问题划分成更小的问题,当问题细化为足够简单时,就可以分而治之,各个小问题解决了,大问题就迎刃而解了。

         ② 代码重用

                - 避免重复劳动,提升效率

定义函数:

函数的定义和调用:

<code>    </code><code>- def 函数名([参数列表]):        </code><code>//</code> <code>定义</code>

<code>    </code><code>- 函数名([参数列表])         </code><code>//</code> <code>调用</code>

函数名的命名规则:

    函数名可以是以字母,数字,下划线命名的,但是不能以数字开头

    函数名在定义的时候跟变量有点区别

        "变量"都是定义成 小写 的;

        "函数名" 如果是由两个单词组成,第二个单词首字母要大写,也就是说,如果由多个单词组成,除了开头第一个单词首字母不要大写,其余单词首字母都要大写;两个单词之间可以通过下划线连接;

        "类"的命名:每个单词首字母都要大写;

    要养成这样的规范习惯。

定义函数例子:

<code>def</code> <code>fun():</code>

<code>    </code><code>print</code> <code>"hello world"</code>

函数调用:

<code>fun()</code>

<code>hello world</code>

举例:

当我执行脚本的时候,提示我从键盘读取输入:

结果:

1.2 函数的参数

形参和实参:

- 在定义函数的时候,函数名后面括号中的变量名称叫做“形式参数”,或者称为“形参”

- 在调用函数时,函数名后面括号中的变量名称叫做“实际参数”,或者称为“实参”

形参:

<code>    </code><code>def</code>  <code>fun(x, y):</code>

<code>        </code><code>print</code> <code>x </code><code>+</code> <code>y</code>

x , y 是2个形式参数

调用(传参):

<code>fun(</code><code>2</code><code>, </code><code>3</code><code>)</code>

<code>5</code>

判断并打印最大的数

调用

实际参数:

<code>import</code> <code>sys</code>

<code>print</code> <code>sys.argv[</code><code>1</code><code>]</code>

打印参数

<code>python </code><code>test</code><code>.py 1 2</code>

<code>1</code>

判断是否是数字

1.3 函数的默认参数

练习

打印系统所有的PID

    要求从 /proc 读取

    os.listdir()

<code>import</code> <code>os </code>

<code>os.listdir()</code>

os.listdir() 帮助信息

用法:

<code>os.listdir(</code><code>'/proc'</code><code>)</code>

脚本:

<code>import</code> <code>os</code>

<code>def</code> <code>isNum(s):</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>s:</code>

<code>        </code><code>if</code> <code>i </code><code>in</code> <code>'0123456789'</code><code>:</code>

<code>            </code><code>pass</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>break</code>

<code>    </code><code>else</code><code>:</code>

<code>            </code><code>print</code> <code>s</code>

<code>for</code> <code>i </code><code>in</code> <code>os.listdir(</code><code>'/proc'</code><code>):</code>

<code>    </code><code>isNum(i)</code>

默认参数

缺省参数(默认参数)

<code>def</code> <code>fun(x, y </code><code>=</code> <code>100</code><code>):</code>

<code>    </code><code>print</code> <code>x, y</code>

调用:

<code>fun(</code><code>1</code><code>, </code><code>2</code><code>)</code>

<code>fun(</code><code>1</code><code>)</code>

结果自然不同

举例解释:

调用的时候,实参会代替100

只有一个参数的时候,y使用默认的值

若指定参数,则

错误举例:

<code>def</code> <code>fun(x</code><code>=</code><code>2</code><code>, y):</code>

<code>    </code><code>print</code> <code>x </code><code>+</code> <code>y</code>

报错:

结论:

    默认参数只能在最后的形参上,不能在前面或中间,只能在最后,方向从右到左,比如有3个参数,定义默认参数可以是"最后一个参数" ,或"第二个和最后一个",或"第一和第二和第三个参数"都定义。

默认参数主要看位置

本节总结:

默认参数就是我们在调用函数的时候,如果没有给函数传值得话,会使用默认参数给函数传值

1.4 函数的变量

局部变量和全局变量

- python中的任何变量都有特定的作用域

- 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序特定部分使用的变量,称之为局部变量;

- 在一个文件顶部定义的变量可以供文件中的任何函数调用,这些可以为整个程序所使用的变量称之为全局变量。

局部变量:

<code>    </code><code>x </code><code>=</code> <code>100</code> 

<code>    </code><code>print</code> <code>x</code>

全局变量:

<code>x </code><code>=</code> <code>"global var"</code>

<code>    </code><code>x </code><code>=</code> <code>100</code>

<code>print</code> <code>x</code>

通过关键字声明:

在函数里面,把x声明为全局变量

<code>x </code><code>=</code> <code>100</code>

<code>    </code><code>global</code> <code>x</code>

<code>    </code><code>x </code><code>+</code><code>=</code> <code>1</code>

同理,在函数内部将关键字声明为全局变量,当函数被调用的时候,在外部能打印出函数内部的变量:

<code>    </code><code>global</code> <code>y</code>

<code>    </code><code>y </code><code>=</code> <code>1</code>

<code>print</code> <code>y</code>

locals 的用法(试一下):

<code>    </code><code>x </code><code>=</code> <code>1</code>

<code>    </code><code>print</code> <code>locals</code><code>()</code>

<code>    </code> 

<code>print</code> <code>locals</code><code>()</code>

1.5 函数的返回值

- 函数被调用后会返回一个指定的值

- 函数调用后默认返回None

- return 返回值

- 返回值可以是任意类型

- return执行后,函数终止

- return与print的区别

函数被调用后会返回一个指定值

执行脚本:

None就是函数的返回值

修改脚本:

这个返回值可是任意类型,也可以返回True

1.6 多类型传值和冗余参数

多类型传值

定义函数

<code>def</code> <code>fun(x, y):</code>

<code>    </code><code>return</code> <code>x </code><code>+</code> <code>y</code>

<code>print</code> <code>fun(</code><code>3</code><code>, </code><code>5</code><code>)</code>

将一个元组传入函数

<code>t </code><code>=</code> <code>(</code><code>3</code><code>, </code><code>7</code><code>)</code>

<code>fun(</code><code>*</code><code>t)</code>

<code>10</code>  <code>#返回的函数结果</code>

传入多个参数的三种形式:

错误的写法:

所以,元组不能写在前面

另外,还可以指定参数值,如下

传入的参数名字一定要和函数内形参的名字要一致,下面两种错误的方法:

'x'被函数当成了一个字符串变量

a,b,c 报类型错误,与函数的形参不一致,函数不知道这三个新导入的参里面是什么

名字一定要和形参一致。

函数传入字典的方法

把字典作为参数传入函数

同理,定义的字典里面的 key 也要和函数里面的形参一致

定义的字典里面的key,要加引号,比如 'x':1,否则,不加引号字典会把x定义为变量,定义字典会报错。

总结:

可以向函数内部传入元组和字典,可以把元组里面的元素作为参数传给函数,也可以把字典里面的value作为参数传给函数,但是定义字典的时候字典的key一定要和函数的形参一致。

冗余参数

定义函数的时候,函数有3个参数,调用函数的时候,只能给传3个参数,不能传多,也不能传少

有时候,我们要让函数接收多一些的参数,但是传的时候可能只传了少数几个,或者传入更多参数。

def  fun(x, y=1, *args, **kwargs)

解释:

x 叫默认参数(命名参数)

y=1 叫关键字参数

*args 和 **kwargs 叫 可变参数(或者冗余参数)

传入一个参数,返回

再传入一个参数,返回

2被认为是冗余参数,并且是以元组的形式往里传。

传入字符串、列表传入进去,都会存入元组里:

再传入一个参数 y=2:

返回的是字典,可以多传入几个:

多类型传值里面我们定义了元组类型的变量 t,我们把他作为参数传入函数

同理,字典也可以以参数形式传入函数或者 a=3这种形式:

1.7 函数的递归调用

递归就是在函数内部调用他自己

通常用递归去调用阶乘

最基本的阶乘:就是循环方式实现阶乘

举例1:

举例2:

下面使用递归的方式实现阶乘:

首先,递归的注意事项:

所谓"默认结果" 就是当参数等于0的时候,返回1

形象一点:

上图 f(0) 的时候,结果就是1

本文转自 听丶飞鸟说 51CTO博客,原文链接:http://blog.51cto.com/286577399/2046625

继续阅读