标签:python
python 学习 函数
-函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字。
-可以通过函数名在程序的不同地方多次执行(这通常叫做函数调用),却不需要再所有地方重复编写这些语句。
-自定义函数(用户自己编写)
-预定义的python函数(系统自带的一些函数,还有一些第三方编写的函数,如其它程序员编写的一些函数,对于这些现成的函数用户可以直接拿来使用)
*函数的定义和调用
def 函数名 (函数列表):
#可以没有参数
#函数名的定义和变量的定义是相同的
#函数名是两个以上单词时,第二个单词的首字母需要大写
>>> a = 10 >>> b = 20 >>> def add(): ... c=a+b ... print c ... >>> add() 30 >>> #实现代码的重复使用
范例: [root@zabbix tools]# cat 8.py #/usr/bin/python def fun(): if True: print "kong" [root@zabbix tools]# python 8.py #单纯的函数定义,但是没有调用,所以没有任何效果。 [root@zabbix tools]# python 8.py a kong kong [root@zabbix tools]# cat 8.py #/usr/bin/python def fun(): if True: print "kong" print "a" if True: fun() if fun(): print "ok" [root@zabbix tools]#
*函数的参数
*形式参数和实际参数
- 在定义函数时函数名后面圆括号中的变量名称叫做”形式参数“,简称:形参;
- 在调用函数时,函数名后面圆括号中的变量名称叫做“实际参数”,简称:实参;
范例:
[root@zabbix tools]# python 8.py please input something100 100 [root@zabbix tools]# cat 8.py #~/usr/bin/python def fun(x): print x s = raw_input("please input something") fun(s) [root@zabbix tools]# #注意数量要保持一致。 [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)http://blog.51cto.com/user_index.php?action=addblog_new&did=137895 #类型错误,fun()函数未传参。 [root@zabbix tools]# cat 8.py #~/usr/bin/python def fun(x): print x s = raw_input("please input something") fun() #TypeError: fun() takes exactly 1 argument (2 given) 多传参报错。
多个参数定义范例: [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]# cat 9.py #!/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 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)
在上述的小游戏中,当用户什么都不输入的时候,这时候就需要函数的缺省参数(默认参数)。
如下:
[root@zabbix tools]# python 9.py 正在生成一个 3 元 奶油 口味的冰激凌! [root@zabbix tools]# cat 9.py #!/usr/bin/python #!coding:utf8 def mashine(x,y="奶油"): print "正在生成一个",x,‘元‘,y,"口味的冰激凌!" mashine(3) #当然x 也可以有默认值 [root@zabbix tools]# cat 9.py #!/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,"巧克力")
小问题:
当参数只传一个价格的时候:
[root@zabbix tools]# python 9.py 正在生成一个 3 元 奶油 口味的冰激凌! [root@zabbix tools]# cat 9.py #!/usr/bin/python #!coding:utf8 def mashine(x=10,y="奶油"): print "正在生成一个",x,‘元‘,y,"口味的冰激凌!" mashine(3)
当传递口味的时候:
[root@zabbix tools]# cat 9.py #!/usr/bin/python #!coding:utf8 def mashine(x=10,y="奶油"): print "正在生成一个",x,‘元‘,y,"口味的冰激凌!" #x=raw_input("please something:") #y=raw_input("please something:") mashine(‘巧克力‘) [root@zabbix tools]# python 9.py 正在生成一个 巧克力 元 奶油 口味的冰激凌! #传递形参、实参的时候都可以固定给值。 [root@zabbix tools]# python 9.py 正在生成一个 10 元 巧克力 口味的冰激凌! [root@zabbix tools]# cat 9.py #!/usr/bin/python #!coding:utf8 def mashine(x=10,y="奶油"): print "正在生成一个",x,‘元‘,y,"口味的冰激凌!" mashine(y=‘巧克力‘)
如果x值有默认参数,y没有,如下:
[root@zabbix tools]# cat 9.py #!/usr/bin/python #!coding:utf8 def mashine(x=10,y): print "正在生成一个",x,‘元‘,y,"口味的冰激凌!" #x=raw_input("please something:") #y=raw_input("please something:") mashine(‘巧克力‘) [root@zabbix tools]# python 9.py File "9.py", line 3 def mashine(x=10,y): SyntaxError: non-default argument follows default argument #报语法错误;
总结:当设置默认参数时时自右向左开始的!可以通过调换顺序调整!
[root@zabbix tools]# python 9.py 正在生成一个 10 元 巧克力 口味的冰激凌! [root@zabbix tools]# cat 9.py #!/usr/bin/python #!coding:utf8 def mashine(x,y=10): print "正在生成一个",y,‘元‘,x,"口味的冰激凌!" mashine(‘巧克力‘)
*函数中的变量
*局部变量和全局变量
- python 中如何变量都有其特定的 作用域
-在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称为局部变量;
-在一个文件顶部定义的变量可以供该文件中的任何函数调用,这些可以为整个程序所使用的变量称为全部变量;
范例:
[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 [root@zabbix tools]# cat 10.py #!/usr/bin/python def fun(): a=100 print a print a 如果调用函数fun: [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 [root@zabbix tools]# cat 10.py #!/usr/bin/python def fun(): a=100 print a fun() print "#"*50 print a #表明100是由函数调用显示。 [root@zabbix tools]# python 10.py my name is HIBOY 100 my name is HIBOY [root@zabbix tools]# cat 10.py #!/usr/bin/python x="my name is HIBOY" #定义全局变量; #定义函数; def fun(): a=100 print x print a fun() print x
如果全局变量和局部变量重名
[root@zabbix tools]# python 10.py 100 my name is HIBOY [root@zabbix tools]# cat 10.py #!/usr/bin/python x="my name is HIBOY" def fun(): x=100 print x fun() print x #注意仅仅是名字相同,含义不相等的。
global 语句 :
global 变量名
强制声明为全局变量
[root@zabbix tools]# python 10.py 100 200 [root@zabbix tools]# vi 10.py #!/usr/bin/python x="my name is HIBOY" def fun(): x=100 global y y = 200 print x fun() #注意此处要调用函数 print y 如果没有调用函数,是没有意义的。 [root@zabbix tools]# cat 10.py #!/usr/bin/python x="my name is HIBOY" def fun(): x=100 global y y = 200 print x print y [root@zabbix tools]# python 10.py Traceback (most recent call last): File "10.py", line 8, in <module> print y NameError: global name ‘y‘ is not defined #y未定义,需调用
案例:
如果将x同时也声明为全局变量(重名)
[root@zabbix tools]# python 10.py my name is HIBOY 100 [root@zabbix tools]# cat 10.py #!/usr/bin/python x="my name is HIBOY" def fun(): global x x=100 print x fun() print x
总结: 在函数之前全局变量值不变,在函数之后全局变量为函数的中全局变量的值
*函数的返回值
*函数的返回值
- 函数被调用后会返回一个指定的值;
- 函数调用后默认返回None;
-return 返回值
-返回值可以是任意类型
-return执行后,函数终止
-区分返回值和打印
#注意打印和返回的区别
>>> f(0) 0 >>> def f(x,y): ... print x+y ... >>> f(2,3) 5 >>> z = f(5,6) 11 #此处只是打印 >>> print z None >>> sum([1,5,6]) 12 >>> z = sum([1,5,6]) >>> print z 12
范例:
>>> 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]
在函数中只要执行到retuen时,都会相应的结束
范例:
>>> 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 #注意返回和打印的区别
*多类型传值和传值冗余
-向函数传元组和字典
>>> 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作为一个整体,是一个元组类型的数据,当这样传值时候,t的值只能对应到x,y无法接受仍和值; >>> fun(t,10) (‘b‘, ‘c‘) 10 #需求:当函数需要使用元组的值时,如何传值到函数? 例: >>> t = (‘name‘,‘kong‘) >>> def fun(x,y): ... print "%s : %s" %(x,y) ... # 字符串格式化输出 %s 代表将来传过来一个字符串 % 表示传值 #>>> print "%s %s" %(‘name‘,‘kong‘) # name kong >>> fun(*t) #* 告知t为元组 name : kong #传值的时候是一一对应的,多个是不可以的 >>> 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): #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} >>> 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‘ #x给了过多的值 >>> fun(1,2,3,4,5,6,y=20,arges=30) 1 (2, 3, 4, 5, 6) {‘y‘: 20, ‘arges‘: 30}
本文出自 “思想大于技术” 博客,谢绝转载!
标签:python
原文地址:http://linuxboys.blog.51cto.com/9150052/1655228