自学python系列10:python的函数和函数式编程
生活随笔
收集整理的這篇文章主要介紹了
自学python系列10:python的函数和函数式编程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.1什么是函數(shù)
函數(shù)是對程序邏輯進行結(jié)構(gòu)化或過程化的編程方法。這樣能節(jié)省空間,有助于保持一致性。 函數(shù)的創(chuàng)建,使用,引用方法: def foo():print 'bar' foo foo() 1.1.1函數(shù)vs過程 函數(shù)是布爾類型的,返回一個“是”或“否”的回答。一個非零或者零值。python的過程是函數(shù),因為解釋器會隱式返回默認(rèn)值None。 1.1.2返回值和函數(shù)類型 不返回任何東西。在C中默認(rèn)為"void"返回類型,在python中該值為none >>> def hello():???? print 'hello world' >>> a=hello()
hello world
>>> print a
None 1.2調(diào)用函數(shù) 1.2.1函數(shù)操作符 用圓括號調(diào)用函數(shù)。 1.2.2關(guān)鍵字參數(shù) 關(guān)鍵字參數(shù)的概念對函數(shù)的調(diào)用。 def foo(x): 標(biāo)準(zhǔn)調(diào)用foo(): ? ? foo(42) foo('2') 關(guān)鍵字調(diào)用foo(): ?foo(x=42) 例子: >>> def foo(x,y):
???? a >>> foo(1,2) 1.2.3默認(rèn)參數(shù) 默認(rèn)參數(shù)是聲明了默認(rèn)值的參數(shù)。 1.2.4參數(shù)組 1.3創(chuàng)建函數(shù) 1.3.1def語句 def function_name(arguments): "function_documentation_string" function_boby_suite 例子: def hello(who): 'something' return str(who) 1.3.2聲明與定義的比較 在某些編程語言里,函數(shù)聲明和定義區(qū)分開。一個函數(shù)聲明包括提供對函數(shù)名,參數(shù)的名字,但不必給出函數(shù)的任何代碼,具體的代碼通常屬于函數(shù)定義的范疇。 1.3.3前向引用 python不允許在函數(shù)未聲明之前,對其進行引用或者調(diào)用。 >>> def foo():
???? print 'in foo()'
???? bar()
bar()還沒有申明 ? ??
>>> foo()
in foo()
Traceback (most recent call last):
? File "<pyshell#4>", line 1, in <module>
??? foo()
? File "<pyshell#3>", line 3, in foo
??? bar()
NameError: global name 'bar' is not defined 前向引用: 定義函數(shù)a,在函數(shù)b之前給出函數(shù)a的聲明
>>> def a():
print'a'
>>> def b():
print'b'
a()
>>> b()
b
a
???? 'a'
????
>>> def bar():
???? pass
>>> bar.__doc__
>>> help(foo)
Help on function foo in module __main__:
foo()
??? a
>>> print bar.__doc__
None 1.3.5內(nèi)部/內(nèi)嵌函數(shù) 在函數(shù)體內(nèi)創(chuàng)建另外一個函數(shù),這叫內(nèi)部/內(nèi)嵌函數(shù)。 >>> def a():
???? def b():
????????? print'b'
???? print 'a'
???? b()
????
>>> a()
a
b
>>> b()
Traceback (most recent call last):
? File "<pyshell#25>", line 1, in <module>
??? b()
NameError: name 'b' is not defined 1.3.6*函數(shù)裝飾器 裝飾器是在函數(shù)調(diào)用之上的修飾。 使用多個裝飾器: @deco2 @deco1 def func(arg1,arg2,...):pass 和一個組合函數(shù)等價: def func(arg1,arg2,...):pass func=deco2(deco1(func)) 1.有參數(shù)和無參數(shù)的裝飾器 無參數(shù): @deco def foo():pass 等價于:foo=deco(foo) 帶參數(shù): @deco(a) def foo():pass 等價于:foo=deco(a)(foo) 一個含有多個裝飾器的例子,其中一個裝飾器帶有一個參數(shù): @deco1(a) @deco2 def func():pass 等價于 func=dec1(a)(deco2(func)) 2.裝飾器是什么 裝飾器就是函數(shù)。可以用裝飾器來: 引入日志 增加計時邏輯來檢測性能 給函數(shù)加入事務(wù)的能力 1.4傳遞函數(shù) 第一個例子: >>> def a():
???? print'a'
????
>>> b=a
>>> b()
a 第二個例子:參數(shù)可以傳遞 >>> def a():
???? print'a'
????
>>> def c(x):
???? x()
????
>>> c(a)
a 1.5形參 1.5.1位置參數(shù) 傳入函數(shù)的參數(shù)數(shù)目必須和聲明的數(shù)字一致 >>> foo()
Traceback (most recent call last):
? File "<pyshell#62>", line 1, in <module>
??? foo()
TypeError: foo() takes exactly 1 argument (0 given)
>>> foo('s')
s >>> foo('s','x')
Traceback (most recent call last):
? File "<pyshell#64>", line 1, in <module>
??? foo('s','x')
TypeError: foo() takes exactly 1 argument (2 given) 1.5.2默認(rèn)參數(shù) 參數(shù)名等號默認(rèn)值。若沒有值傳遞給那個參數(shù),那么這個參數(shù)就將取默認(rèn)值。 >>> def func(a=1,b=2,c=3):
???? return a+b+3
>>> func()
6 1.6可變長度的參數(shù) 見核心編程p307 ? 1.7函數(shù)式編程 支持很多有價值的函數(shù)式編程語言構(gòu)建。四種內(nèi)建函數(shù)和lambda表達式出現(xiàn)。 1.7.1匿名函數(shù)與lambda lambda [arg1,arg2,...]:expression python允許用lambda關(guān)鍵字創(chuàng)造匿名函數(shù)。一個完整的lambda"語句"代表一個表達式,這個表達式需和聲明放在同一行。 上面的函數(shù)沒帶任何的參數(shù)并且總是返回True。如以下: def true():return True 使用lambda的等價表達式: lambda:True >>> lambda:True
<function <lambda> at 0x0000000002C71F28> 1.7.2內(nèi)建函數(shù)apply(),filter(),map(),reduce() 見核心技術(shù)p312 1.8變量作用域 標(biāo)識符的作業(yè)域是定義為其聲明在程序里的可應(yīng)用范圍。變量可以是局部域或全局域 1.8.1全局變量與局部變量 聲明適用的程序的范圍被稱為聲明的作用域。在一個過程中,若干名稱在過程的聲明之內(nèi),它的出現(xiàn)則為過程的局部變量,否則出現(xiàn)為局部。 全局變量和局部變量: >>> a=1
>>> def test():
???? b=2
????
>>> print a
1
>>> print b
Traceback (most recent call last):
? File "<pyshell#12>", line 1, in <module>
??? print b
NameError: name 'b' is not defined a是全局變量,b是局部變量 1.8.2global語句 若將全局變量聲明在一個函數(shù)體內(nèi),全局變量會被局部變量覆蓋掉。 >>> a='1'
>>> def foo():
???? global a
???? a='2'
???? b='3'
???? print a+b
????
>>> foo()
23
>>> print a
2 1.8.3作用域的數(shù)字 ? ? ?python從語法支持多個函數(shù)嵌套。雖然而,在2.1之前的版本中,最多為兩個作用域,一個函數(shù)的局部作用域和全局作用域。雖然存在多個函數(shù)的嵌套,但不能訪問超過兩個作用域。 貌似不行,核心編程p321 ? 1.8.4閉包 1.8.5作用域和lambda 1.8.6變量作用域和名稱空間 1.9*遞歸 1.10生成器
轉(zhuǎn)載于:https://www.cnblogs.com/wyx123/articles/4105673.html
總結(jié)
以上是生活随笔為你收集整理的自学python系列10:python的函数和函数式编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [翻译] JTCalendar
- 下一篇: 网站自行备案流程