Logistic's Blog

生命不息,折腾不止!

Python Section1 Note

文章最后修改于:2020-2-17 21:02:39

Python Section1:基础知识

  • 第1章介绍在计算机中安装Python,并运行第一个程序——它在屏幕上打印消息“Hello world!”。
  • 第2章论述如何在变量中存储信息以及如何使用文本和数字。
  • 第3章和第4章介绍列表。使用列表能够在一个变量中存储任意数量的信息,从而高效地处理数据:只需几行代码,你就能够处理数百、数千乃至数百万个值。
  • 第5章讲解使用if语句来编写这样的代码:在特定条件满足时采取一种措施,而在该条件不满足时采取另一种措施。
  • 第6章演示如何使用 Python字典,将不同的信息关联起来。与列表一样,你也可以根据需要在字典中存储任意数量的信息。
  • 第7章讲解如何从用户那里获取输入,以让程序变成交互式的。你还将学习while循环,它不断地运行代码块,直到指定的条件不再满足为止。
  • 第8章介绍编写函数。函数是执行特定任务的被命名的代码块,你可以根据需要随时运行它。
  • 第9章介绍类,它让你能够模拟实物,如小狗、小猫、人、汽车、火箭等,让你的代码能够表示任何真实或抽象的东西。
  • 第10章介绍如何使用文件,以及如何处理错误以免程序意外地崩溃。你需要在程序关闭前保存数据,并在程序再次运行时读取它们。你将学习Python异常,它们让你能够未雨绸缪,从而让程序妥善地处理错误。
  • 第11章为代码编写测试,以核实程序是否像你期望的那样工作。这样,扩展程序时,你就不用担心引入新的bug。 要想脱离初级程序员的阵容,跻身于中级程序员的行列,测试代码是你必须掌握的基本技能之一。

chap1_start

1、Intellij Idea Configuration Python

  • 基本Python开发环境的搭建见“Python Configuration.md”文档

2、Hello world

Hello_world.py

chap2_variable

1、修改字符串大小写

  • title()方法:首字母大写
  • upper()方法:全部大写
  • lower()方法:全部小写

name.py

2、删除空白

  • rstrip()方法:删除字符串末尾空白
  • lstrip()方法:删除字符串开头空白
  • strip()方法:删除字符串两端空白
  • 以上都只是暂时删除,如果要永久删除这个字符串中的空白,必须将删除操作的结果存回到变量中,如:

3、基本运算

  • 乘方运算符 **,如:>>> 3 ** 2 ——— 输出9
  • 求模运算符 %,将两个数相除并返回余数 如:>>> 6 % 3 ———— 输出0
  • Python支持运算次序

4、使用函数str()避免类型错误

  • 函数str():让Python将非字符串值表示为字符串,例:

birthday.py

5、注释

  • 单行注释: #text
  • 多行注释: ”’text”’ 或 “””text”””

  • 中文注释报错:

    • 原因:如果文件里有非ASCII字符,需要在第一行或第二行指定编码声明
    • 解决办法:在第一行或第二行(加在其它地方无效)加上#coding:utf-8

chap3_list

1、列表:

  • 用方括号 [] 来表示列表,并用逗号来分隔其中的元素
  • 索引从 0 而不是 1 开始
  • 负数索引:(索引倒数第几个数)

bicycles.py

2、操作列表:

  • 增:
    1)在列表末尾添加元素——append()方法
    2)在列表中插入元素——insert()方法
  • 删:
    1)如果知道要删除的元素在列表中的位置,可使用del语句
    2)方法 pop() 弹出栈顶元素,在括号内加索引弹出指定位置元素
    3)如果知道要删除的元素的值,可使用方法 remove()(只删除第一个,全部删除需要利用循环)
  • 查、改:直接调用即可

motorcycles.py

3、排序:

  • 方法sort() 对列表进行永久性排序(反向只需向sort()方法传递参数reverse=True)
  • 函数 sorted() 对列表进行临时排序
  • 反转列表元素的排列顺序:reverse()方法
  • 确定列表的长度:len()函数

cars.py

chap4_for

1、for循环举例:

