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