1.编写函数应该注意六点
(1)def 函数名() //定义函数
(2)def 函数名(参数) //可以往进传参
(3)函数应该有返回值,用return来返回,如果不写return,默认返回none
(4)函数名()这是调用,不写括号是引用,调用相当于执行一遍函数
(5)要输出函数的返回值,需要使用print,而不是和交互解释器一样直接调用就会有输出
(6)前向引用,函数不允许在函数未声明之前对其进行引用或调用
2.传递参数应该注意四点
(1)参数有实参和形参两种,实参就是实际使用的具体值,形参就是变量
(2)函数接收几个参数,就往进传几个参数,否则会报错
(3)可以预先传递某一个参数,如果不往进传递新的参数,就使用这个参数,可以理解为默认参数。
(4)sys.argv[0]是脚本名,sys.argv[1]是第一个位置参数,以此类推
脚本:用函数来实现斐波那契数列,用户指定输出几位就输出几位
#!/usr/bin/env python import sys //导入sys模块 def fibs(num): //定义一个函数 fibs = [0, 1] //定义一个初始的列表 for i in range(num - 2): //循环 fibs.append(fibs[-1] + fibs[-2]) //将最后两项的值相加并追加进列表 return fibs //返回fibs num = int(sys.argv[1]) //将位置参数的字符串型转变为整型 print fibs(num) //调用函数
3.关键字参数
(1)关键字参数的概念仅仅针对函数的调用
(2)这种理念是让调用者通过函数调用中的参数名字来区分参数
(3)这样规范允许参数缺失或者不按顺序
>>> def get_info(name, age): ... print "%s is %s years old" % (name, age) ... >>> get_info("bob", 20) //一一对应可以正确传参 bob is 20 years old >>> get_info(20, "bob") 20 is bob years old >>> get_info(age=20, name="bob") //写上关键字就可以不按顺序传参 bob is 20 years old >>> get_info(age=20, "bob") //有多个关键字,无序传参时,不可以只传一个关键字 File "<stdin>", line 1 否则会报错 SyntaxError: non-keyword arg after keyword arg >>> get_info(20, name="bob") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: get_info() got multiple values for keyword argument 'name' >>> get_info("bob", age=20) //顺序传参时,可以不写全关键字 bob is 20 years old
4.参数组
(1)python允许程序员执行一个没有显式定义参数的函数
(2)相应的方法是通过一个把元组(非关键字参数)或字典(关键字参数)作为参数组传递给函数
(3)调用的时候加*表示把元组解开了,定义的时候加*号表示有多个值,如案例四
脚本:
案例一: #!/usr/bin/env python def func1(*args): //写一个*,存放的是元组 print args func1(10) func1(10,20) func1(10,20,"abc") [root@pythion python]# python fun1.py (10,) (10, 20) (10, 20, 'abc') 案例二: #!/usr/bin/env python def func2(**args): //写两个*,存放的是字典 print args func2() func2(name="bob") func2(name="lucy",age=20) [root@pythion python]# python fun1.py {} {'name': 'bob'} {'age': 20, 'name': 'lucy'} 案例三: #!/usr/bin/env python def func3(name,*args,**kw_args): //第一个参数,只有一个值,第二个参数有很多值,但是是元 print name 组类型的,但三个参数有很多值,字典类型的 print args print kw_args func3("bob","lucy", 10, 20 ,20, qq="123456", em="linux@11.com") [root@pythion python]# python fun1.py bob ('lucy',10, 20, 20) {'qq': '123456', 'em': 'linux@11.com'} 案例四: >>> import operator >>> num = [0, 30] >>> operator.add(num) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: op_add expected 2 arguments, got 1 >>> operator.add(*num) //加*号表示把列表解开传进去 30