2、创建数值列表:

  • 函数 range() :从你指定的第一个值开始数,并在到达你指定的第二个值后停止,输出不包含第二个值
  • 将函数range() 作为函数 list() 的参数,输出将为一个数字列表。
  • 简单统计计算:min()、max()、sum()函数
  • 列表解析举例:squares = [value**2 for value in range(1,11)]

numbers.py

3、切片:

  • 遍历切片:for循环
  • 复制列表: [:]

players.py

4、元组:

  • 不可变的列表(虽然不能修改元组的元素,但可以给存储元组的变量赋值)
  • 用()表示元组,其它的与列表一样

dimensions.py

5、代码格式:

  • 制表符\t 换行符\n
  • 建议每级缩进都使用四个空格
  • 在诸如 == 、 >= 和 <= 等比较运算符两边各添加一个空格

chap5_if

1、条件测试

  • python里没有&&和||运算符,取而代之的是and和or
  • 检查特定值是否包含/不包含在列表中——使用关键字 in/not in

cars.py

2、if语句、if-else语句、if-elif-else语句

voting.py

chap6_dictionary

1、字典:

  • 是一系列键 — 值对,每个键都与一个值相关联,可以使用键来访问与之相关联的值。
  • 用 {} 表示字典。键和值之间用冒号分隔,而键 — 值对之间用逗号分隔。
  • Python 不关心键 — 值对的添加顺序,而只关心键和值之间的关联关系。
  • 增、改:指定字典名、用方括号括起的键和相关联的值。
  • 删、查:指定字典名、用方括号括起的键。(删除使用del语句)

alien.py

2、遍历字典:

  • 遍历所有的键 — 值对——items()方法
  • 遍历字典中的所有键——keys() 方法【如果需要按顺序遍历字典中的所有键——函数sorted()】
  • 遍历字典中的所有值—— values()方法【如果需要剔除重复项——函数set()】

user.py

3、字典的嵌套

  • 在字典中存储字典

many_users.py

  • 在字典中存储列表

pizza.py

chap7_while

1、用户输入——函数 input()

parrot.py

2、while 循环

[1] while 语句

  • for 循环用于针对集合中的每个元素都一个代码块,而 while 循环不断地运行,直到指定的条件不满足为止。
  • continue——返回循环开头,根据条件测试结果决定是否继续执行循环如果程序陷入无限循环,可按Ctl+C,也可关闭终端窗口
  • break——立即退出while循环,不再运行循环中余下的代码

counting.py

[2] 使用标志

  • 在要求很多条件都满足才继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。
  • 你可让程序在标志为 True 时继续运行,并在任何事件导致标志的值为 False 时让程序停止运行。这样,在 while 语句中就只需检查一个条件 —— 标志的当前值是否为 True ,并将所有测试都放在其他地方。

cities.py

[3] for 循环是一种遍历列表的有效方式,但在 for 循环中不应修改列表,否则将导致 Python 难以跟踪其中的元素。

pets.py

[4] while 综合应用

eg1: confirmed_users.py

eg2: mountain_poll.py

eg3: parrot_2.py

chap8_function

1、函数

  • 使用关键字 def 来告诉 Python 你要定义一个函数。指出函数名,可能在括号指出函数为完成其任务需要什么信息。最后,定义以冒号结尾。
  • 要调用函数,可依次指定函数名以及用括号括起的必要信息

pizza.py

2、传递实参

  • 位置实参、关键字实参
  • 还可以设定默认值(使用时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参)
  • 还可以让实参变成可选的(将默认值指定为空字符串)
  • 返回值——return语句:将值返回到调用函数的代码行

eg1: pets.py

eg2: formatted_name.py

eg3: user_profile.py

eg4: greet_users.py

eg5: person.py

3、模块:

将函数存储在被称为 模块 的独立文件中,再将模块导入到主程序中——import语句

  • 1)导入整个模块 import pizza
  • 2)导入特定的函数 from pizza import make_pizza
  • 3)使用 as 给函数指定别名 from pizza import make_pizza as mp
  • 4)使用 as 给模块指定别名 import pizza as p
  • 5)导入模块中的所有函数 from pizza import *

