天天看點

python學習之函數學習進階(二)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

<code>一、内置函數</code>

<code>zip</code><code>函數: </code><code>zip</code><code>()是Python的一個内建函數,它接受一系列可疊代的對象作為參數,将對象中對應的</code>

<code>元素按順序組合成一個</code><code>tuple</code><code>,每個</code><code>tuple</code><code>中包含的是原有序列中對應序号位置的元素,然後傳回由</code>

<code>這些tuples組成的</code><code>list</code><code>。若傳入參數的長度不等,則傳回</code><code>list</code><code>的長度和參數中長度最短的對象相同。</code>

<code>在所有參數長度相同的情況下,</code><code>zip</code><code>()與</code><code>map</code><code>()類似,沒有參數的情況下</code><code>zip</code><code>()傳回一個空</code><code>list</code>

<code>例子:</code>

<code>l1 </code><code>=</code> <code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>]</code>

<code>l2 </code><code>=</code> <code>[</code><code>'a'</code><code>,</code><code>'b'</code><code>,</code><code>'c'</code><code>,</code><code>'d'</code><code>]</code>

<code>for</code> <code>i </code><code>in</code> <code>zip</code><code>(l1,l2):</code>

<code>    </code><code>print</code><code>(i)</code>

<code>傳回結果:[(</code><code>1</code><code>,</code><code>'a'</code><code>),(</code><code>2</code><code>,</code><code>'b'</code><code>),(</code><code>3</code><code>,</code><code>'c'</code><code>),(</code><code>4</code><code>,</code><code>'d'</code><code>)]</code>

<code>filter</code><code>函數: </code><code>filter</code><code>函數是 Python 内置的另一個有用的高階函數,</code><code>filter</code><code>()函數接收一個函數</code>

<code>f和一個</code><code>list</code><code>,這個函數 f 的作用是對每個元素進行判斷,傳回 </code><code>True</code><code>或 </code><code>False</code><code>,</code><code>filter</code><code>()</code>

<code>根據判斷結果自動過濾掉不符合條件的元素,傳回由符合條件元素組成的新</code><code>list</code><code>.</code>

<code>def</code> <code>add(n):</code><code>return</code> <code>n </code><code>/</code> <code>2</code> <code>=</code><code>=</code> <code>1</code>

<code>for</code> <code>i </code><code>in</code> <code>filter</code><code>(add, [</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>]):</code>

<code>    </code><code>print</code><code>(i)        </code><code>#列印2</code>

<code>    </code> 

<code>map</code><code>函數: </code><code>map</code><code>()是 Python 内置的高階函數,它接收一個函數 f 和一個 </code><code>list</code><code>,并通過把函數f依次</code>

<code>作用在 </code><code>list</code> <code>的每個元素上,得到一個新的 </code><code>list</code> <code>并傳回。</code>

<code>l </code><code>=</code> <code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>]</code>

<code>def</code> <code>add(x):</code>

<code>    </code><code>return</code> <code>x</code><code>+</code><code>1</code>

<code>for</code> <code>i </code><code>in</code> <code>map</code><code>(add,l):</code>

<code>reduce</code><code>函數: </code><code>reduce</code><code>()函數接收的參數和 </code><code>map</code><code>()類似,一個函數 f,一個</code><code>list</code><code>,但行為和 </code><code>map</code><code>()不同,</code>

<code>reduce</code><code>()傳入的函數 f 必須接收兩個參數,</code><code>reduce</code><code>()對</code><code>list</code><code>的每個元素反複調用函數f,</code>

<code>并傳回最終結果值</code>

<code>from</code> <code>functools </code><code>import</code> <code>reduce</code>

<code>l </code><code>=</code> <code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>,</code><code>5</code><code>]</code>

<code>print</code><code>(</code><code>reduce</code><code>(</code><code>lambda</code> <code>x,y: x</code><code>+</code><code>y, l, </code><code>10</code><code>))     </code><code>#參數10是可選參數,作為初始值</code>

<code>   </code> 

<code>二、匿名函數</code><code>lambda</code>

<code>    </code><code>1.lambda</code><code>隻是一個表達式,函數體比</code><code>def</code><code>簡單很多。</code>

<code>    </code><code>2.lambda</code><code>的主體是一個表達式,而不是一個代碼塊。僅僅能在</code><code>lambda</code><code>表達式中封裝有限的邏輯進去。</code>

<code>    </code><code>3.lambda</code><code>表達式是起到一個函數速寫的作用。允許在代碼内嵌入一個函數的定義。</code>

<code>    </code><code>例子:</code>

<code>    </code><code>f </code><code>=</code> <code>lambda</code> <code>x,y: x</code><code>+</code><code>y        </code><code>#x,y是參數,x+y是表達式,然後指派給f</code>

<code>    </code><code>print</code><code>(f)        </code><code>#傳回f的記憶體位址</code>

<code>    </code><code>print</code><code>(f(</code><code>1</code><code>,</code><code>2</code><code>))    </code><code>#傳回表達式的值</code>

<code>    </code><code>l </code><code>=</code> <code>[</code><code>'alex'</code><code>, </code><code>'wupeiqi'</code><code>, </code><code>'yuanhao'</code><code>]</code>

