|
15 | 15 |
|
16 | 16 |  |
17 | 17 |
|
18 | | -有初中数学水平都能理解一个大概了。这里不赘述。 |
19 | | - |
20 | | -本讲重点说明用python怎么来构造一个函数。 |
21 | | - |
22 | 18 | ##深入理解函数 |
23 | 19 |
|
24 | 20 | 在中学数学中,可以用这样的方式定义函数:y=4x+3,这就是一个一次函数,当然,也可以写成:f(x)=4x+3。其中x是变量,它可以代表任何数。 |
|
31 | 27 |
|
32 | 28 | ###变量不仅仅是数 |
33 | 29 |
|
34 | | -变量x只能是任意数吗?其实,一个函数,就是一个对应关系。看官尝试着将上面表达式的x理解为馅饼,4x+3,就是4个馅饼在加上3(一般来讲,单位是统一的,但你非让它不统一,也无妨),这个结果对应着另外一个东西,那个东西比如说是iphone。或者说可以理解为4个馅饼加3就对应一个iphone。这就是所谓映射关系。 |
| 30 | +变量x只能是任意数吗?其实,一个函数,就是一个对应关系。读者尝试着将上面表达式的x理解为馅饼,4x+3,就是4个馅饼在加上3(一般来讲,单位是统一的,但你非让它不统一,也无妨),这个结果对应着另外一个东西,那个东西比如说是iphone。或者说可以理解为4个馅饼加3就对应一个iphone。这就是所谓映射关系。 |
35 | 31 |
|
36 | 32 | 所以,x,不仅仅是数,可以是你认为的任何东西。 |
37 | 33 |
|
38 | 34 | ###变量本质——占位符 |
39 | 35 |
|
40 | | -函数中为什么变量用x?这是一个有趣的问题,自己google一下,看能不能找到答案。 |
| 36 | +函数中为什么变量用x?这是一个有趣的问题,自己google一下,看能不能找到答案。很巧,在“知乎”上还真有人询问[这个问题](http://www.zhihu.com/question/20112835),可以阅读。 |
41 | 37 |
|
42 | 38 | 我也不清楚原因。不过,我清楚地知道,变量可以用x,也可以用别的符号,比如y,z,k,i,j...,甚至用alpha,beta这样的字母组合也可以。 |
43 | 39 |
|
44 | 40 | **变量在本质上就是一个占位符。**这是一针见血的理解。什么是占位符?就是先把那个位置用变量占上,表示这里有一个东西,至于这个位置放什么东西,以后再说,反正先用一个符号占着这个位置(占位符)。 |
45 | 41 |
|
46 | | -其实在高级语言编程中,变量比我们在初中数学中学习的要复杂。但是,先不管那些,复杂东西放在以后再说了。现在,就按照初中数学的水平来研究python中的变量。 |
47 | | - |
48 | | -通常使小写字母来命名python中的变量,也可以在其中加上下划线什么的,表示区别。 |
| 42 | +其实在高级语言编程中,变量比我们在初中数学中学习的要复杂。但是,先不管那些,复杂东西放在以后再说了。现在,就按照初中数学的水平来研究Python中的变量。 |
49 | 43 |
|
50 | | -比如:alpha,x,j,p_beta,这些都可以做为python的变量。 |
| 44 | +通常使小写字母来命名Python中的变量,也可以在其中加上下划线什么的,表示区别。比如:alpha,x,j,p_beta,这些都可以做为python的变量。 |
51 | 45 |
|
52 | 46 | ##建立简单函数 |
53 | 47 |
|
|
58 | 52 |
|
59 | 53 | 这种方式建立的函数,跟在初中数学中学习的没有什么区别。当然,这种方式的函数,在编程实践中没有什么用途。 |
60 | 54 |
|
61 | | -别急躁,你在输入a=3,然后输入y,看看得到什么结果呢? |
| 55 | +别急躁,你在输入a=3,然后输入y,看看得到什么结果呢? |
62 | 56 |
|
63 | 57 | >>> a = 2 |
64 | 58 | >>> y = 3 * a + 2 |
|
90 | 84 |
|
91 | 85 | ##建立实用的函数 |
92 | 86 |
|
93 | | -上面用命令方式建立函数,还不够“正规化”,那么就来写一个.py文件吧。 |
| 87 | +上面用命令方式建立函数,还不够“正规化”,现在就来写一个实用的函数吧。 |
94 | 88 |
|
95 | 89 | 例如下面的代码: |
96 | 90 |
|
|
99 | 93 |
|
100 | 94 | def add_function(a, b): |
101 | 95 | c = a + b |
102 | | - print c |
| 96 | + return c |
103 | 97 |
|
104 | 98 | if __name__ == "__main__": |
105 | | - add_function(2, 3) |
| 99 | + result = add_function(2, 3) |
| 100 | + print result |
106 | 101 |
|
107 | 102 | 然后将文件保存,我把她命名为20101.py,你根据自己的喜好取个名字。 |
108 | 103 |
|
|
114 | 109 |
|
115 | 110 | 下面开始庖丁解牛: |
116 | 111 |
|
117 | | -- `def add_function(a, b)`: 这里是函数的开始。在声明要建立一个函数的时候,一定要使用def(def 就是英文define的前三个字母),意思就是告知计算机,这里要声明一个函数;add_function是这个函数名称,取名字是有讲究的,就好比你的名字一样。在python中取名字的讲究就是要有一定意义,能够从名字中看出这个函数是用来干什么的。从add_function这个名字中,是不是看出她是用来计算加法的呢(严格地说,是把两个对象“相加”,这里相加的含义是比较宽泛的,包括对字符串等相加)?(a,b)这个括号里面的是这个函数的参数,也就是函数变量。冒号,这个冒号非常非常重要,如果少了,就报错了。冒号的意思就是下面好开始真正的函数内容了。 |
118 | | -- `c = a + b` 特别注意,这一行比上一行要缩进四个空格。这是python的规定,要牢记,不可丢掉,丢了就报错。然后这句话就是将两个参数(变量)相加,结果赋值与另外一个变量c。 |
119 | | -- `print c` 还是提醒看官注意,缩进四个空格。将得到的结果c的值打印出来。 |
| 112 | +- `def`: 这里是函数的开始。在声明要建立一个函数的时候,一定要使用def(def 就是英文define的前三个字母),意思就是告知计算机,这里要声明一个函数。`def`做在那一行,包括后面的`add_function(a, b)`,被称为函数头。 |
| 113 | +- `add_function`:这是函数名称。取名字是有讲究的,就好比你的名字一样。在Python中取名字的讲究就是要有一定意义,能够从名字中看出这个函数是用来干什么的。从add_function这个名字中,是不是看出她是用来计算加法的呢(严格地说,是把两个对象“相加”,这里相加的含义是比较宽泛的,包括对字符串等相加)? |
| 114 | +- `(a,b)`:这是参数列表。要写在括号里面。这是一个变量列表,其中的变量指向函数的输入。在这个例子中,函数有两项输入,分别是a和b。在通常的函数中,输入项没有限定,可以是任意数量,当然也可以没有输入,这时候的参数列表就是一对空着的圆括号(),但是,必须得有这个圆括号。 |
| 115 | +- `:`:这个冒号非常非常重要,如果少了,就报错了。这和前面的语句是类似的,冒号表示函数头结束,下面要开始函数体的内容了。 |
| 116 | +- `c = a + b`:这一行开始,就是函数体。函数体使一个缩进了四个空格的代码块,完成你需要完成的工作。在这个代码块中,可以使用函数头中的变量,当然,不使用也可以。缩进四个空格。这是python的规定,要牢记,不可丢掉,丢了就报错。这句话就是将函数头的变量相加,结果赋值与另外一个变量c。 |
| 117 | +- `return c`:还是提醒看官注意,缩进四个空格。`return`是函数的关键字,意思是要返回一个值。`return`语句执行时,Python跳出当前的函数并返回到调用这个函数的地方。在下面,有调用这个函数的地方`result = add_function(2, 3)`。但是,函数中的`return`语句也不是必须要写的,如果不写,Python将认为使以`return None`来作为结束的。也就是说,如果你的函数中没有`return`,事实上,在调用的时候,Python也会返回一个结果,这个结果就是None。 |
120 | 118 | - `if __name__ == "__main__"`: 这句话先照抄,不解释,因为在[《自省》](./130.md)有说明,不知道你是不是认真阅读了。注意就是不缩进了。 |
121 | | -- add_function(2,3) 这才是真正调用前面建立的函数,并且传入两个参数:a=2,b=3。仔细观察传入参数的方法,就是把2放在a那个位置,3放在b那个位置(所以说,变量就是占位符). |
| 119 | +- `result = add_function(2,3)`:这是调用前面建立的函数,并且传入两个参数:a=2,b=3。仔细观察传入参数的方法,就是把2放在a那个位置,3放在b那个位置(所以说,变量就是占位符)。当函数运行,遇到了`return`语句,就将函数中的结果返回到这里,赋值给result。 |
122 | 120 |
|
123 | 121 | 解牛完毕,做个总结: |
124 | 122 |
|
|
132 | 130 |
|
133 | 131 | 几点说明: |
134 | 132 |
|
135 | | -- 函数名的命名规则要符合python中的命名要求。一般用小写字母和单下划线、数字等组合 |
| 133 | +- 函数名的命名规则要符合Python中的命名要求。一般用小写字母和单下划线、数字等组合 |
136 | 134 | - def是定义函数的关键词,这个简写来自英文单词define |
137 | 135 | - 函数名后面是圆括号,括号里面,可以有参数列表,也可以没有参数 |
138 | 136 | - 千万不要忘记了括号后面的冒号 |
|
152 | 150 | >>> add(2,3) #通过函数,计算2+3 |
153 | 151 | 5 |
154 | 152 |
|
155 | | -注意上面的add(x,y)函数,在这个函数中,没有特别规定参数x,y的类型。其实,这句话本身就是错的,还记得在前面已经多次提到,在python中,变量无类型,只有对象才有类型,这句话应该说成:x,y并没有严格规定其所引用的对象类型。这是python跟某些语言比如java很大的区别,在有些语言中,需要在定义函数的时候告诉函数参数的数据类型。python不用那样做。 |
| 153 | +注意上面的add(x,y)函数,在这个函数中,没有特别规定参数x,y的类型。其实,这句话本身就是错的,还记得在前面已经多次提到,在Python中,变量无类型,只有对象才有类型,这句话应该说成:x,y并没有严格规定其所引用的对象类型。这是Python跟某些语言比如java很大的区别,在有些语言中,需要在定义函数的时候告诉函数参数的数据类型。Python不用那样做。 |
156 | 154 |
|
157 | | -为什么?列位不要忘记了,这里的所谓参数,跟前面说的变量,本质上是一回事。只有当用到该变量的时候,才建立变量与对象的对应关系,否则,关系不建立。而对象才有类型。那么,在add(x,y)函数中,x,y在引用对象之前,是完全飘忽的,没有被贴在任何一个对象上,换句话说它们有可能引用任何对象,只要后面的运算许可,如果后面的运算不许可,则会报错。 |
| 155 | +为什么?列位不要忘记了,这里的所谓参数,跟前面说的变量,本质上是一回事。只有当用到该变量的时候,才建立变量与对象的对应关系,否则,关系不建立。而对象才有类型。那么,在`add(x,y)`函数中,x,y在引用对象之前,是完全飘忽的,没有被贴在任何一个对象上,换句话说它们有可能引用任何对象,只要后面的运算许可,如果后面的运算不许可,则会报错。 |
158 | 156 |
|
159 | 157 | >>> add("qiw","sir") #这里,x="qiw",y="sir",让函数计算x+y,也就是"qiw"+"sir" |
160 | 158 | 'qiwsir' |
|
165 | 163 | File "<stdin>", line 2, in add |
166 | 164 | TypeError: cannot concatenate 'str' and 'int' objects #仔细阅读报错信息,就明白错误之处了 |
167 | 165 |
|
168 | | -从实验结果中发现:x+y的意义完全取决于对象的类型。在python中,将这种依赖关系,称之为**多态**。对于python中的多态问题,以后还会遇到,这里仅仅以此例子显示一番。请看官要留心注意的:**python中为对象编写接口,而不是为数据类型。**读者先留心一下这句话,或者记住它,随着学习的深入,会领悟到其真谛的。 |
| 166 | +从实验结果中发现:`x+y`的意义完全取决于对象的类型。在Python中,将这种依赖关系,称之为**多态**。对于Python中的多态问题,以后还会遇到,这里仅仅以此例子显示一番。请看官要留心注意的:**Python中为对象编写接口,而不是为数据类型。**读者先留心一下这句话,或者记住它,随着学习的深入,会领悟到其真谛的。 |
169 | 167 |
|
170 | 168 | 此外,也可以将函数通过赋值语句,与某个变量建立引用关系: |
171 | 169 |
|
|
185 | 183 |
|
186 | 184 | 江湖上还有的大师,会通过某个人的名字来预测他/她的吉凶祸福等。看来名字这玩意太重要了。“名不正,言不顺”,歪解:名字不正规化,就不顺。这是歪解,希望不要影响看官正确理解。不知道大师们是不是能够通过外国人名字预测外国人大的吉凶祸福呢?比如Aoi sola,这个人怎么样?不管怎样,某国人是很在意名字的,旁边有个国家似乎就不在乎,比如山本五十六,在名字中间出现数字,就好像我们的张三李四王二麻子那样随便,不过,有一种说法,“山本五十六”的意思是这个人出生时,他父亲56岁,看来跟张三还不一样的。 |
187 | 185 |
|
188 | | -python也很在乎名字问题,其实,所有高级语言对名字都有要求。为什么呢?因为如果命名乱了,计算机就有点不知所措了。看python对命名的一般要求。 |
| 186 | +Python也很在乎名字问题,其实,所有高级语言对名字都有要求。为什么呢?因为如果命名乱了,计算机就有点不知所措了。看Python对命名的一般要求。 |
189 | 187 |
|
190 | 188 | - 文件名:全小写,可使用下划线 |
191 | 189 |
|
@@ -293,5 +291,5 @@ python也很在乎名字问题,其实,所有高级语言对名字都有要 |
293 | 291 |
|
294 | 292 | [总目录](./index.md) | [上节:自省](./130.md) | [下节:函数(2)](./202.md) |
295 | 293 |
|
296 | | -如果你认为有必要打赏我,请通过支付宝: **[email protected]**,不胜感激。 |
| 294 | +如果你认为有必要打赏我,请通过支付宝: **[email protected]**, 微信号:**qiwsir**,不胜感激。 |
297 | 295 |
|
0 commit comments