标签: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