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