<code>    </code><code>res </code><code>=</code> <code>map</code><code>(</code><code>lambda</code> <code>x: x </code><code>+</code> <code>'_SB'</code><code>, l)</code>

<code>    </code><code>print</code><code>(res)</code>

<code>    </code><code>print</code><code>(</code><code>list</code><code>(res))</code>

<code>    </code><code>nums </code><code>=</code> <code>[</code><code>2</code><code>,</code><code>4</code><code>,</code><code>6</code><code>,</code><code>9</code><code>]</code>

<code>    </code><code>res1 </code><code>=</code> <code>map</code><code>(</code><code>lambda</code> <code>x: x</code><code>*</code><code>*</code><code>2</code><code>, nums)</code>

<code>    </code><code>print</code><code>(</code><code>list</code><code>(res1))</code>

<code>三、遞歸調用</code>

<code>    </code><code>在函數調用過程中,直接或間接調用函數本身,這就是函數的遞歸調用</code>

<code>    </code><code>def</code> <code>age(n):</code>

<code>        </code><code>if</code> <code>n </code><code>=</code><code>=</code> <code>1</code><code>:</code>

<code>            </code><code>return</code> <code>18</code>

<code>        </code><code>return</code> <code>age(n</code><code>-</code><code>1</code><code>) </code><code>+</code> <code>2</code>

<code>    </code><code>print</code><code>(age(</code><code>5</code><code>))</code>

<code>    </code><code>l </code><code>=</code> <code>[</code><code>1</code><code>, </code><code>2</code><code>, </code><code>10</code><code>,</code><code>33</code><code>,</code><code>53</code><code>,</code><code>71</code><code>,</code><code>73</code><code>,</code><code>75</code><code>,</code><code>77</code><code>,</code><code>85</code><code>,</code><code>101</code><code>,</code><code>201</code><code>,</code><code>202</code><code>,</code><code>999</code><code>,</code><code>11111</code><code>]</code>

<code>    </code><code>def</code> <code>search(find_num,seq):</code>

<code>        </code><code>if</code> <code>len</code><code>(seq) </code><code>=</code><code>=</code> <code>0</code><code>:</code>

<code>            </code><code>print</code><code>(</code><code>'not exists'</code><code>)</code>

<code>            </code><code>return</code>

<code>        </code><code>mid_index</code><code>=</code><code>len</code><code>(seq)</code><code>/</code><code>/</code><code>2</code>

<code>        </code><code>mid_num</code><code>=</code><code>seq[mid_index]</code>

<code>        </code><code>print</code><code>(seq,mid_num)</code>

<code>        </code><code>if</code> <code>find_num &gt; mid_num:</code>

<code>            </code><code>#in the right</code>

<code>            </code><code>seq</code><code>=</code><code>seq[mid_index</code><code>+</code><code>1</code><code>:]</code>

<code>            </code><code>search(find_num,seq)</code>

<code>        </code><code>elif</code> <code>find_num &lt; mid_num:</code>

<code>            </code><code>#in the left</code>

<code>            </code><code>seq</code><code>=</code><code>seq[:mid_index]</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>print</code><code>(</code><code>'find it'</code><code>)</code>

<code>    </code><code>search(</code><code>77</code><code>,l)</code>

<code>四、包、子產品</code>

<code>    </code><code>import</code> <code>spam</code>

<code>    </code><code>import</code> <code>導入子產品做三件事</code>

<code>    </code><code>1.</code><code>産生新的名稱空間</code>

<code>    </code><code>2.</code><code>以建立的名稱空間為全局名稱空間,執行檔案代碼</code>

<code>    </code><code>3.</code><code>拿到一個子產品名spam,指向spam.py産生的名稱空間</code>

<code>    </code><code>import</code> <code>spam as x    </code><code>#将spam用x代替,适合子產品名過長時使用</code>

<code>    </code><code>from</code> <code>... </code><code>import</code> <code>...</code>

<code>    </code><code>優點: 友善、不用加字首</code>

<code>    </code><code>缺點: 容易跟目前的檔案名稱沖突</code>

<code>    </code><code>包: 将有聯系的子產品組織到一起,有效避免子產品名稱沖突問題,讓組織結構更加清晰。</code>

<code>    </code><code>一個标準的應用程式結構:</code>

<code>    </code><code>app</code><code>/</code>

<code>        </code><code>__init__.py        </code><code>#__init__.py做一些初始化工作可以是空檔案,也可以寫一些初始配置</code>

<code>        </code><code>a</code><code>/</code>

<code>            </code><code>__init__.py</code>

<code>            </code><code>a.py</code>

<code>        </code><code>b</code><code>/</code>

<code>            </code><code>b.py</code>

<code>     </code><code>from</code> <code>app.a </code><code>import</code> <code>a</code>

<code>     </code><code>from</code> <code>app.b.b </code><code>import</code> <code>test    </code><code># "."左邊必須是包名</code>

<code>     </code><code>a.test()    </code>

<code>     </code><code>test()</code>

<code>     </code> 

<code>     </code><code>可以将包加入sys.path環境變量的位置,或者把包所在的位置加入到環境變量</code>

     本文轉自小白的希望 51CTO部落格,原文連結:http://blog.51cto.com/haoyonghui/1930999,如需轉載請自行聯系原作者