making_pizzas.py

chap9_class

1、类:

  • 通常首字母大写的名称是类,而小写的名称是根据类创建的实例。

dog.py

说明:方法 __init__()

  • 1)类中的函数称为方法,有关函数的一切都适用于方法。 __init__()是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它。
  • 2)在这个方法的名称中,开头末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。
  • 3)方法 __init__()定义包含三个形参:self、name和age。在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面。

2、使用类和实例

car.py

3、类的继承

electric_car.py

说明:

  • 1)创建子类时,父类必须包含在当前文件中,且位于子类前面。
  • 2)定义子类时,必须在括号内指定父类的名称。
  • 3)超类super() 是一个特殊函数,帮助 Python 将父类和子类关联起来。这行代码让 Python 调用 ElectricCar 的父类的方法 init(),让 ElectricCar 实例包含父类的所有属性。
  • 4)要重写父类方法,只要在子类写一个与之同名的方法即可。

4、导入类

  • 将类存储在模块中,然后在主程序中导入所需的模块(与导入函数类似,此处略)

5、Python 标准库

  • 可使用标准库中的任何函数和类,为此只需在程序开头包含一条简单的 import 语句。

eg:返回一个 1~6 内的整数

6、类编码风格

  • 1)类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。
  • 2)对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的功能。每个模块也都应包含一个文档字符串,对其中的类可用于做什么进行描述。
  • 3)可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。
  • 4)需要同时导入标准库中的模块和你编写的模块时,先导入标准库模块的 import 语句,再添加一个空行,然后导入你自己编写的模块的 import 语句

chap10_file

1、读取与写入文件

1)函数open():

  • 第一个参数:要打开的文件的名称
  • 第二个参数:读取模式(’r’)、写入模式(’w’)、附加模式(’a’)、读取和写入文件的模式(’r+’)

说明:

  • 如果省略了模式实参,Python将以默认的只读模式打开文件。

  • 如果写入的文件不存在,函数open()将自动创建它。然而,以写入(’w’)模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。

2)关键字with:在不再需要访问文件后将其关闭。

说明:

  • 虽然可以调用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug,导致close()语句未执行,文件将不会关闭,而使用with关键字Python自会在合适的时候自动将其关闭。

  • 使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表:你可以立即处理文件的各个部分,也可推迟到程序后面再处理。

3)从文件中读取数据

file_reader.py

4)写入文件

write_message.py

2、异常

1)每当发生让Python不知所措的错误时,它都会创建一个异常对象。

  • 如果你编写了处理该异常的代码,程序将继续运行;
  • 如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。

2)异常是使用try-except代码块处理的。

  • try-except代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。
  • 使用了try-except代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。

3)使用异常避免崩溃

  • 要求用户提供输入的程序中,如果能够妥善地处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。
  • 通过将可能引发错误的代码放在try-except代码块中,可提高这个程序抵御错误的能力。

4)处理ZeroDivisionError异常、else代码块

  • else代码块:放置依赖于try代码块成功执行的代码。

division.py

5)处理FileNotFoundError异常、文本处理

alice.py

6)使用多个文件、找不到文件时一声不吭

  • 并非每次捕获到异常时都需要告诉用户,有时候你希望程序在发生异常时一声不吭,就像什么都没有发生一样继续运行。可像通常那样编写try代码块,但在except代码块中使用pass语句

word_count.py

3、存储数据

1)模块JSON

  • 可以将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。
  • 还可以使用JSON在Python程序之间分享数据。
  • 更重要的是,JSON数据格式并非Python专用的,能够与其他编程语言互通。

2)使用json.dump()存储数据和json.load()接收数据

number_writer.py

number_reader.py

3)保存和读取用户生成的数据

remember_me.py

chap11_test

1、测试函数

1)单元测试和测试用例

  • Python标准库中的模块unittest提供了代码测试工具。
  • 单元测试:用于核实函数的某个方面没有问题;
  • 测试用例:是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。良好的测试用例考虑到了函数可能收到的各种输入,包含针对所有这些情形的测试。
  • 全覆盖式测试:用例包含一整套单元测试,涵盖了各种可能的函数使用方式。对于大型项目,要实现全覆盖可能很难。通常,最初只要针对代码的重要行为编写测试即可,等项目被广泛使用时再考虑全覆盖。

