python 基础 函数


                                                                 函数


什么是函数


函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字。

可以通过函数名在程序的不同地方多次执行(这通常叫做函数调用),却不需要再所有地方重复编写这些语句。

   

函数的分类


 -自定义函数(用户自己编写)

 -预定义的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 元 巧克力 口味的冰激凌!

   

                                                 函数中的变量


#python 中定义的变量都有其特定的作用域

  *局部变量     :   -在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称为局部变量;


例证:

#!/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}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章