前言
是在原有文章的基础上直接扩充更新还是将其作为单独的系列文章呢?思虑再三,还是决定把接下来的Day01-Day05的总结独立出来。此系列是关于《Python编程:从入门到实践》的总结,亦可看作是在我上一篇文章的基础上的加强版本,所以大家看到有些部分没有从浅入深的一个过程或者是没头没脑也请不要惊讶。由于笔者(没错就是我😎)水平实在有限,欢迎大家在评论区或者私聊我进行批评指正,闲话少说,我们开始吧。
《Python编程:从入门到实践》总结_Day01
《Python编程:从入门到实践》总结_Day02
《Python编程:从入门到实践》总结_Day03
《Python编程:从入门到实践》总结_Day04
《Python编程:从入门到实践》总结_Day05
上一篇文章请见《编程小白的第1本Python入门书》总结
-
Here!
《Python编程:从入门到实践》_Day03.png
1. while循环
我们可以在while
循环中加入“标志”,即定义一个变量,用于判断整个程序是否处于活动状态,这个标志充当了程序的交通信号灯。并且break
不仅可以在while
循环中使用,在任何的Python循环中都可以使用。
sign = True
while sign:
places = input("Where would you want to visit?\nPlease tell us:")
if places == "quit":
sign = False
break
place_list.append(places)
places_list = place_list
2. 函数
-
默认参数;
我们在定义函数时若是定义了默认参数,在调用时若是不使用关键词参数,Python依然将其视为位置参数,在调用该参数的时候若只含有一个实参,则会默认关联到定义中的第一个形参(所以若形参列表中定义了多个形参,先列出没有默认值的形参,再列出有默认的值的“形参”)。在默认参数前加上
*
,表示创建空元组类型。在默认参数前加上
**
,表示创建空字典类型。 -
建议;
1、给形参指定默认参数的时候,等号两边不要有空格。
2、若是参数列表过长,可放置在多行,回车后按两次tab键。
3. 模块的导入&使用
-
import xxx
:
导入xxx
模块,本质上是打开xxx.py
文件,并将其中的所有代码都复制到这个程序中(这个过程是看不到的),但是在此程序中可使用xxx.py
中定义的所有函数。 -
from xxx_1 import xxx_2
:
这种导入方式的含义是从模块xxx_1
中导入函数xxx_2
,这种方式只导入我们会使用到的函数,而不会将整个模块全都导入进来。 -
import xxx_1 as x_1
:
将模块xxx_1
设定为别名x_1
,在本程序中可使用x_1
来代替xxx_1
。 -
from xxx_1 import xxx_2 as x_2
:
将模块xxx_1
中导入的函数xxx_2
,设定一个别名xxx_3
。 -
from xxx_1 import *
:
此语句是将模块xxx_1
中的所有函数均导入本程序,可通过函数名来调用模块xxx_1
中的所有函数,无须使用句点表示法。
⚠️:使用并非自己编写的大型模块时,最好不要采用from xxx_1 import *
的导入方法,如果模块中有函数名称与你的项目中使用的名称相同,会导致意想不到的效果:Python可能遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入所有的函数。 -
建议;
1、所有的import语句都应放在程序的开头位置。
2、最好是只导入自己所需要的函数。
3、可以导入整个模块并使用句点表示法。
4、函数命名只使用小写字母和下划线。
4. 类
在关于类的部分,前部分的关于类的定义,实例化以及__init__
方法与之前的文章中相同,也就略过不再进行总结。
-
继承;
在这里我想着重说一下我理解的比较困难的点,也就是关于super
知识
class Car():
--snip--
class ElectricCar(Car):
"""Represent aspects of a car, specific to electric vehicles."""
def __init__(self, make, model, year):
"""
电动汽车的独特之处 初始化父类的属性,再初始化电动汽车特有的属性
"""
super().__init__(make, model, year)
self.battery_size = 70
我们可以看一下上述代码,首先我们定义了一个类Car
,类中的定义我们暂且不提,接着我们定义了一个类ElectricCar
,因为二者之间的继承关系,我们可以确定父类Car
以及子类ElectricCar
同时我们注意一下在子类的定义初始化函数的下一行代码,使用了一个super()
的概念,这是一个比较特殊的函数,用我所理解的比较通俗的说法就是它主要用于在子类的定义中区分子类和父类的同名属性(函数)。也就是说,如果我们在子类中定义了一个和父类中相同名称但其中的内容不同的属性(函数),我们在调用的时候势必会产生一些我们意想不到的错误情况,而我们使用了super()
来代表父类中的属性(函数),用self()
来代表子类中定义的属性(函数)。而若是子类中不存在名称相同的情况呢?那super()
也就没有存在的必要了。
-
重写父类属性&方法;
关于这个知识,我们首先要明白,在子类继承了父类之后,在我们调用子类的实例的方法时,首先会去子类中定义的方法去搜索,在没有结果的情况下才会继续进入父类中搜索。这样的话,我们只需要在子类中定义一个与我们想要重写的父类方法相同名称的方法即可,重写属性也是相同的道理。我们可以看一下书中所给出的例子:
def ElectricCar(Car):
--snip--
def fill_gas_tank():
"""电动汽车没有油箱"""
print("This car doesn't need a gas tank!")
在父类Car
中也存在方法fill_gas_tank()
,但是我们的子类电动汽车中并不需要这个方法,所以我们在子类中对其进行重新定义。现在, 如果有人对电动汽车调用方法 fill_gas_tank()
, Python将忽略 Car
类中的方法 fill_gas_tank()
,转而运行上述代码。使用继承时,可让子类保留从父类那里继承而来的精华, 并剔除不需要的糟粕。
-
自定义Python库与标准库
我们可以将自己写好的类放在.py
文件中,在需要的时候使用import
导入进来使用,同时Python自己也带有非常丰富的库文件,便于我们导入使用,导入方法与上面所述相同。 -
类的编码方法;
1、类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名 和模块名都采用小写格式,并在单词之间加上下划线。
2、对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的 功能,并遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文档字符串, 对其中的类可用于做什么进行描述。
3、可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中, 可使用两个空行来分隔类。
4、需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,再 添加一个空行,然后编写导入你自己编写的模块的import语句。在包含多条import语句的程序中, 这种做法让人更容易明白程序使用的各个模块都来自何方。
5. 问题
在我的阅读过程中,自己制定的计划也正是从这里开始有落后的迹象。主要是由于类中的概念super()
着实让我理解了很久,虽然对于理解了这个概念的人来说好像也不是很难的样子。可对于现在的我来说还是比较复杂,关于类的一些概念和书中展示的代码与技巧,给我的更多是一种朦胧的感觉,可同时我又觉得如果想拨开这层面纱,已经不是我将这本书的相关内容读了多少遍的问题,而是通过coding、比对、理解来真正将其掌握了。
网友评论