用于测试的代码:

name_function.py——version1

names.py

  • 从上述输出可知, 合并得到的姓名正确无误。现在假设我们要修改get_formatted_name(),使其还能够处理中间名。

  • 可以每次修改get_formatted_name()后都进行测试:运行程序names.py,并输入像Bob Dylan这样的姓名,但这太烦琐了。

  • 所幸Python提供了一种自动测试函数输出的高效方式。下面将使用get_formatted_name()进行自动测试。

2)可通过的测试

  • 要为函数编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。

test_name_function.py——version1

说明:
[1] 创建了一个名为NamesTestCase的类,用于包含一系列针对get_formatted_name()的单元测试。你可随便给这个类命名,但最好让它看起来与要测试的函数相关,并包含字样Test。这个类必须继承unittest.TestCase类,这样Python才知道如何运行你编写的测试。
[2] 要核实的是只有名和姓的姓名能否被正确地格式化,将这个方法命名为test_first_last_name(),所有以test 打头的方法都将自动运行。
[3] 使用了unittest类最有用的断言方法:用来核实得到的结果是否与期望的结果一致。
[4] 第1行的句点表明有一个测试通过了。接下来的一行指出Python运行了一个测试,消耗的时间不到0.001秒。最后的OK表明该测试用例中的所有单元测试都通过了。

3)不能通过的测试

name_function.py——version2

test_name_function.py——version1,测试代码同上

说明:
[1] 第1行输出只有一个字母E,它指出测试用例中有一个单元测试导致了错误。
[2] 接下来可以看到NamesTestCase中的test_first_last_name()导致了错误。测试用例包含众多单元测试时,知道哪个测试未通过至关重要。
[3] 然后看到了一个标准的traceback,它指出函数调用get_formatted_name(‘janis’, ‘joplin’) 有问题,因为它缺少一个必不可少的位置实参。
[4] 再接下来的一行指出Python运行了一个单元测试。
[5] 最后,指出整个测试用例都未通过,因为运行该测试用例时发生了一个错误。

4)测试未通过时怎么办

  • 测试通过了意味着函数的行为是对的,而测试未通过意味着你编写的新代码有错。因此,测试未通过时,不要修改测试,而应修复导致测试不能通过的代码:检查刚对函数所做的修改,找出导致函数行为不符合预期的修改。

name_function.py——version3

test_name_function.py——version1,测试代码同上

5)添加新测试

name_function.py——version3,函数代码同上

test_name_function.py——version2

2、测试类

1)各种断言方法

  • Python在unittest.TestCase类中提供了很多断言方法。
  • 断言方法检查你认为应该满足的条件是否确实满足。如果该条件确实满足,你对程序行为的假设就得到了确认,你就可以确信其中没有错误。如果你认为应该满足的条件实际上并不满足,Python将引发异常。
方法 用途
assertEqual(a, b) 核实a == b
assertNotEqual(a,b) 核实a!=b
assertTrue(x) 核实x为True
assertFalse(x) 核实x为False
assertIn(item,list) 核实item在list中
assertNotIn(item,list) 核实item不在list中

2)一个要测试的类

survey.py

为证明AnonymousSurvey 类能够正确地工作, 我们来编写一个使用它的程序:

language_survey.py

3)使用方法setUp()测试AnonymousSurvey类

  • 验证如果用户面对调查问题时只提供了一个或三个答案时,它们将被妥善地存储。为此,将在这个答案被存储后,使用方法assertIn()来核实它包含在答案列表中。

  • unittest.TestCase类包含方法setUp(),只需创建这些对象一次,并在每个测试方法中使用它们。如果在TestCase类中包含了方法setUp(),Python将先运行它,再运行各个以test_打头的方法。这样,在编写的每个测试方法中都可使用在方法setUp()中创建的对象了。

test_survey.py

点赞

发表评论

电子邮件地址不会被公开。

EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00