函數 |
什麼是函數 | 函數就是完成特定功能的一個語句組,這組語句可以作爲一個單位使用,並且給它取一個名字。 |
可以通過函數名在程序的不同地方多次執行(這通常叫做函數調用),卻不需要再所有地方重複編寫這些語句。 |
函數的分類 | -自定義函數(用戶自己編寫) |
-預定義的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} |