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