函数 |
什么是函数 | 函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字。 |
可以通过函数名在程序的不同地方多次执行(这通常叫做函数调用),却不需要再所有地方重复编写这些语句。 |
函数的分类 | -自定义函数(用户自己编写) |
-预定义的python函数(系统自带的一些函数,还有一些第三方编写的函数,如其它程序员编写的一些函数,对于这些现成的函数用户可以直接拿来使用) |
函数的定义: def 函数名 (函数列表) #可以没有参数 #函数名的定义和变量的定义是相同的 注意: 函数名是两个以上单词时,第二个单词的首字母需要大写 | >>> a = 10 >>> b = 20 >>> def add(): ... c=a+b ... print c ... >>> add() 30 |
函数的调用 | #/usr/bin/python def fun(): if True: print "kong" print "a" if True: fun() if fun(): print "ok" [root@zabbix tools]# python 8.py a kong kong |
函数的参数 | |
*形式参数: - 在定义函数时函数名后面圆括号中的变量名称叫做”形式参数“,简称:形参; | #~/usr/bin/python def fun(x): #x形参 print x s = raw_input("please input something") fun(s) [root@zabbix tools]# python 8.py please input something100 #100实参 100 错误传参 [root@zabbix tools]# python 8.py please input somethingd Traceback (most recent call last): File "8.py", line 5, in <module> fun() TypeError: fun() takes exactly 1 argument (0 given) #类型错误,fun()函数未传参。 #TypeError: fun() takes exactly 1 argument (2 given) 多个参数定义: #!/usr/bin/python def fun(a,b): if a == b : print "ok" else: print x, '!=' ,y x=raw_input("please number something:") y=raw_input("please number something:") fun(x,y) [root@zabbix tools]# python 9.py please number something:2 please number something:2 ok [root@zabbix tools]# python 9.py please number something:3 please number something:5 3 != 5 |
*实际参数: - 在调用函数时,函数名后面圆括号中的变量名称叫做“实际参数”,简称:实参; |
小游戏:
[root@zabbix tools]# python 9.py please something:10 please something:巧克力 正在生成一个 10 元 巧克力 口味的冰激凌! [root@zabbix tools]# cat 9.py #!/usr/bin/python #!coding:utf8 def mashine(x,y): print "正在生成一个",x,'元',y,"口味的冰激凌!" x=raw_input("please something:") y=raw_input("please something:") mashine(x,y)
#在上述的小游戏中,当用户什么都不输入的时候,这时候就需要函数的缺省参数(默认参数)。
缺省参数 |
总结:当设置默认参数时是自右向左开始的!可以通过调换顺序调整!
#!/usr/bin/python #!coding:utf8 def mashine(x,y="奶油"): print "正在生成一个",x,'元',y,"口味的冰激凌!" mashine(3) [root@zabbix tools]# python 9.py 正在生成一个 3 元 奶油 口味的冰激凌! 当然x 也可以有默认值 #!/usr/bin/python #!coding:utf8 def mashine(x=10,y="奶油"): print "正在生成一个",x,'元',y,"口味的冰激凌!" mashine() [root@zabbix tools]# python 9.py 正在生成一个 10 元 奶油 口味的冰激凌! 当传值得时候,会使用所传的参数 #!/usr/bin/python #!coding:utf8 def mashine(x=10,y="奶油"): print "正在生成一个",x,'元',y,"口味的冰激凌!" mashine(3,"巧克力")
小问题:
当参数只传一个价格的时候:
#!/usr/bin/python
#!coding:utf8
def mashine(x=10,y="奶油"):
print "正在生成一个",x,'元',y,"口味的冰激凌!"
mashine(3)
[root@zabbix tools]# python 9.py
正在生成一个 3 元 奶油 口味的冰激凌!
当传递口味的时候:
#!/usr/bin/python
#!coding:utf8
def mashine(x=10,y="奶油"):
print "正在生成一个",x,'元',y,"口味的冰激凌!"
mashine('巧克力')
[root@zabbix tools]# python 9.py
正在生成一个 巧克力 元 奶油 口味的冰激凌!
#!/usr/bin/python
#!coding:utf8
def mashine(x=10,y="奶油"):
print "正在生成一个",x,'元',y,"口味的冰激凌!"
mashine(y='巧克力')
[root@zabbix tools]# python 9.py
正在生成一个 10 元 巧克力 口味的冰激凌!
#传递形参、实参的时候都可以固定给值。
如果x值有默认参数,y没有,如下:
#!/usr/bin/python #!coding:utf8 def mashine(x=10,y): print "正在生成一个",x,'元',y,"口味的冰激凌!" mashine('巧克力') [root@zabbix tools]# python 9.py File "9.py", line 3 def mashine(x=10,y): SyntaxError: non-default argument follows default argument #报语法错误;
总结:当设置默认参数时是自右向左开始的!可以通过调换顺序调整!
#!/usr/bin/python #!coding:utf8 def mashine(x,y=10): print "正在生成一个",y,'元',x,"口味的冰激凌!" mashine('巧克力') [root@zabbix tools]# python 9.py 正在生成一个 10 元 巧克力 口味的冰激凌!
函数中的变量
| |
*局部变量 : -在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称为局部变量; | 例证: #!/usr/bin/python def fun(): a=100 print a print a [root@zabbix tools]# python 10.py Traceback (most recent call last): File "10.py", line 5, in <module> print a NameError: name 'a' is not defined 调用函数: #!/usr/bin/python def fun(): a=100 print a fun() print "#"*50 print a [root@zabbix tools]# python 10.py 100 ################################################## Traceback (most recent call last): File "10.py", line 7, in <module> print a NameError: name 'a' is not defined #表明100是由函数调用显示。 |
*全局变量;: --在一个文件顶部定义的变量可以供该文件中的任何函数调用,这些可以为整个程序所使用的变量称为全局变量; | 无 |
全局变量和局部变量重名 | #!/usr/bin/python a=10 def fun(): a=100 x=1 print x print a fun() print a [root@zabbix 123]# python c.py 1 100 10注意变量和函数的位置关系 #!/usr/bin/python a=10 def fun(): a=100 x=1 print x print a print a fun() [root@zabbix 123]# python c.py 10 1 100 |
global 语句 global 变量名 强制声明为全局变量 | 范例: #!/usr/bin/python x="my name is HIBOY" def fun(): x=100 global y y = 200 print x fun() print y #!/usr/bin/python a=10 def fun(): global a a = 100 print a print a fun() print a [root@zabbix 123]# python c.py 10 100 100 总结: 在函数之前全局变量值不变,在函数之后全局变量为函数的中全局变量的值 |
函数的返回值 | |
函数被调用后会返回一个指定的值 | |
函数调用后默认返回None | >>> def f(x,y): ... print x+y ... >>> f(2,3) 5 >>> z = f(5,6) 11 #此处只是打印 >>> print z None |
return 返回值 | >>> def fun(x,y): ... print "hello!!!" ... return x+y ... >>> fun(5,7) hello!!! 12 >>> z = fun(5,7) hello!!! >>> print z 12 |
返回值可以是任意类型 | >>> def fun(): ... return range(10) ... >>> a = fun() >>> print a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |
return执行后,函数终止 | >>> def fun(): ... print "hello" ... print "word" ... >>> fun() hello word >>> def fun(): ... return "hello" ... return "word" ... >>> fun() 'hello' |
区分返回值和打印 | >>> def f(x,y): ... if x<y: ... return -1 ... print "hello word!" ... >>> f(5,6) -1 >>> f(7,6) hello word! >>> z = f(7,6) hello word! >>> print z None |
多类型传值和传值冗余 | |
-向函数传元组和序列 *表示传值元组和序列 >>> t = ('name','kong') >>> def fun(x,y): ... print "%s : %s" %(x,y) ... >>> fun(*t) name : kong >>> print "%s %s" %('name','kong') name kong | >>> def fun(x,y): ... print x,y ... >>> fun('a',1) a 1 >>> t=('b','c') >>> fun(t) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: fun() takes exactly 2 arguments (1 given) #t是一个元组类型数据的整体,传值时值只能对应到x,y无法接受任何值 >>> fun(t,10) ('b', 'c') 10 #传值要一一对应 >>> f =('kong','123','xlo') >>> fun(*f) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: fun() takes exactly 2 arguments (3 given) |
-向函数传值字典 **表示传值字典 | >>> def fun(name="name",age="0"): ... print "name:%s" % name ... print "age:%s" % age ... >>> fun("kong",30) name:kong age:30 >>> fun("kong") name:kong age:0 字典传值 >>> d = {'age':30,'name':'mail'} >>> fun(age=30,name='mail') name:mail age:30 >>> fun(**d) name:mail age:30 >>> d['age']=31 >>> fun(**d) name:mail age:31 >>> c={'a':1,'b':2} >>> fun(**c) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: fun() got an unexpected keyword argument 'a' 多类型的传递方式 >>> fun(c['a'],c['b']) name:1 age:2 |
处理多余的实参 | >>> def f(x,*all): ... print x ... print all ... : >>> f(1) 1 () >>> f(1,2,3) 1 (2, 3) 传递默认参数 >>> f(x=4,y=10) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: f() got an unexpected keyword argument 'y' #10不是单纯传值 多类型传参 >>> def fun(x,*all,**arges): ... print x ... print all ... print arges ... **变量名定义字典 >>> fun(1) 1 () {} >>> fun(1,2,3,4,5,6) 1 (2, 3, 4, 5, 6) {} #多余的没有映射关系,所以放到元组里; >>> fun(1,2,3,4,5,6,arges=-2) 1 (2, 3, 4, 5, 6) {'arges': -2} (x给了过多的值) >>> fun(1,2,3,4,5,6,x=10,y=20,arges=30) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: fun() got multiple values for keyword argument 'x' >>> fun(1,2,3,4,5,6,y=20,arges=30) 1 (2, 3, 4, 5, 6) {'y': 20, 'arges': 30} |