From 95ad9778182a26c9887d4d98638682913a5dbc19 Mon Sep 17 00:00:00 2001 From: TwoWater <347073565@qq.com> Date: Wed, 9 Oct 2019 17:42:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=96=B0=E4=BF=AE=E8=AE=A2=206=20-=20?= =?UTF-8?q?8=20=E7=AB=A0=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Article/PythonBasis/python4/Preface.md | 2 +- Article/PythonBasis/python5/Cycle.md | 309 ++++++++++++------ Article/PythonBasis/python5/If.md | 68 +++- Article/PythonBasis/python5/Preface.md | 12 +- Article/PythonBasis/python6/1.md | 101 ++++++ .../3.md => PythonBasis/python6/2.md} | 20 +- .../4.md => PythonBasis/python6/3.md} | 98 ++++-- .../2.md => PythonBasis/python6/4.md} | 16 +- Article/{ => PythonBasis}/python6/5.md | 7 +- Article/PythonBasis/python6/Preface.md | 13 + Article/{ => PythonBasis}/python7/1.md | 6 +- Article/{ => PythonBasis}/python7/2.md | 0 Article/{ => PythonBasis}/python7/3.md | 10 +- Article/{ => PythonBasis}/python7/4.md | 30 +- Article/{ => PythonBasis}/python7/5.md | 0 Article/PythonBasis/python7/Preface.md | 11 + Article/{python9 => PythonBasis/python8}/1.md | 26 +- Article/PythonBasis/python8/2.md | 83 +++++ Article/PythonBasis/python8/3.md | 57 ++++ Article/PythonBasis/python8/4.md | 32 ++ Article/PythonBasis/python8/5.md | 171 ++++++++++ Article/PythonBasis/python8/6.md | 146 +++++++++ .../5.md => PythonBasis/python8/7.md} | 19 +- .../6.md => PythonBasis/python8/8.md} | 9 +- .../4.md => PythonBasis/python8/9.md} | 110 ++++--- Article/PythonBasis/python8/Preface.md | 26 ++ ...2\345\220\221\345\257\271\350\261\241.png" | Bin 0 -> 67053 bytes Article/{python8 => PythonBasis/python9}/1.md | 0 Article/{python8 => PythonBasis/python9}/2.md | 0 Article/{python8 => PythonBasis/python9}/3.md | 0 Article/{python8 => PythonBasis/python9}/4.md | 0 Article/{python8 => PythonBasis/python9}/5.md | 0 .../python9}/Preface.md | 0 Article/python6/1.md | 42 --- Article/python6/Preface.md | 7 - Article/python7/Preface.md | 7 - Article/python9/2.md | 117 ------- Article/python9/3.md | 64 ---- Article/python9/Preface.md | 10 - README.md | 62 ++-- 40 files changed, 1218 insertions(+), 473 deletions(-) create mode 100644 Article/PythonBasis/python6/1.md rename Article/{python6/3.md => PythonBasis/python6/2.md} (66%) rename Article/{python6/4.md => PythonBasis/python6/3.md} (56%) rename Article/{python6/2.md => PythonBasis/python6/4.md} (87%) rename Article/{ => PythonBasis}/python6/5.md (84%) create mode 100644 Article/PythonBasis/python6/Preface.md rename Article/{ => PythonBasis}/python7/1.md (91%) rename Article/{ => PythonBasis}/python7/2.md (100%) rename Article/{ => PythonBasis}/python7/3.md (91%) rename Article/{ => PythonBasis}/python7/4.md (70%) rename Article/{ => PythonBasis}/python7/5.md (100%) create mode 100644 Article/PythonBasis/python7/Preface.md rename Article/{python9 => PythonBasis/python8}/1.md (54%) create mode 100644 Article/PythonBasis/python8/2.md create mode 100644 Article/PythonBasis/python8/3.md create mode 100644 Article/PythonBasis/python8/4.md create mode 100644 Article/PythonBasis/python8/5.md create mode 100644 Article/PythonBasis/python8/6.md rename Article/{python9/5.md => PythonBasis/python8/7.md} (82%) rename Article/{python9/6.md => PythonBasis/python8/8.md} (92%) rename Article/{python9/4.md => PythonBasis/python8/9.md} (62%) create mode 100644 Article/PythonBasis/python8/Preface.md create mode 100644 "Article/PythonBasis/python8/media/\351\235\242\345\220\221\345\257\271\350\261\241.png" rename Article/{python8 => PythonBasis/python9}/1.md (100%) rename Article/{python8 => PythonBasis/python9}/2.md (100%) rename Article/{python8 => PythonBasis/python9}/3.md (100%) rename Article/{python8 => PythonBasis/python9}/4.md (100%) rename Article/{python8 => PythonBasis/python9}/5.md (100%) rename Article/{python8 => PythonBasis/python9}/Preface.md (100%) delete mode 100644 Article/python6/1.md delete mode 100644 Article/python6/Preface.md delete mode 100644 Article/python7/Preface.md delete mode 100644 Article/python9/2.md delete mode 100644 Article/python9/3.md delete mode 100644 Article/python9/Preface.md diff --git a/Article/PythonBasis/python4/Preface.md b/Article/PythonBasis/python4/Preface.md index 692d38ba..318dc462 100644 --- a/Article/PythonBasis/python4/Preface.md +++ b/Article/PythonBasis/python4/Preface.md @@ -2,7 +2,7 @@ 上一篇文章出现了个明显的知识点错误,不过感谢有个网友的提出,及时进行了修改。也希望各位多多包涵。 -(2019年09月01日15:28:00) 在修改文章的时候,发现自己两年前写的像屎一样, 忍不住还在群里吐槽一番。 +>注:(2019年09月01日15:28:00) 在修改文章的时候,发现自己两年前写的像屎一样, 忍不住还在群里吐槽一番。 ![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-09-01-072923.png) diff --git a/Article/PythonBasis/python5/Cycle.md b/Article/PythonBasis/python5/Cycle.md index 5eb983dd..d8567c35 100644 --- a/Article/PythonBasis/python5/Cycle.md +++ b/Article/PythonBasis/python5/Cycle.md @@ -1,12 +1,31 @@ # 二、循环语句 # -一般编程语言都有循环语句,循环语句允许我们执行一个语句或语句组多次。 + + +## 1、什么是循环语句 ## + +一般编程语言都有循环语句,为什么呢? + +那就问一下自己,我们弄程序是为了干什么? + +那肯定是为了方便我们工作,优化我们的工作效率啊。 + +而计算机和人类不同,计算机不怕苦也不怕累,也不需要休息,可以一直做。 + +你要知道,计算机最擅长就是做重复的事情。 + +所以这时候需要用到循环语句,循环语句允许我们执行一个语句或语句组多次。 循环语句的一般形式如下: ![python循环语句](http://upload-images.jianshu.io/upload_images/2136918-eaaae2fbfec3330f?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -Python 提供了 for 循环和 while 循环,当然还有一些控制循环的语句: + +在 Python 提供了 for 循环和 while 循环。 + +这里又有一个问题了,如果我想让他运行了一百次之后停止,那该怎么做呢? + +这时候需要用到一些控制循环的语句: |循环控制语句|描述| |------|------| @@ -14,128 +33,249 @@ Python 提供了 for 循环和 while 循环,当然还有一些控制循环的 |continue|在语句块执行过程中终止当前循环,跳出该次循环,执行下一次循环| |pass|pass 是空语句,是为了保持程序结构的完整性| +这些控制语句是为了让我们告诉程序什么时候停止,什么时候不运行这次循环。 -## 1、While 循环语句 ## -```python -count = 1 -sum = 0 -while (count <= 100): - sum = sum + count - count = count + 1 -print(sum) -``` -输出的结果: +## 2、 for 循环语句 ## -```txt -5050 -``` +我们先来看下 for 循环语句。 -当然 while 语句时还有另外两个重要的命令 continue,break 来跳过循环,continue 用于跳过该次循环,break 则是用于退出循环 +它的流程图基本如下: -比如,上面的例子是计算 1 到 100 所有整数的和,当我们需要判断 sum 大于 1000 的时候,不在相加时,可以用到 break ,退出整个循环 -```python -count = 1 -sum = 0 -while (count <= 100): - sum = sum + count - if ( sum > 1000): #当 sum 大于 1000 的时候退出循环 - break - count = count + 1 -print(sum) -``` +![for循环的流程图](http://upload-images.jianshu.io/upload_images/2136918-a0728c1c488238af?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -输出的结果: -```txt -1035 +基本的语法格式: + +```python +for iterating_var in sequence: + statements(s) ``` -有时候,我们只想统计 1 到 100 之间的奇数和,那么也就是说当 count 是偶数,也就是双数的时候,我们需要跳出当次的循环,不想加,这时候可以用到 break +那么我们根据他的基本语法格式,随便写个例子测试一下: + ```python -count = 1 -sum = 0 -while (count <= 100): - if ( count % 2 == 0): # 双数时跳过输出 - count = count + 1 - continue - sum = sum + count - count = count + 1 -print(sum) +for letter in 'Hello 两点水': + print(letter) ``` -输出的语句: +输出的结果如下: ```txt -2500 +H +e +l +l +o + +两 +点 +水 ``` -在 Python 的 while 循环中,还可以使用 else 语句,while … else 在循环条件为 false 时执行 else 语句块 +从打印结果来看,它就是把字符串 `Hello 两点水` 一个一个字符的打印出来。 + +那如果我们把字符串换为字典 dict 呢? + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-09-07-094741.png) + +你会发现只打印了字典 dict 中的每一个 key 值。 + +很多时候,我都是建议大家学到一个新的知识点,都多去尝试。 + +你尝试一遍,自己观察出来的结论,好过别人说十遍。 + +如果你不知道怎么去试? + +可以根据我们的例子举一反三,比如上面的 for 循环,试了字符串,字典,那我们之前学的基本数据类型还有什么呢? + +不记得可以再返回去看看,可以把所有的基本类型都拿去尝试一下。 + +比如,你试了之后,会发现整数和浮点数是不可以直接放在 for 循环里面的。 + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-09-07-095313.png) -比如: + + + + + +## 3、 range() 函数 ## + +for 循环还常常和 range() 函数搭配使用的。 + +如果不知道 range() 函数 , 我们直接通过一段程序来理解。 ```python -count = 0 -while count < 5: - print (count) - count = count + 1 -else: - print (count) +for i in range(3): + print(i) ``` -输出的结果: +打印的结果为: -```txt +``` 0 1 2 -3 -4 -5 ``` -## 2、 for 循环语句 ## +可见,打印了 0 到 3 。 - for循环可以遍历任何序列的项目,如一个列表或者一个字符串 +使用 range(x) 函数,就可以生成一个从 0 到 x-1 的整数序列。 -它的流程图基本如下: +如果是 `range(a,b)` 函数,你可以生成了一个左闭右开的整数序列。 +其实例子中的 `range(3)` 可以写成 `range(0,3)`, 结果是一样的。 -![for循环的流程图](http://upload-images.jianshu.io/upload_images/2136918-a0728c1c488238af?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +其实使用 range() 函数,我们更多是为了把一段代码重复运行 n 次。 -基本的语法格式: +这里提个问题,你仔细观察 range() 函数,上面说到的不管是 1 个参数的,还是 2 个参数的都有什么共同的特点? + +不知道你们有没有发现,他都是每次递增 1 的。 + +`range(3)` 就是 0 ,1,2 ,每次递增 1 。 + +`range(3,6)` 就是 3 ,4 ,5 ,也是每次递增 1 的。 + +那能不能每次不递增 1 呢? + +比如我想递增 2 呢? + +在程序的编写中,肯定会遇到这样的需求的。而 python 发展至今,range 函数肯定也会有这种功能。 + +所以 range 函数还有一个三个参数的。 + +比如 `range(0,10,2) ` , 它的意思是:从 0 数到 10(不取 10 ),每次间隔为 2 。 + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-09-09-065854.png) + + + + + + +## 4、While 循环语句 ## + +While 循环和 for 循环的作用是一样的。 + +我们先来看看 While 循环语句的样子。 + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-09-07-083137.png) + +程序输出的结果是: + +```txt +5050 +``` + +这个例子是计算 1 到 100 所有整数的和。 + + + +## 5、for 循环和 whlie 循环的区别 ## + +之前也提到过了,如果一种语法能表示一个功能,那没必要弄两种语法来表示。 + +竟然都是循环,for 循环和 while 循环肯定有他们的区别的。 + +那什么时候才使用 for 循环和 while 循环呢? + +* for 循环主要用在迭代可迭代对象的情况。 + +* while 循环主要用在需要满足一定条件为真,反复执行的情况。 +(死循环+break 退出等情况。) + +* 部分情况下,for 循环和 while 循环可以互换使用。 + +例如: + +```python +for i in range(0, 10): + print(i) + + +i = 0 +while i < 10: + print(i) + i = i + 1 +``` + +虽然打印的结果是一样的,但是细细品味你会发现,他们执行的顺序和知道的条件是不同的。 + + + +## 6、嵌套循环 ## + +循环语句和条件语句一样,都是可以嵌套的。 + +具体的语法如下: + +**for 循环嵌套语法** ```python for iterating_var in sequence: + for iterating_var in sequence: + statements(s) statements(s) ``` -实例: +**while 循环嵌套语法** ```python -for letter in 'Hello 两点水': - print(letter) +while expression: + while expression: + statement(s) + statement(s) ``` -输出的结果如下: +除此之外,你也可以在循环体内嵌入其他的循环体,如在 while 循环中可以嵌入 for 循环, 反之,你可以在 for 循环中嵌入 while 循环 + +比如: + +当我们需要判断 sum 大于 1000 的时候,不在相加时,可以用到 break ,退出整个循环。 + +```python +count = 1 +sum = 0 +while (count <= 100): + sum = sum + count + if ( sum > 1000): #当 sum 大于 1000 的时候退出循环 + break + count = count + 1 +print(sum) +``` + +输出的结果: ```txt -H -e -l -l -o +1035 +``` -两 -点 -水 +有时候,我们只想统计 1 到 100 之间的奇数和,那么也就是说当 count 是偶数,也就是双数的时候,我们需要跳出当次的循环,不想加,这时候可以用到 break + +```python +count = 1 +sum = 0 +while (count <= 100): + if ( count % 2 == 0): # 双数时跳过输出 + count = count + 1 + continue + sum = sum + count + count = count + 1 +print(sum) ``` -有 while … else 语句,当然也有 for … else 语句啦,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while … else 也是一样。 +输出的语句: + +```txt +2500 +``` + +还有: ```python for num in range(10,20): # 迭代 10 到 20 之间的数字 @@ -163,28 +303,11 @@ for num in range(10,20): # 迭代 10 到 20 之间的数字 19 是一个质数 ``` -## 3、嵌套循环 ## - -Python 语言允许在一个循环体里面嵌入另一个循环。上面的实例也是使用了嵌套循环的,这里就不给出实例了。 - -具体的语法如下: -**for 循环嵌套语法** +当然,这里还用到了 `for … else` 语句。 -```python -for iterating_var in sequence: - for iterating_var in sequence: - statements(s) - statements(s) -``` +其实 for 循环中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行。 -**while 循环嵌套语法** +当然有 `for … else` ,也会有 `while … else` 。他们的意思都是一样的。 -```python -while expression: - while expression: - statement(s) - statement(s) -``` -除此之外,你也可以在循环体内嵌入其他的循环体,如在 while 循环中可以嵌入 for 循环, 反之,你可以在 for 循环中嵌入 while 循环 diff --git a/Article/PythonBasis/python5/If.md b/Article/PythonBasis/python5/If.md index caa2246a..d113f597 100644 --- a/Article/PythonBasis/python5/If.md +++ b/Article/PythonBasis/python5/If.md @@ -1,14 +1,19 @@ # 一、条件语句 # + +## 1、什么是条件语句 ## + + Python 条件语句跟其他语言基本一致的,都是通过一条或多条语句的执行结果( True 或者 False )来决定执行的代码块。 -Python 程序语言指定任何非 0 和非空(null)值为 True,0 或者 null为 False。 +Python 程序语言指定任何非 0 和非空(null)值为 True,0 或者 null 为 False。 执行的流程图如下: ![if语句流程图](http://upload-images.jianshu.io/upload_images/2136918-4ee2486190450a1a?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -## 1、if 语句的基本形式 ## + +## 2、if 语句的基本形式 ## Python 中,if 语句的基本形式如下: @@ -19,7 +24,7 @@ else: 执行语句…… ``` -前面也提到过,Python 语言有着严格的缩进要求,因此这里也需要注意缩进,也不要少写了冒号 `:` 。 +之前的章节也提到过,Python 语言有着严格的缩进要求,因此这里也需要注意缩进,也不要少写了冒号 `:` 。 if 语句的判断条件可以用>(大于)、<(小于)、==(等于)、>=(大于等于)、<=(小于等于)来表示其关系。 @@ -43,7 +48,7 @@ else : 不及格 ``` -上面也说道,非零数值、非空字符串、非空 list 等,判断为True,否则为False。因此也可以这样写: +上面也说到,非零数值、非空字符串、非空 list 等,判断为 True,否则为 False。因此也可以这样写: ```python num = 6 @@ -51,7 +56,27 @@ if num : print('Hello Python') ``` -## 2、if 语句多个判断条件的形式 ## +输出的结果如下: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-09-07-072713.png) + +可见,把结果打印出来了。 + +那如果我们把 `num ` 改为空字符串呢? + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-09-07-072941.png) + +很明显,空字符串是为 False 的,不符合条件语句,因此不会执行到 `print('Hello Python')` 这段代码。 + +还有再啰嗦一点,提醒一下,在条件判断代码中的冒号 `:` 后、下一行内容是一定要缩进的。不缩进是会报错的。 + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-09-07-073432.png) + +冒号和缩进是一种语法。它会帮助 Python 区分代码之间的层次,理解条件执行的逻辑及先后顺序。 + + + +## 3、if 语句多个判断条件的形式 ## 有些时候,我们的判断语句不可能只有两个,有些时候需要多个,比如上面的例子中大于 60 的为及格,那我们还要判断大于 90 的为优秀,在 80 到 90 之间的良好呢? @@ -94,9 +119,21 @@ else : 良好 ``` -## 3、if 语句多个条件同时判断 ## -Python 不像 Java 有 switch 语句,所以多个条件判断,只能用 elif 来实现,但是有时候需要多个条件需同时判断时,可以使用 or (或),表示两个条件有一个成立时判断条件成功;使用 and (与)时,表示只有两个条件同时成立的情况下,判断条件才成功。 + +## 4、if 语句多个条件同时判断 ## + +有时候我们会遇到多个条件的时候该怎么操作呢? + +比如说要求 java 和 python 的考试成绩要大于 80 分的时候才算优秀,这时候该怎么做? + +这时候我们可以结合 `or` 和 `and` 来使用。 + +or (或)表示两个条件有一个成立时判断条件成功 + +and (与)表示只有两个条件同时成立的情况下,判断条件才成功。 + +例如: ```python # -*-coding:utf-8-*- @@ -122,3 +159,20 @@ if ( java >= 80 and java < 90 ) or ( python >= 80 and python < 90): ``` 注意:if 有多个条件时可使用括号来区分判断的先后顺序,括号中的判断优先执行,此外 and 和 or 的优先级低于 >(大于)、<(小于)等判断符号,即大于和小于在没有括号的情况下会比与或要优先判断。 + +## 5、if 嵌套 ## + +if 嵌套是指什么呢? + +就跟字面意思差不多,指 if 语句中可以嵌套 if 语句。 + +比如上面说到的例子,也可以用 if 嵌套来写。 + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-09-07-080557.png) + +当然这只是为了说明 if 条件语句是可以嵌套的。如果是这个需求,我个人还是不太建议这样使用 if 嵌套的,因为这样代码量多了,而且嵌套太多,也不方便阅读代码。 + + + + + diff --git a/Article/PythonBasis/python5/Preface.md b/Article/PythonBasis/python5/Preface.md index ce4be8b1..34b1d5cc 100644 --- a/Article/PythonBasis/python5/Preface.md +++ b/Article/PythonBasis/python5/Preface.md @@ -1,10 +1,16 @@ # 前言 # -第一次建学习群,而且是 Python 的学习群,虽然之前深入学习和工作都是 Android 相关的,最近学起来 Python ,真的很好玩,所以创了个微信群,希望童鞋们进群学习讨论。也可以直接加我微`androidwed`拉进群。也欢迎大家在 [Gitbook](https://www.readwithu.com/) 中提出文章的不足。 +通常都听到别人说,计算机很牛逼,很聪明,其实计算机一点都不聪明,光是你要跟他沟通,都会气 shi 你,聪明的是在写程序的你。 -![Python学习群](http://upload-images.jianshu.io/upload_images/2136918-f3f0c60ce12e5a92?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +写程序就是跟计算机沟通,告诉它要做什么。 + +竟然是这样,那么肯定缺少不了一些沟通逻辑。比如你要告诉计算机在什么情况下做什么?或者在哪个时间点做什么? + +这都需要用到逻辑判断。这一章节,主要就是说这个。 # 目录 # -![草根学Python(五) 条件语句和循环语句](http://upload-images.jianshu.io/upload_images/2136918-32902eec93d9ffc1?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-09-09-%E6%9D%A1%E4%BB%B6%E8%AF%AD%E5%8F%A5%E5%92%8C%E5%BE%AA%E7%8E%AF%E8%AF%AD%E5%8F%A5.png) + + diff --git a/Article/PythonBasis/python6/1.md b/Article/PythonBasis/python6/1.md new file mode 100644 index 00000000..332f72e5 --- /dev/null +++ b/Article/PythonBasis/python6/1.md @@ -0,0 +1,101 @@ +# 一、Python 自定义函数的基本步骤 # + + + + +## 1、什么是函数 ## + +函数,其实我们一开始学 Python 的时候就接触过。 + +不过我们使用的大多数都是 Python 的内置函数。 + +比如基本每个章节都会出现的 `print()` 函数。 + +而现在,我们主要学习的是自定义函数。 + +**各位有没有想过为什么需要函数呢?** + +如果要想回答这个问题,我们需要先了解函数是什么? + +函数就是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 + +没错,函数其实就是把代码抽象出来的代码段。 + +那为什么要抽象出来呢? + +**方便我们使用,方便我们重复使用。** + +**函数的本质就是我们把一些数据喂给函数,让他内部消化,然后吐出你想要的东西,至于他怎么消化的,我们不需要知道,它内部解决。** + +怎么理解这句话呢? + +举个例子,好比每次用到的 print 函数,我们都知道这个函数的作用是可以把我们的数据输出到控制台,让我们看到。所以 `print('两点水')` , 我们想打印 `两点水` 出来,就把 `两点水` 这个数据喂给 `print` 函数,然后他就直接把结果打印到控制台上了。 + + + + + + + +## 2、怎么自定义函数 ## + +怎么自定义函数? + +要知道怎么定义函数,就要知道函数的组成部分是怎样的。 + +```python +def 函数名(参数1,参数2....参数n): + 函数体 + return 语句 +``` + +这就是 Python 函数的组成部分。 + +所以自定义函数,基本有以下规则步骤: + +* 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号() +* 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数 +* 函数的第一行语句可以选择性地使用文档字符串(用于存放函数说明) +* 函数内容以冒号起始,并且缩进 +* return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的 return 相当于返回 None。 + +语法示例: + +```python +def functionname( parameters ): + "函数_文档字符串" + function_suite + return [expression] +``` + +实例: + +1. def 定义一个函数,给定一个函数名 sum +2. 声明两个参数 num1 和 num2 +3. 函数的第一行语句进行函数说明:两数之和 +4. 最终 return 语句结束函数,并返回两数之和 + +```python +def sum(num1,num2): + "两数之和" + return num1+num2 + +# 调用函数 +print(sum(5,6)) +``` + +输出结果: + +```python +11 +``` + + + + + + + + + + diff --git a/Article/python6/3.md b/Article/PythonBasis/python6/2.md similarity index 66% rename from Article/python6/3.md rename to Article/PythonBasis/python6/2.md index 758ac4dc..bc3e8361 100644 --- a/Article/python6/3.md +++ b/Article/PythonBasis/python6/2.md @@ -1,6 +1,8 @@ -# 三、函数返回值 # +# 二、函数返回值 # -通过上面的学习,可以知道通过 return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。 +通过上面的学习,可以知道通过 return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。 + +**不带参数值的 return 语句返回 None。** 具体示例: @@ -51,4 +53,16 @@ print (tuple1) (2.0, 1) ``` -认真观察就可以发现,尽管从第一个输出值来看,返回了多个值,实际上是先创建了一个元组然后返回的。回忆一下,元组是可以直接用逗号来创建的,观察例子中的 ruturn ,可以发现实际上我们使用的是逗号来生成一个元组。 +认真观察就可以发现,尽管从第一个输出值来看,返回了多个值,实际上是先创建了一个元组然后返回的。 + +回忆一下,元组是可以直接用逗号来创建的,观察例子中的 ruturn ,可以发现实际上我们使用的是逗号来生成一个元组。 + +Python 语言中的函数返回值可以是多个,而其他语言都不行,这是Python 相比其他语言的简便和灵活之处。 + +**Python 一次接受多个返回值的数据类型就是元组。** + +不知道此刻你还记不记得元组的相关知识,如果不记得,建议现在立刻写几个例子回忆一下,比如如何获取元组的第一个元素出来。 + + + + diff --git a/Article/python6/4.md b/Article/PythonBasis/python6/3.md similarity index 56% rename from Article/python6/4.md rename to Article/PythonBasis/python6/3.md index e807b771..2d3b8ccd 100644 --- a/Article/python6/4.md +++ b/Article/PythonBasis/python6/3.md @@ -1,9 +1,28 @@ -# 四、函数的参数 # +# 三、函数的参数 # -## 1、默认值参数 ## + + + +## 1、函数的参数类型 ## + +设置与传递参数是函数的重点,而 Python 的函数对参数的支持非常的灵活。 + +主要的参数类型有:默认参数、关键字参数(位置参数)、不定长参数。 + +下面我们将一一了解这几种参数。 + + + + +## 2、默认参数 ## 有时候,我们自定义的函数中,如果调用的时候没有设置参数,需要给个默认值,这时候就需要用到默认值参数了。 +默认参数,只要在构造函数参数的时候,给参数赋值就可以了 + +例如: + + ```python # -*- coding: UTF-8 -*- @@ -27,9 +46,17 @@ print_user_info( '三点水' , 25 ) 昵称:三点水 年龄:25 性别:男 ``` -可以看到,当你设置了默认参数的时候,在调用函数的时候,不传该参数,就会使用默认值。但是这里需要注意的一点是:**只有在形参表末尾的那些参数可以有默认参数值**,也就是说你不能在声明函数形参的时候,先声明有默认值的形参而后声明没有默认值的形参。这是因为赋给形参的值是根据位置而赋值的。例如,def func(a, b=1) 是有效的,但是 def func(a=1, b) 是 无效 的。 +从输出结果可以看到,当你设置了默认参数的时候,在调用函数的时候,不传该参数,就会使用默认值。 + +但是这里需要注意的一点是:**只有在形参表末尾的那些参数可以有默认参数值**,也就是说你不能在声明函数形参的时候,先声明有默认值的形参而后声明没有默认值的形参。 -默认值参数就这样结束了吗?还没有的,细想一下,如果参数中是一个可修改的容器比如一个 lsit (列表)或者 dict (字典),那么我们使用什么来作为默认值呢?我们可以使用 None 作为默认值。就像下面这个例子一样: +这是因为赋给形参的值是根据位置而赋值的。例如,def func(a, b=1) 是有效的,但是 def func(a=1, b) 是 无效 的。 + +默认值参数就这样结束了吗? + +还没有的,细想一下,如果参数中是一个可修改的容器比如一个 lsit (列表)或者 dict (字典),那么我们使用什么来作为默认值呢? + +我们可以使用 None 作为默认值。就像下面这个例子一样: ```python # 如果 b 是一个 list ,可以使用 None 作为默认值 @@ -39,13 +66,21 @@ def print_info( a , b = None ): return; ``` -认真看下例子,会不会有这样的疑问呢?在参数中我们直接 `b=[]` 不就行了吗?也就是写成下面这个样子: +认真看下例子,会不会有这样的疑问呢?在参数中我们直接 `b=[]` 不就行了吗? + +也就是写成下面这个样子: ```python def print_info( a , b = [] ): return; ``` -对不对呢?运行一下也没发现错误啊,可以这样写吗?这里需要特别注意的一点:**默认参数的值是不可变的对象,比如None、True、False、数字或字符串**,如果你像上面的那样操作,当默认值在其他地方被修改后你将会遇到各种麻烦。这些修改会影响到下次调用这个函数时的默认值。 +对不对呢? + +运行一下也没发现错误啊,可以这样写吗? + +这里需要特别注意的一点:**默认参数的值是不可变的对象,比如None、True、False、数字或字符串**,如果你像上面的那样操作,当默认值在其他地方被修改后你将会遇到各种麻烦。 + +这些修改会影响到下次调用这个函数时的默认值。 示例如下: @@ -73,7 +108,9 @@ print_info(2) 认真观察,你会发现第二次输出的值根本不是你想要的,因此切忌不能这样操作。 -还有一点,有时候我就是不想要默认值啊,只是想单单判断默认参数有没有值传递进来,那该怎么办?我们可以这样做: +还有一点,有时候我就是不想要默认值啊,只是想单单判断默认参数有没有值传递进来,那该怎么办? + +我们可以这样做: ```python _no_value =object() @@ -83,15 +120,25 @@ def print_info( a , b = _no_value ): print('b 没有赋值') return; ``` -这里的 `object` 是python中所有类的基类。 你可以创建 `object` 类的实例,但是这些实例没什么实际用处,因为它并没有任何有用的方法, 也没有任何实例数据(因为它没有任何的实例字典,你甚至都不能设置任何属性值)。 你唯一能做的就是测试同一性。也正好利用这个特性,来判断是否有值输入。 -## 2、关键字参数 ## +这里的 `object` 是 python 中所有类的基类。 你可以创建 `object` 类的实例,但是这些实例没什么实际用处,因为它并没有任何有用的方法, 也没有任何实例数据(因为它没有任何的实例字典,你甚至都不能设置任何属性值)。 你唯一能做的就是测试同一性。也正好利用这个特性,来判断是否有值输入。 + + + + +## 3、关键字参数(位置参数) ## + +一般情况下,我们需要给函数传参的时候,是要按顺序来的,如果不对应顺序,就会传错值。 + +不过在 Python 中,可以通过参数名来给函数传递参数,而不用关心参数列表定义时的顺序,这被称之为关键字参数。 + +使用关键参数有两个优势 : -在 Python 中,可以通过参数名来给函数传递参数,而不用关心参数列表定义时的顺序,这被称之为关键字参数。使用关键参数有两个优势 : +* 由于我们不必担心参数的顺序,使用函数变得更加简单了。 -一、由于我们不必担心参数的顺序,使用函数变得更加简单了。 +* 假设其他参数都有默认值,我们可以只给我们想要的那些参数赋值 -二、假设其他参数都有默认值,我们可以只给我们想要的那些参数赋值 +具体看例子: ```python # -*- coding: UTF-8 -*- @@ -117,10 +164,19 @@ print_user_info( name = '两点水' ,sex = '女', age = 18 ) 昵称:两点水 年龄:18 性别:女 ``` -## 3、不定长参数 ## -有时我们在设计函数接口的时候,可会需要可变长的参数。也就是说,我们事先无法确定传入的参数个数。Python 提供了一种元组的方式来接受没有直接定义的参数。这种方式在参数前边加星号 `*` 。如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。 + + +## 4、不定长参数 ## + +或许有些时候,我们在设计函数的时候,我们有时候无法确定传入的参数个数。 + +那么我们就可以使用不定长参数。 + +Python 提供了一种元组的方式来接受没有直接定义的参数。这种方式在参数前边加星号 `*` 。 + +如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。 例如: @@ -146,10 +202,12 @@ print_user_info( '两点水' ,18 , '女', '打篮球','打羽毛球','跑步') 昵称:两点水 年龄:18 性别:女 爱好:('打篮球', '打羽毛球', '跑步') ``` -通过输出的结果可以知道,`*hobby`是可变参数,且 hobby其实就是一个 tuple (元祖) +通过输出的结果可以知道,`*hobby`是可变参数,且 hobby 其实就是一个 tuple (元祖) + +可变长参数也支持关键字参数(位置参数),没有被定义的关键参数会被放到一个字典里。 -可变长参数也支持关键参数,没有被定义的关键参数会被放到一个字典里。这种方式即是在参数前边加 `**`,更改上面的示例如下: +这种方式即是在参数前边加 `**`,更改上面的示例如下: ```python @@ -177,7 +235,8 @@ print_user_info( name = '两点水' , age = 18 , sex = '女', hobby = ('打篮 通过对比上面的例子和这个例子,可以知道,`*hobby`是可变参数,且 hobby其实就是一个 tuple (元祖),`**hobby`是关键字参数,且 hobby 就是一个 dict (字典) -## 4、只接受关键字参数 ## + +## 5、只接受关键字参数 ## 关键字参数使用起来简单,不容易参数出错,那么有些时候,我们定义的函数希望某些参数强制使用关键字参数传递,这时候该怎么办呢? @@ -201,6 +260,7 @@ print_user_info( name = '两点水' ,age = 18 , sex = '女' ) print_user_info('两点水',age='22',sex='男') ``` -通过例子可以看,如果 `age` , `sex` 不适用关键字参数是会报错的。 +通过例子可以看,如果 `age` , `sex` 不使用关键字参数是会报错的。 + +很多情况下,使用强制关键字参数会比使用位置参数表意更加清晰,程序也更加具有可读性。使用强制关键字参数也会比使用 `**kw` 参数更好且强制关键字参数在一些更高级场合同样也很有用。 -很多情况下,使用强制关键字参数会比使用位置参数表意更加清晰,程序也更加具有可读性。使用强制关键字参数也会比使用 `**kw` 参数更好且强制关键字参数在一些更高级场合同样也很有用。 \ No newline at end of file diff --git a/Article/python6/2.md b/Article/PythonBasis/python6/4.md similarity index 87% rename from Article/python6/2.md rename to Article/PythonBasis/python6/4.md index 76ba52c2..e9b7b6e4 100644 --- a/Article/python6/2.md +++ b/Article/PythonBasis/python6/4.md @@ -1,4 +1,4 @@ -# 二、函数传值问题 # +# 四、函数传值问题 # 先看一个例子: @@ -18,12 +18,17 @@ print( b ) 1 ``` -这里可能有些人会有疑问,为啥不是通过函数`chagne_number`更改了 b -的值吗?为啥没有变化,输出的结果还是 1 ,这个问题很多编程语言都会讲到,原理解释也是差不多的。 +先看看运行的结果? + +想一下为什么打印的结果是 1 ,而不是 1000 ? + +其实把问题归根结底就是,为什么通过函数 `chagne_number` 没有更改到 b 的值? + +这个问题很多编程语言都会讲到,原理解释也是差不多的。 这里主要是函数参数的传递中,传递的是类型对象,之前也介绍了 Python 中基本的数据类型等。而这些类型对象可以分为可更改类型和不可更改的类型 -在 Python 中,字符串,整形,浮点型,tuple 是不可更改的对象,而 list , dict 等是可以更改的对象。 +**在 Python 中,字符串,整形,浮点型,tuple 是不可更改的对象,而 list , dict 等是可以更改的对象。** 例如: @@ -78,7 +83,6 @@ def chagne_list( b ): b = [1,2,3,4,5] chagne_list( b ) print( '最后输出 b 的值:{}' .format( b ) ) - ``` 输出的结果: @@ -88,3 +92,5 @@ print( '最后输出 b 的值:{}' .format( b ) ) 函数中 b 赋值后的值:[1, 2, 3, 4, 5, 1000] 最后输出 b 的值:[1, 2, 3, 4, 5, 1000] ``` + + diff --git a/Article/python6/5.md b/Article/PythonBasis/python6/5.md similarity index 84% rename from Article/python6/5.md rename to Article/PythonBasis/python6/5.md index 34982e9f..4da7b8ab 100644 --- a/Article/python6/5.md +++ b/Article/PythonBasis/python6/5.md @@ -1,6 +1,8 @@ # 五、匿名函数 # -有没有想过定义一个很短的回调函数,但又不想用 `def` 的形式去写一个那么长的函数,那么有没有快捷方式呢?答案是有的。 +有没有想过定义一个很短的回调函数,但又不想用 `def` 的形式去写一个那么长的函数,那么有没有快捷方式呢? + +答案是有的。 python 使用 lambda 来创建匿名函数,也就是不再使用 def 语句这样标准的形式定义一个函数。 @@ -57,4 +59,5 @@ print( sum2( 1 ) ) 10001 ``` -这主要在于 lambda 表达式中的 num2 是一个自由变量,在运行时绑定值,而不是定义时就绑定,这跟函数的默认值参数定义是不同的。所以建议还是遇到这种情况还是使用第一种解法。 \ No newline at end of file +**这主要在于 lambda 表达式中的 num2 是一个自由变量,在运行时绑定值,而不是定义时就绑定,这跟函数的默认值参数定义是不同的。所以建议还是遇到这种情况还是使用第一种解法。** + diff --git a/Article/PythonBasis/python6/Preface.md b/Article/PythonBasis/python6/Preface.md new file mode 100644 index 00000000..8b6f2210 --- /dev/null +++ b/Article/PythonBasis/python6/Preface.md @@ -0,0 +1,13 @@ +# 前言 # + +函数这个章节内容有点多,对于新手,也有些不好理解。建议各位多看几篇,多敲几次代码。 + +最后这是我的个人微信号,大家可以添加一下,交个朋友,一起讨论。 + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-07-070041.jpg) + +# 目录 # + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-07-%E5%87%BD%E6%95%B0.png) + + diff --git a/Article/python7/1.md b/Article/PythonBasis/python7/1.md similarity index 91% rename from Article/python7/1.md rename to Article/PythonBasis/python7/1.md index b9f9df2c..61bbff4b 100644 --- a/Article/python7/1.md +++ b/Article/PythonBasis/python7/1.md @@ -4,7 +4,9 @@ 比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历这个 list 或 tuple ,这种遍历就是迭代。 -可是,Python 的 `for` 循环抽象程度要高于 Java 的 `for` 循环的,为什么这么说呢?因为 Python 的 `for` 循环不仅可以用在 list 或tuple 上,还可以作用在其他可迭代对象上。也就是说,只要是可迭代的对象,无论有没有下标,都是可以迭代的。 +可是,Python 的 `for` 循环抽象程度要高于 Java 的 `for` 循环的,为什么这么说呢?因为 Python 的 `for` 循环不仅可以用在 list 或tuple 上,还可以作用在其他可迭代对象上。 + +也就是说,只要是可迭代的对象,无论有没有下标,都是可以迭代的。 比如: @@ -59,3 +61,5 @@ name age sex 2 b 3 c ``` + + diff --git a/Article/python7/2.md b/Article/PythonBasis/python7/2.md similarity index 100% rename from Article/python7/2.md rename to Article/PythonBasis/python7/2.md diff --git a/Article/python7/3.md b/Article/PythonBasis/python7/3.md similarity index 91% rename from Article/python7/3.md rename to Article/PythonBasis/python7/3.md index 126edbcd..77fb5db6 100644 --- a/Article/python7/3.md +++ b/Article/PythonBasis/python7/3.md @@ -18,9 +18,13 @@ print(list1) [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] ``` -这个其实在之前也有提到过:比如有个例子,打印九九乘法表,用这个方法其实就几句代码就可以了,具体可以看之前的这个章节:[条件语句和循环语句综合实例](https://www.readwithu.com/python5/Example.html) +这个其实在之前也有提到过,打印九九乘法表,用这个方法其实就几句代码就可以了,具体可以看之前的这个章节:[条件语句和循环语句综合实例](../python5/Example.md) -但是,如果用到 list 生成式,可以一句代码就生成九九乘法表了。具体看代码: +但是,如果用到 list 生成式,可以一句代码就生成九九乘法表了。 + +你没听错,就是一句代码。 + +具体实现: ```python print('\n'.join([' '.join ('%dx%d=%2d' % (x,y,x*y) for x in range(1,y+1)) for y in range(1,10)])) @@ -102,3 +106,5 @@ print(lsit1) ``` 其实知道了 list 生成式是怎样组合的,就不难理解这个东西了。因为 list 生成式只是把之前学习的知识点进行了组合,换成了一种更简洁的写法而已。 + + diff --git a/Article/python7/4.md b/Article/PythonBasis/python7/4.md similarity index 70% rename from Article/python7/4.md rename to Article/PythonBasis/python7/4.md index 684c0e96..fe95fe1e 100644 --- a/Article/python7/4.md +++ b/Article/PythonBasis/python7/4.md @@ -2,15 +2,21 @@ ## 1、为什么需要生成器 ## -通过上面的学习,可以知道列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含 1000 万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 +通过上面的学习,可以知道列表生成式,我们可以直接创建一个列表。 -所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的 list,从而节省大量的空间。在 Python 中,这种一边循环一边计算的机制,称为生成器:generator。 +但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含 1000 万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 + +**所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?** + +这样就不必创建完整的 list,从而节省大量的空间。 + +**在 Python 中,这种一边循环一边计算的机制,称为生成器:generator。** 在 Python 中,使用了 yield 的函数被称为生成器(generator)。 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 -在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。 +在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值。并在下一次执行 next()方法时从当前位置继续运行。 那么如何创建一个生成器呢? @@ -31,7 +37,11 @@ print(gen) at 0x0000000002734A40> ``` -创建 List 和 generator 的区别仅在于最外层的 `[]` 和 `()` 。但是生成器并不真正创建数字列表, 而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生” ( yield ) 出来。 生成器表达式使用了“惰性计算” ( lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调用 call by need 的方式翻译为惰性更好一些),只有在检索时才被赋值( evaluated ),所以在列表比较长的情况下使用内存上更有效。 +创建 List 和 generator 的区别仅在于最外层的 `[]` 和 `()` 。 + +但是生成器并不真正创建数字列表, 而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生” ( yield ) 出来。 + +生成器表达式使用了“惰性计算” ( lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调用 call by need 的方式翻译为惰性更好一些),只有在检索时才被赋值( evaluated ),所以在列表比较长的情况下使用内存上更有效。 那么竟然知道了如何创建一个生成器,那么怎么查看里面的元素呢? @@ -55,7 +65,11 @@ for num in gen : 上面也提到,创建生成器最简单最简单的方法就是把一个列表生成式的 `[]` 改成 `()`。为啥突然来个以函数的形式来创建呢? -其实生成器也是一种迭代器,但是你只能对其迭代一次。这是因为它们并没有把所有的值存在内存中,而是在运行时生成值。你通过遍历来使用它们,要么用一个“for”循环,要么将它们传递给任意可以进行迭代的函数和结构。而且实际运用中,大多数的生成器都是通过函数来实现的。那么我们该如何通过函数来创建呢? +其实生成器也是一种迭代器,但是你只能对其迭代一次。 + +这是因为它们并没有把所有的值存在内存中,而是在运行时生成值。你通过遍历来使用它们,要么用一个“for”循环,要么将它们传递给任意可以进行迭代的函数和结构。 + +而且实际运用中,大多数的生成器都是通过函数来实现的。那么我们该如何通过函数来创建呢? 先不急,来看下这个例子: @@ -119,9 +133,9 @@ for x in fibon(1000000): 运行的效果: -![计算斐波那契数列的生成器](http://upload-images.jianshu.io/upload_images/2136918-304e50af22b787ce?imageMogr2/auto-orient/strip) +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-07-%E8%AE%A1%E7%AE%97%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97%E7%9A%84%E7%94%9F%E6%88%90%E5%99%A8.gif) -你看,运行一个这么打的参数,也不会说有卡死的状态,因为这种方式不会使用太大的资源。这里,最难理解的就是 generator 和函数的执行流程不一样。函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成 generator 的函数,在每次调用 next() 的时候执行,遇到 yield语句返回,再次执行时从上次返回的 yield 语句处继续执行。 +你看,运行一个这么大的参数,也不会说有卡死的状态,因为这种方式不会使用太大的资源。这里,最难理解的就是 generator 和函数的执行流程不一样。函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成 generator 的函数,在每次调用 next() 的时候执行,遇到 yield语句返回,再次执行时从上次返回的 yield 语句处继续执行。 比如这个例子: @@ -189,3 +203,5 @@ for t in triangles( 10 ): # 直接修改函数名即可运行 [1, 8, 28, 56, 70, 56, 28, 8, 1] [1, 9, 36, 84, 126, 126, 84, 36, 9, 1] ``` + + diff --git a/Article/python7/5.md b/Article/PythonBasis/python7/5.md similarity index 100% rename from Article/python7/5.md rename to Article/PythonBasis/python7/5.md diff --git a/Article/PythonBasis/python7/Preface.md b/Article/PythonBasis/python7/Preface.md new file mode 100644 index 00000000..1646e388 --- /dev/null +++ b/Article/PythonBasis/python7/Preface.md @@ -0,0 +1,11 @@ +# 前言 # + +这篇内容挺多的,而且比内容不好理解。或许新手看完后,还会一脸懵逼,不过这是正常的,如果你看完后,是迷糊的,那么建议你继续学习后面的内容,等学完,再回来看几次。 + +注:这也是我第二次修改内容没有改过的章节。 + +# 目录 # + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-07-%E8%BF%AD%E4%BB%A3%E5%99%A8%E5%92%8C%E7%94%9F%E6%88%90%E5%99%A8.png) + + diff --git a/Article/python9/1.md b/Article/PythonBasis/python8/1.md similarity index 54% rename from Article/python9/1.md rename to Article/PythonBasis/python8/1.md index e40cb10d..569b4ab5 100644 --- a/Article/python9/1.md +++ b/Article/PythonBasis/python8/1.md @@ -1,11 +1,23 @@ # 一、面向对象的概念 # -Python 是一门面向对象的语言, 面向对象是一种抽象,抽象是指用分类的眼光去看世界的一种方法。 用 JAVA 的编程思想来说就是:万事万物皆对象。也就是说在面向对象中,把构成问题事务分解成各个对象。 -面向对象有三大特性,封装、继承和多态。 ## 1、面向对象的两个基本概念 ## +编程语言中,一般有两种编程思维,面向过程和面向对象。 + +面向过程,看重的是解决问题的过程。 + +这好比我们解决日常生活问题差不多,分析解决问题的步骤,然后一步一步的解决。 + +而面向对象是一种抽象,抽象是指用分类的眼光去看世界的一种方法。 + +Python 就是一门面向对象的语言, + +如果你学过 Java ,就知道 Java 的编程思想就是:万事万物皆对象。Python 也不例外,在解决实际问题的过程中,可以把构成问题事务分解成各个对象。 + +面向对象都有两个基本的概率,分别是类和对象。 + * **类** 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 @@ -15,8 +27,13 @@ Python 是一门面向对象的语言, 面向对象是一种抽象,抽象是 通过类定义的数据结构实例 + + + ## 2、面向对象的三大特性 ## +面向对象的编程语言,也有三大特性,继承,多态和封装性。 + * **继承** 即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。 @@ -30,3 +47,8 @@ Python 是一门面向对象的语言, 面向对象是一种抽象,抽象是 * **封装性** “封装”就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类);封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。 + + +**如果你是初次接触面向对象的编程语言,看到这里还一脸懵逼,不要紧,这是正常的。下面我们会通过大量的例子逐步了解 Python 的面向对象的知识。** + + diff --git a/Article/PythonBasis/python8/2.md b/Article/PythonBasis/python8/2.md new file mode 100644 index 00000000..799eb399 --- /dev/null +++ b/Article/PythonBasis/python8/2.md @@ -0,0 +1,83 @@ +# 二、类的定义和调用 # + + + +## 1、怎么理解类? ## + +类是什么? + +个人认为理解类,最简单的方式就是:类是一个变量和函数的集合。 + +可以看下下面的这张图。 + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-08-034102.png) + +这张图很好的诠释了类,就是把变量和函数包装在一起。 + +当然我们包装也不是毫无目的的包装,我们会把同性质的包装在一个类里,这样就方便我们重复使用。 + +所以学到现在,你会发现很多编程的设计,都是为了我们能偷懒,重复使用。 + + + + + + +## 2、怎么定义类 ## + +知道了类是什么样子的,我们接下来就要学习怎么去定义类了。 + +类定义语法格式如下: + +```python +class ClassName(): + + . + . + . + +``` + +可以看到,我们是用 `class` 语句来自定义一个类的,其实这就好比我们是用 `def` 语句来定义一个函数一样。 + +竟然说类是变量和方法的集合包,那么我们来创建一个类。 + +```python +class ClassA(): + var1 = 100 + var2 = 0.01 + var3 = '两点水' + + def fun1(): + print('我是 fun1') + + def fun2(): + print('我是 fun1') + + def fun3(): + print('我是 fun1') +``` + +你看,上面我们就定义了一个类,类名叫做 `ClassA` , 类里面的变量我们称之为属性,那么就是这个类里面有 3 个属性,分别是 `var1` , `var2` 和 `var3` 。除此之外,类里面还有 3 个类方法 `fun1()` , `fun2()` 和 `fun3()` 。 + + + + + +## 3、怎么调用类属性和类方法 ## + + +我们定义了类之后,那么我们怎么调用类里面的属性和方法呢? + +直接看下图: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-08-083155.png) + +这里就不文字解释了(注:做图也不容易啊,只有写过技术文章才知道,这系列文章,多耗时) + +好了,知道怎么调用之后,我们尝试一下: + + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-08-085918.png) + + diff --git a/Article/PythonBasis/python8/3.md b/Article/PythonBasis/python8/3.md new file mode 100644 index 00000000..358f0bee --- /dev/null +++ b/Article/PythonBasis/python8/3.md @@ -0,0 +1,57 @@ +# 三、类方法 # + + +## 1、类方法如何调用类属性 ## + +通过上面我们已经会定义类了,那么这里讲一下在同一个类里,类方法如何调用类属性的。 + +直接看个例子吧: + + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-08-110451.png) + +注意看,在类方法上面多了个 `@classmethod` ,这是干嘛用的呢? + +这是用于声明下面的函数是类函数。其实从名字就很好理解了。 + +class 就是类,method 就是方法。 + +那是不是一定需要注明这个呢? + +答案是是的。 + +如果你没使用,是会报错的。 + + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-08-110822.png) + +如果没有声明是类方法,方法参数中就没有 `cls` , 就没法通过 `cls` 获取到类属性。 + +因此类方法,想要调用类属性,需要以下步骤: + +* 在方法上面,用 `@classmethon` 声明该方法是类方法。只有声明了是类方法,才能使用类属性 +* 类方法想要使用类属性,在第一个参数中,需要写上 `cls` , cls 是 class 的缩写,其实意思就是把这个类作为参数,传给自己,这样就可以使用类属性了。 +* 类属性的使用方式就是 `cls.变量名` + + +记住喔,无论是 `@classmethon` 还是 `cls` ,都是不能省去的。 + +省了都会报错。 + + + + + +## 2、类方法传参 ## + +上面我们学习了类方法如何调用类属性,那么类方法如何传参呢? + +其实很简单,跟普通的函数一样,直接增加参数就好了。 + +这个就直接上例子了: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-08-113458.png) + + + + diff --git a/Article/PythonBasis/python8/4.md b/Article/PythonBasis/python8/4.md new file mode 100644 index 00000000..2dea4f4b --- /dev/null +++ b/Article/PythonBasis/python8/4.md @@ -0,0 +1,32 @@ +# 四、修改和增加类属性 # + + +## 1、从内部增加和修改类属性 ## + +来,我们先来温习一下类的结构。 + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-08-034102.png) + +看着这个结构,提一个问题,如何修改类属性,也就是类里面的变量? + +从类结构来看,我们可以猜测,从类方法来修改,也就是从类内部来修改和增加类属性。 + +看下具体的实例: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-08-120146.png) + +这里还是强调一下,例子还是要自己多写,不要只看,自己运行, 看效果。多想。 + + + + +## 2、从外部增加和修改类属性 ## + +我们刚刚看了通过类方法来修改类的属性,这时我们看下从外部如何修改和增加类属性。 + +例子如下: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-08-121135.png) + + + diff --git a/Article/PythonBasis/python8/5.md b/Article/PythonBasis/python8/5.md new file mode 100644 index 00000000..1f92bcf0 --- /dev/null +++ b/Article/PythonBasis/python8/5.md @@ -0,0 +1,171 @@ +# 五、类和对象 # + + + + +## 1、类和对象之间的关系 ## + +这部分内容主要讲类和对象,我们先来说说类和对象之间的关系。 + +**类是对象的模板** + +我们得先有了类,才能制作出对象。 + +类就相对于工厂里面的模具,对象就是根据模具制造出来的产品。 + +**从模具变成产品的过程,我们就称为类的实例化。** + +**类实例化之后,就变成对象了。也就是相当于例子中的产品。** + + + + + +## 2、类的实例化 ## + +这里强调一下,类的实例化和直接使用类的格式是不一样的。 + +之前我们就学过,直接使用类格式是这样的: + +```python +class ClassA(): + var1 = '两点水' + + @classmethod + def fun1(cls): + print('var1 值为:' + cls.var1) + + +ClassA.fun1() +``` + +而类的实例化是怎样的呢? + +是这样的,可以仔细对比一下,类的实例化和直接使用类的格式有什么不同? + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-025401.png) + + +主要的不同点有: + +* 类方法里面没有了 `@classmethod` 声明了,不用声明他是类方法 +* 类方法里面的参数 `cls` 改为 `self` +* 类的使用,变成了先通过 `实例名 = 类()` 的方式实例化对象,为类创建一个实例,然后再使用 `实例名.函数()` 的方式调用对应的方法 ,使用 `实例名.变量名` 的方法调用类的属性 + + +这里说明一下,类方法的参数为什么 `cls` 改为 `self` ? + +其实这并不是说一定要写这个,你改为什么字母,什么名字都可以。 + +不妨试一下: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-032030.png) + +你看,把 `self` 改为 `aaaaaaaa` 还是可以一样运行的。 + +只不过使用 `cls` 和 `self` 是我们的编程习惯,这也是我们的编程规范。 + +因为 cls 是 class 的缩写,代表这类 , 而 self 代表这对象的意思。 + +所以啊,这里我们实例化对象的时候,就使用 self 。 + +**而且 self 是所有类方法位于首位、默认的特殊参数。** + +除此之外,在这里,还要强调一个概念,当你把类实例化之后,里面的属性和方法,就不叫类属性和类方法了,改为叫实例属性和实例方法,也可以叫对象属性和对象方法。 + +为什么要这样强调呢? + +**因为一个类是可以创造出多个实例对象出来的。** + +你看下面的例子: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-034453.png) + +我不仅能用这个类创建 a 对象,还能创建 b 对象 + + + + + +## 3、实例属性和类属性 ## + +一个类可以实例化多个对象出来。 + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-040408.png) + +根据这个图,我们探究一下实例对象的属性和类属性之间有什么关系呢? + +**先提出第一个问题,如果类属性改变了,实例属性会不会跟着改变呢?** + +还是跟以前一样,提出了问题,我们直接用程序来验证就好。 + +看程序: + + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-061015.png) + + +从程序运行的结果来看,**类属性改变了,实例属性会跟着改变。** + +这很好理解,因为我们的实例对象就是根据类来复制出来的,类属性改变了,实例对象的属性也会跟着改变。 + +**那么相反,如果实例属性改变了,类属性会改变吗?** + +答案当然是不能啦。因为每个实例都是单独的个体,不能影响到类的。 + +具体我们做下实验: + + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-062437.png) + +可以看到,**不管实例对象怎么修改属性值,对类的属性还是没有影响的。** + + + + +## 4、实例方法和类方法 ## + +那这里跟上面一样,还是提出同样的问题。 + +**如果类方法改变了,实例方法会不会跟着改变呢?** + +看下下面的例子: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-063242.png) + +这里建议我的例子,各位都要仔细看一下,自己重新敲一遍。相信为什么要这么做,这么证明。 + +还是那句话多想,多敲。 + +回归正题,从运行的结果来看,类方法改变了,实例方法也是会跟着改变的。 + +在这个例子中,我们需要改变类方法,就用到了**类的重写**。 + +我们使用了 `类.原始函数 = 新函数` 就完了类的重写了。 + +要注意的是,这里的赋值是在替换方法,并不是调用函数。所以是不能加上括号的,也就是 `类.原始函数() = 新函数()` 这个写法是不对的。 + + +**那么如果实例方法改变了,类方法会改变吗?** + +如果这个问题我们需要验证的话,是不是要重写实例的方法,然后观察结果,看看类方法有没有改变,这样就能得出结果了。 + + +可是我们是不能重写实例方法。 + +你看,会直接报错。 + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-064303.png) + + + + + + + + + + + + + diff --git a/Article/PythonBasis/python8/6.md b/Article/PythonBasis/python8/6.md new file mode 100644 index 00000000..71152336 --- /dev/null +++ b/Article/PythonBasis/python8/6.md @@ -0,0 +1,146 @@ +# 六、初始化函数 # + + + +## 1、什么是初始化函数 ## + +初始化函数的意思是,当你创建一个实例的时候,这个函数就会被调用。 + +比如: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-071102.png) + +当代码在执行 `a = ClassA()` 的语句时,就自动调用了 `__init__(self)` 函数。 + +**而这个 `__init__(self)` 函数就是初始化函数,也叫构造函数。** + +初始化函数的写法是固定的格式:中间是 `init`,意思是初始化,然后前后都要有【两个下划线】,然后 `__init__()` 的括号中,第一个参数一定要写上 `self`,不然会报错。 + +构造函数(初始化函数)格式如下: + +```python +def __init__(self,[...): +``` + + +初始化函数一样可以传递参数的,例如: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-073421.png) + + + + +## 2、析构函数 ## + +竟然一个在创建的时候,会调用构造函数,那么理所当然,这个当一个类销毁的时候,就会调用析构函数。 + +析构函数语法如下: + +```python +def __del__(self,[...): +``` + +看下具体的示例: + + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-084417.png) + + + +## 3、Python 定义类的历史遗留问题 ## + +Python 在版本的迭代中,有一个关于类的历史遗留问题,就是新式类和旧式类的问题,具体先看以下的代码: + +```python +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +# 旧式类 +class OldClass: + pass + +# 新式类 +class NewClass(object): + pass + +``` + +可以看到,这里使用了两者中不同的方式定义类,可以看到最大的不同就是,新式类继承了`object` 类,在 Python2 中,我们定义类的时候最好定义新式类,当然在 Python3 中不存在这个问题了,因为 Python3 中所有类都是新式类。 + +那么新式类和旧式类有什么区别呢? + +运行下下面的那段代码: + +```python +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +# 旧式类 +class OldClass: + def __init__(self, account, name): + self.account = account + self.name = name + + +# 新式类 +class NewClass(object): + def __init__(self, account, name): + self.account = account + self.name = name + + +if __name__ == '__main__': + old_class = OldClass(111111, 'OldClass') + print(old_class) + print(type(old_class)) + print(dir(old_class)) + print('\n') + new_class = NewClass(222222, 'NewClass') + print(new_class) + print(type(new_class)) + print(dir(new_class)) + +``` + +这是 python 2.7 运行的结果: + +``` +/Users/twowater/dev/python/test/venv/bin/python /Users/twowater/dev/python/test/com/twowater/test.py +<__main__.OldClass instance at 0x109a50560> + +['__doc__', '__init__', '__module__', 'account', 'name'] + + +<__main__.NewClass object at 0x109a4b150> + +['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'account', 'name'] + +Process finished with exit code 0 + +``` + +这是 Python 3.6 运行的结果: + +``` +/usr/local/bin/python3.6 /Users/twowater/dev/python/test/com/twowater/test.py +<__main__.OldClass object at 0x1038ba630> + +['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'account', 'name'] + + +<__main__.NewClass object at 0x103e3c9e8> + +['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'account', 'name'] + +Process finished with exit code 0 + +``` + + +仔细观察输出的结果,对比一下,就能观察出来,注意喔,Pyhton3 中输出的结果是一模一样的,因为Python3 中没有新式类旧式类的问题。 + + + + + + diff --git a/Article/python9/5.md b/Article/PythonBasis/python8/7.md similarity index 82% rename from Article/python9/5.md rename to Article/PythonBasis/python8/7.md index d85ab90d..0e95adad 100644 --- a/Article/python9/5.md +++ b/Article/PythonBasis/python8/7.md @@ -1,7 +1,16 @@ -# 五、类的继承 # +# 七、类的继承 # ## 1、定义类的继承 ## +说到继承,你一定会联想到继承你老爸的家产之类的。 + +类的继承也是一样。 + +比如有一个旧类,是可以算平均数的。然后这时候有一个新类,也要用到算平均数,那么这时候我们就可以使用继承的方式。新类继承旧类,这样子新类也就有这个功能了。 + +通常情况下,我们叫旧类为父类,新类为子类。 + + 首先我们来看下类的继承的基本语法: ```python @@ -13,7 +22,7 @@ class ClassName(BaseClassName): ``` -在定义类的时候,可以在括号里写继承的类,一开始也提到过,如果不用继承类的时候,也要写继承 object 类,因为在 Python 中 object 类是一切类的父类。 +在定义类的时候,可以在括号里写继承的类,如果不用继承类的时候,也要写继承 object 类,因为在 Python 中 object 类是一切类的父类。 当然上面的是单继承,Python 也是支持多继承的,具体的语法如下: @@ -112,12 +121,12 @@ if __name__ == '__main__': 最后打印的结果: -![Python 类的继承](http://upload-images.jianshu.io/upload_images/2136918-aa2701fc5913a8a6?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-Python%20%E7%B1%BB%E7%9A%84%E7%BB%A7%E6%89%BF.png) 这里就是重写了父类的构造函数。 -## 3、子类的类型判断 ## +## 4、子类的类型判断 ## 对于 class 的继承关系来说,有些时候我们需要判断 class 的类型,该怎么办呢? @@ -168,3 +177,5 @@ False ``` 可以看到 `isinstance()` 不仅可以告诉我们,一个对象是否是某种类型,也可以用于基本类型的判断。 + + diff --git a/Article/python9/6.md b/Article/PythonBasis/python8/8.md similarity index 92% rename from Article/python9/6.md rename to Article/PythonBasis/python8/8.md index da1b03d4..7a2c9cbb 100644 --- a/Article/python9/6.md +++ b/Article/PythonBasis/python8/8.md @@ -1,4 +1,4 @@ -# 六、类的多态 # +# 八、类的多态 # 多态的概念其实不难理解,它是指对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不同而表现出不同的行为。 @@ -11,7 +11,9 @@ 'ab' ``` -可以看到,我们对两个整数进行 + 操作,会返回它们的和,对两个字符进行相同的 + 操作,会返回拼接后的字符串。也就是说,不同类型的对象对同一消息会作出不同的响应。 +可以看到,我们对两个整数进行 + 操作,会返回它们的和,对两个字符进行相同的 + 操作,会返回拼接后的字符串。 + +也就是说,不同类型的对象对同一消息会作出不同的响应。 看下面的实例,来了解多态: @@ -64,4 +66,5 @@ Hello ! 尊敬的用户:水水水 -最后,本章的所有代码都可以在 [https://github.com/TwoWater/Python](https://github.com/TwoWater/Python) 上面找到,文章的内容和源文件都放在上面。同步更新到 Gitbooks。 \ No newline at end of file +最后,本章的所有代码都可以在 [https://github.com/TwoWater/Python](https://github.com/TwoWater/Python) 上面找到,文章的内容和源文件都放在上面。同步更新到 Gitbooks。 + diff --git a/Article/python9/4.md b/Article/PythonBasis/python8/9.md similarity index 62% rename from Article/python9/4.md rename to Article/PythonBasis/python8/9.md index 6514b268..68d56fb6 100644 --- a/Article/python9/4.md +++ b/Article/PythonBasis/python8/9.md @@ -1,6 +1,62 @@ -# 四、类的方法 # +# 九、类的访问控制 # -## 1、类专有的方法 ## + +## 1、类属性的访问控制 ## + +在 Java 中,有 public (公共)属性 和 private (私有)属性,这可以对属性进行访问控制。 + +那么在 Python 中有没有属性的访问控制呢? + +一般情况下,我们会使用 `__private_attrs` 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 `self.__private_attrs`。 + +为什么只能说一般情况下呢? + +因为实际上, Python 中是没有提供私有属性等功能的。 + +但是 Python 对属性的访问控制是靠程序员自觉的。为什么这么说呢? + +看看下面的示例: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-Python%20%E5%B1%9E%E6%80%A7%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6.png) + +仔细看图片,为什么说双下划线不是真正的私有属性呢?我们看下下面的例子,用下面的例子来验证: + +```python + +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +class UserInfo(object): + def __init__(self, name, age, account): + self.name = name + self._age = age + self.__account = account + + def get_account(self): + return self.__account + + +if __name__ == '__main__': + userInfo = UserInfo('两点水', 23, 347073565); + # 打印所有属性 + print(dir(userInfo)) + # 打印构造函数中的属性 + print(userInfo.__dict__) + print(userInfo.get_account()) + # 用于验证双下划线是否是真正的私有属性 + print(userInfo._UserInfo__account) + + +``` + +输出的结果如下图: + +![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-Python%E5%8F%8C%E4%B8%8B%E5%88%92%E7%BA%BF%E5%B1%9E%E6%80%A7.png) + + + + +## 2、类专有的方法 ## 一个类创建的时候,就会包含一些方法,主要有以下方法: @@ -32,7 +88,9 @@ * `setattr(obj, attr, value)`:设定该属性/方法的值,类似于 obj.attr=value; * `dir(obj)`:可以获取相应对象的所有属性和方法名的列表: -## 2、方法的访问控制 ## + + +## 3、方法的访问控制 ## 其实我们也可以把方法看成是类的属性的,那么方法的访问控制也是跟属性是一样的,也是没有实质上的私有方法。一切都是靠程序员自觉遵守 Python 的编程规范。 @@ -54,53 +112,7 @@ class User(object): ``` -## 3、方法的装饰器 ## - -* **@classmethod** -调用的时候直接使用类名类调用,而不是某个对象 -* **@property** -可以像访问属性一样调用方法 - -具体的使用看下实例: - -```python -#!/usr/bin/env python -# -*- coding: UTF-8 -*- - -class UserInfo(object): - lv = 5 - - def __init__(self, name, age, account): - self.name = name - self._age = age - self.__account = account - - def get_account(self): - return self.__account - - @classmethod - def get_name(cls): - return cls.lv - - @property - def get_age(self): - return self._age - - -if __name__ == '__main__': - userInfo = UserInfo('两点水', 23, 347073565); - # 打印所有属性 - print(dir(userInfo)) - # 打印构造函数中的属性 - print(userInfo.__dict__) - # 直接使用类名类调用,而不是某个对象 - print(UserInfo.lv) - # 像访问属性一样调用方法(注意看get_age是没有括号的) - print(userInfo.get_age) -``` -运行的结果: -![Python 方法的装饰器](http://upload-images.jianshu.io/upload_images/2136918-63dc478a8b2f965f?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) diff --git a/Article/PythonBasis/python8/Preface.md b/Article/PythonBasis/python8/Preface.md new file mode 100644 index 00000000..3c78fb57 --- /dev/null +++ b/Article/PythonBasis/python8/Preface.md @@ -0,0 +1,26 @@ +# 前言 # + +这篇内容非常的重要,也是我用了很多时间写的。基本上把以前写的东西都重新改了一遍。里面的代码都是我一个一个的敲的,图片也是我一个一个制作的。 + + + + +# 目录 # + +![面向对象](media/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1.png) + + + + + + + + + + + + + + + + diff --git "a/Article/PythonBasis/python8/media/\351\235\242\345\220\221\345\257\271\350\261\241.png" "b/Article/PythonBasis/python8/media/\351\235\242\345\220\221\345\257\271\350\261\241.png" new file mode 100644 index 0000000000000000000000000000000000000000..7485736d844d4ed27565276368c89beaa444abc5 GIT binary patch literal 67053 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�(2}hA!T;9*>8{u4aU;Ls#Gho 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 literal 0 HcmV?d00001 diff --git a/Article/python8/1.md b/Article/PythonBasis/python9/1.md similarity index 100% rename from Article/python8/1.md rename to Article/PythonBasis/python9/1.md diff --git a/Article/python8/2.md b/Article/PythonBasis/python9/2.md similarity index 100% rename from Article/python8/2.md rename to Article/PythonBasis/python9/2.md diff --git a/Article/python8/3.md b/Article/PythonBasis/python9/3.md similarity index 100% rename from Article/python8/3.md rename to Article/PythonBasis/python9/3.md diff --git a/Article/python8/4.md b/Article/PythonBasis/python9/4.md similarity index 100% rename from Article/python8/4.md rename to Article/PythonBasis/python9/4.md diff --git a/Article/python8/5.md b/Article/PythonBasis/python9/5.md similarity index 100% rename from Article/python8/5.md rename to Article/PythonBasis/python9/5.md diff --git a/Article/python8/Preface.md b/Article/PythonBasis/python9/Preface.md similarity index 100% rename from Article/python8/Preface.md rename to Article/PythonBasis/python9/Preface.md diff --git a/Article/python6/1.md b/Article/python6/1.md deleted file mode 100644 index 4c3c0757..00000000 --- a/Article/python6/1.md +++ /dev/null @@ -1,42 +0,0 @@ -# 一、Python 自定义函数的基本步骤 # - -函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 - -自定义函数,基本有以下规则步骤: - -* 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号() -* 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数 -* 函数的第一行语句可以选择性地使用文档字符串(用于存放函数说明) -* 函数内容以冒号起始,并且缩进 -* return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的 return 相当于返回 None。 - -语法示例: - -```python -def functionname( parameters ): - "函数_文档字符串" - function_suite - return [expression] -``` - -实例: - -1. def 定义一个函数,给定一个函数名 sum -2. 声明两个参数 num1 和 num2 -3. 函数的第一行语句进行函数说明:两数之和 -4. 最终 return 语句结束函数,并返回两数之和 - -```python -def sum(num1,num2): - "两数之和" - return num1+num2 - -# 调用函数 -print(sum(5,6)) -``` - -输出结果: - -```python -11 -``` \ No newline at end of file diff --git a/Article/python6/Preface.md b/Article/python6/Preface.md deleted file mode 100644 index f05ffefa..00000000 --- a/Article/python6/Preface.md +++ /dev/null @@ -1,7 +0,0 @@ -# 前言 # - -前天创了个 Python 微信讨论群,以为没人进的,哈哈,想不到还真有小伙伴进群学习讨论。如果想进群,可以加我微信: androidwed ,拉进群,就不贴微信群二维码了,一是会失效,二影响文章。 - -# 目录 # - -![草根学Python(六) 函数](http://upload-images.jianshu.io/upload_images/2136918-be9226fe109027f3?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) diff --git a/Article/python7/Preface.md b/Article/python7/Preface.md deleted file mode 100644 index 22583dc6..00000000 --- a/Article/python7/Preface.md +++ /dev/null @@ -1,7 +0,0 @@ -# 前言 # - -这篇博客写了很久,其实写每一篇博客用的时间还是挺长的,不够这有利于自己的学习,也想分享一下。之前也说了创建了一个微信群,Python 学习讨论群,现在只有 40 个左右的小伙伴,如果有兴趣加入学习讨论的话,可以加我微信:`androidwed`,拉你进群。想看回之前的文章,也可以通过 [Gitbook](https://www.gitbook.com/book/twowater/python/details) 查看,欢迎提出问题和点下 star,及时查看更新。 - -# 目录 # - -![草根学Python(七) 迭代器和生成器](http://upload-images.jianshu.io/upload_images/2136918-b350c0e98ca47183?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) diff --git a/Article/python9/2.md b/Article/python9/2.md deleted file mode 100644 index 6e7606c6..00000000 --- a/Article/python9/2.md +++ /dev/null @@ -1,117 +0,0 @@ -# 二、类 # - -## 1、定义类 ## - -类定义语法格式如下: - -```python -class ClassName: - - . - . - . - -``` - -一个类也是由属性和方法组成的,有些时候我们定义类的时候需要设置类的属性,因此这就需要构造函 - -类的构造函数如下: - -```python -def __init__(self,[...): -``` - -类定义了 __init__() 方法的话,类的实例化操作会自动调用 __init__() 方法。 - -那么如构造函数相对应的是析构函数,理所当然,一个类创建的时候我们可以用过构造函数设置属性,那么当一个类销毁的时候,就会调用析构函数。 - -析构函数语法如下: - -```python -def __del__(self,[...): -``` - -仔细观察的童鞋都会发现,类的方法与普通的函数有一个特别的区别,它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。 - -那么这个 self 代表什么呢? - -我们可以看下实例,通过实例来找出答案: - -```python -#!/usr/bin/env python3 -# -*- coding: UTF-8 -*- - -class Test: - def prt(self): - print(self) - print(self.__class__) - -t = Test() -t.prt() -``` - -观察输出的结果: - -![Python self](http://upload-images.jianshu.io/upload_images/2136918-66d29b081ad5510b?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -从执行结果可以很明显的看出,self 代表的是类的实例,输出的是当前对象的地址,而 `self.__class__` 则指向类。 - -当然 self 不是 python 关键字,也就是说我们把他换成其他的字符也是可以正常执行的。只不过我们习惯使用 self - -## 2、Python 定义类的历史遗留问题 ## - -Python 在版本的迭代中,有一个关于类的历史遗留问题,就是新式类和旧式类的问题,具体先看以下的代码: - -```python -#!/usr/bin/env python -# -*- coding: UTF-8 -*- - -# 旧式类 -class OldClass: - pass - -# 新式类 -class NewClass(object): - pass - -``` - -可以看到,这里使用了两者中不同的方式定义类,可以看到最大的不同就是,新式类继承了`object` 类,在 Python2 中,我们定义类的时候最好定义新式类,当然在 Python3 中不存在这个问题了,因为 Python3 中所有类都是新式类。 - -那么新式类和旧式类有什么区别呢? - -运行下下面的那段代码: - -```python -#!/usr/bin/env python -# -*- coding: UTF-8 -*- - -# 旧式类 -class OldClass: - def __init__(self, account, name): - self.account = account; - self.name = name; - - -# 新式类 -class NewClass(object): - def __init__(self, account, name): - self.account = account; - self.name = name; - - -if __name__ == '__main__': - old_class = OldClass(111111, 'OldClass') - print(old_class) - print(type(old_class)) - print(dir(old_class)) - print('\n') - new_class=NewClass(222222,'NewClass') - print(new_class) - print(type(new_class)) - print(dir(new_class)) - -``` - - -仔细观察输出的结果,对比一下,就能观察出来,注意喔,Pyhton3 中输出的结果是一模一样的,因为Python3 中没有新式类旧式类的问题。 diff --git a/Article/python9/3.md b/Article/python9/3.md deleted file mode 100644 index 34a593e8..00000000 --- a/Article/python9/3.md +++ /dev/null @@ -1,64 +0,0 @@ -# 三、类的属性 # - -## 1、直接在类中定义属性 ## - -定义类的属性,当然最简单最直接的就是在类中定义,例如: - -```python -class UserInfo(object): - name='两点水' -``` - -## 2、在构造函数中定义属性 ## - -故名思议,就是在构造对象的时候,对属性进行定义。 - -```python -class UserInfo(object): - def __init__(self,name): - self.name=name -``` - -## 3、属性的访问控制 ## - -在 Java 中,有 public (公共)属性 和 private (私有)属性,这可以对属性进行访问控制。那么在 Python 中有没有属性的访问控制呢? - -一般情况下,我们会使用 `__private_attrs` 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 `self.__private_attrs`。 - -为什么只能说一般情况下呢?因为实际上, Python 中是没有提供私有属性等功能的。但是 Python 对属性的访问控制是靠程序员自觉的。为什么这么说呢?看看下面的示例: - -![Python 属性访问控制](http://upload-images.jianshu.io/upload_images/2136918-4ac2643aa5b0fa37?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - -仔细看图片,为什么说双下划线不是真正的私有属性呢?我们看下下面的例子,用下面的例子来验证: - -```python - -#!/usr/bin/env python -# -*- coding: UTF-8 -*- - -class UserInfo(object): - def __init__(self, name, age, account): - self.name = name - self._age = age - self.__account = account - - def get_account(self): - return self.__account - - -if __name__ == '__main__': - userInfo = UserInfo('两点水', 23, 347073565); - # 打印所有属性 - print(dir(userInfo)) - # 打印构造函数中的属性 - print(userInfo.__dict__) - print(userInfo.get_account()) - # 用于验证双下划线是否是真正的私有属性 - print(userInfo._UserInfo__account) - - -``` - -输出的结果如下图: - -![Python 属性访问控制](http://upload-images.jianshu.io/upload_images/2136918-de89d4dc5f5f9f77?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) diff --git a/Article/python9/Preface.md b/Article/python9/Preface.md deleted file mode 100644 index cc15f62c..00000000 --- a/Article/python9/Preface.md +++ /dev/null @@ -1,10 +0,0 @@ -# 前言 # - -这篇写的很纠结,不过还是写完了。弄了个很逊的公众号,如果对本文有兴趣,可以关注下公众号喔,会持续更新。 - - -![公众号](http://img.blog.csdn.net/20170730171715934?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVHdvX1dhdGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) - -# 目录 # - -![草根学Python(九)面向对象](http://upload-images.jianshu.io/upload_images/2136918-eecf427fdbd1688c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) diff --git a/README.md b/README.md index 78f39ad6..debad00f 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ IT 行业相对于一般传统行业,发展更新速度更快,一旦停止 自学 Python ,也是一样,不要一开始因为头脑发热就不停地收藏各种资料网站,购买各种书籍,下载了大量的教学视频,过了几天,学习的热情开始褪去,再过几个星期,终于完成了学习课程 —— 《从入门到放弃》。所以,学习 Python 需要一步一个脚印,踏踏实实地学。 + # FQ 在讲 Python 如何入门之前,个人建议最好每个人都有自己的 FQ 工具,多使用 Google 搜索,多去看一下墙外的世界,多看 Github 上的开源项目。 @@ -11,6 +12,7 @@ IT 行业相对于一般传统行业,发展更新速度更快,一旦停止 至于如何 FQ ,这里提供一下我用过的工具:[FQ工具集](/Res/FQ.md) + # Python 学习资源集 相信很多人学习某门编程语言的时候,都会找各种学习资料。说句实话,资料太多,反而没用,根据自己的学习习惯,个人能力选择一门资源坚持学就好了。 @@ -19,6 +21,11 @@ IT 行业相对于一般传统行业,发展更新速度更快,一旦停止 * [Python 博客网站资源](/Res/Python博客网站资源.md) +还有一些有趣的网站: + +* [一个可以看执行过程的网站](http://www.pythontutor.com/visualize.html#mode=edit) + + # Python 入门 @@ -57,31 +64,34 @@ IT 行业相对于一般传统行业,发展更新速度更快,一旦停止 - [条件语句](/Article/PythonBasis/python5/If.md) - [循环语句](/Article/PythonBasis/python5/Cycle.md) - [条件语句和循环语句综合实例](/Article/PythonBasis/python5/Example.md) -* [函数](/Article/python6/Preface.md) - - [Python 自定义函数的基本步骤](/Article/python6/1.md) - - [函数传值问题](/Article/python6/2.md) - - [函数返回值](/Article/python6/3.md) - - [函数的参数](/Article/python6/4.md) - - [匿名函数](/Article/python6/5.md) -* [迭代器和生成器](/Article/python7/Preface.md) - - [迭代](/Article/python7/1.md) - - [Python 迭代器](/Article/python7/2.md) - - [lsit 生成式(列表生成式)](/Article/python7/3.md) - - [生成器](/Article/python7/4.md) - - [迭代器和生成器综合例子](/Article/python7/5.md) -* [模块与包](/Article/python8/Preface.md) - - [Python 模块简介](/Article/python8/1.md) - - [模块的使用](/Article/python8/2.md) - - [主模块和非主模块](/Article/python8/3.md) - - [包](/Article/python8/4.md) - - [作用域](/Article/python8/5.md) -* [面向对象](/Article/python9/Preface.md) - - [面向对象的概念](/Article/python9/1.md) - - [类](/Article/python9/2.md) - - [类的属性](/Article/python9/3.md) - - [类的方法](/Article/python9/4.md) - - [类的继承](/Article/python9/5.md) - - [类的多态](/Article/python9/6.md) +* [函数](/Article/PythonBasis/python6/Preface.md) + - [Python 自定义函数的基本步骤](/Article/PythonBasis/python6/1.md) + - [函数返回值](/Article/PythonBasis/python6/2.md) + - [函数的参数](/Article/PythonBasis/python6/3.md) + - [函数传值问题](/Article/PythonBasis/python6/4.md) + - [匿名函数](/Article/PythonBasis/python6/5.md) +* [迭代器和生成器](/Article/PythonBasis/python7/Preface.md) + - [迭代](/Article/PythonBasis/python7/1.md) + - [Python 迭代器](/Article/PythonBasis/python7/2.md) + - [lsit 生成式(列表生成式)](/Article/PythonBasis/python7/3.md) + - [生成器](/Article/PythonBasis/python7/4.md) + - [迭代器和生成器综合例子](/Article/PythonBasis/python7/5.md) +* [面向对象](/Article/PythonBasis/python8/Preface.md) + - [面向对象的概念](/Article/PythonBasis/python8/1.md) + - [类的定义和调用](/Article/PythonBasis/python8/2.md) + - [类方法](/Article/PythonBasis/python8/3.md) + - [修改和增加类属性](/Article/PythonBasis/python8/4.md) + - [类和对象](/Article/PythonBasis/python8/5.md) + - [初始化函数](/Article/PythonBasis/python8/6.md) + - [类的继承](/Article/PythonBasis/python8/7.md) + - [类的多态](/Article/PythonBasis/python8/8.md) + - [类的访问控制](/Article/PythonBasis/python8/9.md) +* [模块与包](/Article/PythonBasis/python9/Preface.md) + - [Python 模块简介](/Article/PythonBasis/python9/1.md) + - [模块的使用](/Article/PythonBasis/python9/2.md) + - [主模块和非主模块](/Article/PythonBasis/python9/3.md) + - [包](/Article/PythonBasis/python9/4.md) + - [作用域](/Article/PythonBasis/python9/5.md) * [Python 的 Magic Method](/Article/python10/Preface.md) - [Python 的 Magic Method](/Article/python10/1.md) - [构造(`__new__`)和初始化(`__init__`)](/Article/python10/2.md) @@ -115,10 +125,12 @@ IT 行业相对于一般传统行业,发展更新速度更快,一旦停止 * [装饰器](/Article/python16/1.md) + # 知识点补漏 * [Python 关键字 yield](/Article/supplement/Python关键字yield.md) + # Python 进阶 * [使用Python虚拟环境](/Article/advanced/使用Python虚拟环境.md)