天天看点

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,如需转载请自行联系原作者