1.1 函数定义
函数
(1)函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给他取一个名字。
(2)可以通过函数名在程序的不同地方多次执行(即,函数的调用)
(3)预定义函数,可以直接使用
(4)自定义函数,用户自己编写
(5)为社么使用函数:
① 降低编程难度
- 通常将一个复杂的大问题分解成一系列小问题,然后将小问题划分成更小的问题,当问题细化为足够简单时,就可以分而治之,各个小问题解决了,大问题就迎刃而解了。
② 代码重用
- 避免重复劳动,提升效率
定义函数:
函数的定义和调用:
1
2
|
- def 函数名([参数列表]):
//
定义
- 函数名([参数列表])
//
调用
|
函数名的命名规则:
函数名可以是以字母,数字,下划线命名的,但是不能以数字开头
函数名在定义的时候跟变量有点区别
"变量"都是定义成 小写 的;
"函数名" 如果是由两个单词组成,第二个单词首字母要大写,也就是说,如果由多个单词组成,除了开头第一个单词首字母不要大写,其余单词首字母都要大写;两个单词之间可以通过下划线连接;
"类"的命名:每个单词首字母都要大写;
要养成这样的规范习惯。
定义函数例子:
1
2
|
def
fun():
print
"hello world"
|
函数调用:
1
2
|
fun()
hello world
|
举例:
当我执行脚本的时候,提示我从键盘读取输入:
结果:
1.2 函数的参数
形参和实参:
- 在定义函数的时候,函数名后面括号中的变量名称叫做“形式参数”,或者称为“形参”
- 在调用函数时,函数名后面括号中的变量名称叫做“实际参数”,或者称为“实参”
形参:
1
2
|
def
fun(x, y):
print
x
+
y
|
x , y 是2个形式参数
调用(传参):
1
2
|
fun(
2
,
3
)
5
|
举例:
判断并打印最大的数
调用
实际参数:
1
2
|
import
sys
print
sys.argv[
1
]
|
打印参数
1
2
|
python
test
.py 1 2
1
|
举例:
判断是否是数字
结果:
1.3 函数的默认参数
练习
打印系统所有的PID
要求从 /proc 读取
os.listdir()
1
2
|
import
os
os.listdir()
|
os.listdir() 帮助信息
用法:
1
|
os.listdir(
'/proc'
)
|
脚本:
1
2
3
4
5
6
7
8
9
10
11
12
|
import
sys
import
os
def
isNum(s):
for
i
in
s:
if
i
in
'0123456789'
:
pass
else
:
break
else
:
print
s
for
i
in
os.listdir(
'/proc'
):
isNum(i)
|
默认参数
缺省参数(默认参数)
1
2
|
def
fun(x, y
=
100
):
print
x, y
|
调用:
1
2
|
fun(
1
,
2
)
fun(
1
)
|
结果自然不同
举例解释:
调用的时候,实参会代替100
只有一个参数的时候,y使用默认的值
举例:
若指定参数,则
错误举例:
1
2
|
def
fun(x
=
2
, y):
print
x
+
y
|
报错:
结论:
默认参数只能在最后的形参上,不能在前面或中间,只能在最后,方向从右到左,比如有3个参数,定义默认参数可以是"最后一个参数" ,或"第二个和最后一个",或"第一和第二和第三个参数"都定义。
默认参数主要看位置
本节总结:
默认参数就是我们在调用函数的时候,如果没有给函数传值得话,会使用默认参数给函数传值
1.4 函数的变量
局部变量和全局变量
- python中的任何变量都有特定的作用域
- 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序特定部分使用的变量,称之为局部变量;
- 在一个文件顶部定义的变量可以供文件中的任何函数调用,这些可以为整个程序所使用的变量称之为全局变量。
局部变量:
1
2
3
4
|
def
fun():
x
=
100
print
x
fun()
|
全局变量:
1
2
3
4
5
6
|
x
=
"global var"
def
fun():
x
=
100
print
x
fun()
print
x
|
通过关键字声明:
在函数里面,把x声明为全局变量
1
2
3
4
5
6
|
x
=
100
def
fun():
global
x
x
+
=
1
print
x
fun()
|
同理,在函数内部将关键字声明为全局变量,当函数被调用的时候,在外部能打印出函数内部的变量:
1
2
3
4
5
6
7
8
9
|
x
=
100
def
fun():
global
x
x
+
=
1
global
y
y
=
1
fun()
print
x
print
y
|
locals 的用法(试一下):
1
2
3
4
5
6
7
8
|
x
=
100
def
fun():
x
=
1
y
=
1
print
locals
()
fun()
print
locals
()
|
链接:http://blog.csdn.net/scelong/article/details/6977867
1.5 函数的返回值
- 函数被调用后会返回一个指定的值
- 函数调用后默认返回None
- return 返回值
- 返回值可以是任意类型
- return执行后,函数终止
- return与print的区别
函数被调用后会返回一个指定值
执行脚本:
None就是函数的返回值
修改脚本:
执行脚本:
这个返回值可是任意类型,也可以返回True
1.6 多类型传值和冗余参数
多类型传值
定义函数
1
2
3
4
|
def
fun(x, y):
return
x
+
y
print
fun(
3
,
5
)
|
将一个元组传入函数
1
2
3
4
|
t
=
(
3
,
7
)
fun(
*
t)
10
#返回的函数结果
|
举例:
传入多个参数的三种形式:
错误的写法:
所以,元组不能写在前面
另外,还可以指定参数值,如下
传入的参数名字一定要和函数内形参的名字要一致,下面两种错误的方法:
'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