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}



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