《Python编程:从入门到实践》 (1)基础知识

《Python编程 从入门到实践》第一部分阅读笔记

第一部分 基础知识

第2章 变量和简单数据类型

  • 变量名只包含数字、字母和下划线,且只以字母或下划线开头
  • 字符串
    • 单引号或双引号括起
    • 在字符串中包含引号:'I told my friend, "Python is my favorite language!"'"The language 'Python' is named after Monty Python, not the snake."
    • str.title():以首字母大写的方式显示每个单词
    • str.lower()str.upper()
    • +拼接字符串
    • str.rstrip():去除字符串末尾的空白;str.lstrip():去除字符串前端的空白;str.strip():去除字符串两端的空白
  • 数字:整数与浮点数

第3章 列表简介

  • []表示列表,逗号分隔元素
  • list.append()在列表尾部添加元素
  • list.insert(loca, data)在列表下标为loca的位置添加元素data
  • del list_name[data_index]:删除列表list_name中下标为data_index的数据
  • list.pop(index):从列表删除下标为index的元素,并返回该元素(无参数时为最后一个元素)
  • list.remove(data):删除指定值(第一个)并返回该元素
  • list.sort():对列表永久性从小到大排序,不需要返回值;反序排序则添加参数reverse=True
  • sorted():对列表临时排序
  • list.reverse():列表反序

第4章 操作列表

  • range(第一个数,最后一个数,步长)
  • **:乘方运算
  • 切片:
    • [0:3]:前3个数据
    • [3:]:第四个元素到列表末尾
    • [-3:]:最后三个元素
    • 可用for遍历切片列表
    • food = food_[:]:实现列表复制,得到两个列表
  • 元组
    • 可用索引访问元素
    • 不能修改元组元素

第5章 if语句

第6章 字典

6.2 使用字典
  • 一系列键值对,任何对象都可作为值

  • 添加键值对/修改值:alien_0['x_position'] = 0

  • 空字典:alien_0 = {}

  • 删除键值对:del alien_0['points']

  • 最后一个键值对后面可以添加逗号,以便在下一行添加新的键值对

    1
    2
    3
    4
    5
    6
    favorite_languages = { 
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }
6.3 遍历字典
  • 代码:

    1
    2
    3
    4
    5
    6
    for key, value in user_0.items():  # 键—值对的返回顺序与存储顺序不同
    pass
    for name in favorite_languages.keys(): # 遍历字典中的所有键,keys()返回一个列表
    pass
    for language in favorite_languages.values(): # 遍历字典中的所有值
    pass
6.4 嵌套
  • 字典组成的列表,每个字典代表一个具有较多属性的对象(类似于C++的结构体)
  • 字典中存储列表
  • 字典中嵌套字典

第7章 用户输入与while

  • input()让程序暂停运行,等待用户输入一些文本,回车后返回字符串

第8章 函数

  • 使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参
  • 给实参设定默认值为空字符串,则可在调用时只在必要才提供额外信息
  • 列表传入函数后,函数对列表的修改是永久性的。如果只想传入副本而非引用,则调用时的参数为list_name[:],创建函数的副本
  • 传递任意数目的实参
    • 函数定义时的参数为:def make_pizza(*names):,则所有传入的参数被放到空元组names中。此参数要定义在函数参数列表最后
    • 参数为**names:传入的参数被放到空字典names
  • importfrom import、以及as从其他模块导入函数或指定别名
  • 指定参数默认值时,等号两边不用空格;指定关键词传递参数时,等号两边不用空格

第9章 类

  • 类名通常为驼峰命名
  • 先导入标准库,再空行并导入自己的标准库
  • 类中用一个空行分隔函数
9.1 创建和使用类
  • 代码

    1
    2
    3
    4
    5
    6
    class Dog()
    def __int__(self, name, age):
    self.name = name
    self.age = age
    def sit(self):
    pass
    • __init__()
      • 创建新的实例时都会调用
      • 每个与类关联的方法都会自动传递实参self,为指向实例本身的引用,使实例能访问类中的属性与方法
      • self为前缀的变量可供类中的所有方法使用,还可通过类的所有实例来访问这些变量
  • 句点法访问实例的属性、调用方法

9.2 使用类和实例
  • 类中的每个属性都必须有初始值,即使是0或空串
  • 可以不在__init__()中指定初始值,即实例化时不提供形式参数
  • 可以通过句点法直接修改实例的属性,dog.age = 18;或实现一个函数,通过函数调用更新
9.3 继承
  • 代码:

    1
    2
    3
    class ElectricCar(Car):
    def __init__(self, make, model, year):
    super().__init__(make, model, year)
  • 子类__init__()

    • 子类需要初始化父类的属性
    • gitsuper()将父类与子类关联起来,让子类实例包含父类所有属性
  • 重写父类方法:与父类方法同名即可

  • 实例可作为另一个类的属性,如self.battery = Battery()

9.4 导入类
  • 导入单个类:创建只包含一个类Car的模块car.py,之后在另一个文件中from car import Car
  • 导入多个类:同上,指明导入的类名即可,逗号分隔类名from car import Car, ElectricCar
  • 导入所有类:from module_name import * ,不推荐这一方法
9.5 Python标准库:OrderedDict
  • collections中导入,其实例同字典几乎相同,区别只在于记录了键值对的添加顺序,具有列表和字典的主要优点

  • 代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from collections import OrderedDict

    favorite_languages = OrderedDict()
    favorite_languages['jen'] = 'python'
    favorite_languages['sarah'] = 'c'
    favorite_languages['edward'] = 'ruby'
    favorite_languages['phil'] = 'python'

    for name, language in favorite_languages.items():
    print(name.title() + "'s favorite language is " +
    language.title() + ".")

第10章 文件和异常

10.1 文件中读取数据
  • 读取整个文件:

    1
    2
    3
    with open('pi_digits.txt') as file_object:  # with在不再需要访问文件后将其关闭
    contents = file_object.read() # 读取文件的全部内容,返回文本的字符串
    print(contents.rstrip()) # read()到达文件末尾时返回一个空字符串,即打印后多出一个空行。因此用rstrip()去除尾部多余的空行
  • 相对路径、绝对路径

    • windows系统中为反斜杠
    • Linux中为正斜杠
  • 逐行读取

    1
    2
    3
    with open('pi_digits.txt') as file_object:  # with在不再需要访问文件后将其关闭
    for line in file_object: # 读取文件的全部内容,返回文本的字符串
    print(line.rstrip()) # 每行末尾都有两个换行符,一个来自文件,一个来自print语句,因此需要rstrip()去除多余的换行
  • 列表:readlines(),在with外也可使用此语句,且存储为每一行的内容(不包含换行符)

10.2 写入文件
  • 写入文件,代码:

    1
    2
    with open(filename, 'w') as file_object:
    file_object.write("I love programming.")
  • 附加到文件尾,模式为'a'

10.3 异常
  • 代码:

    1
    2
    3
    4
    5
    6
    try: 
    answer = a/b
    except ZeroDivisionError:
    print("You can't divide by zero!")
    else: # 依赖于try代码块成功执行的代码都应放到else代码块中
    print(answer)
  • 其他常见异常:FileNotFoundError

  • 只要程序依赖于外部因素,如用户输入、存在指定的文件、有网络链接,就有可能出现异常

10.4 存储数据——json
  • json.dump()的参数:要存储的数据以及可用于存储数据的文件对象;json.load()的参数:读取的文件对象

    1
    2
    3
    4
    with open(filename, 'w') as f_obj:
    json.dump(numbers, f_obj) # 存储
    with open(filename) as f_obj:
    numbers = json.load(f_obj) # 读取

第11章 测试代码

11.1 测试函数
  • 模块unittest提供了代码测试工具

  • 单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求

  • 函数名必须以test_打头,且由自动调用,不用编写调用它们的代码

  • 代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 导入模块unittest和要测试的函数get_formatted_ name()
    import unittest
    from name_function import get_formatted_name

    class NamesTestCase(unittest.TestCase): # 用于包含一系列针对get_formatted_name()的单元测试
    def test_first_last_name(self):
    formatted_name = get_formatted_name('janis', 'joplin')
    self.assertEqual(formatted_name, 'Janis Joplin') # 一个断言方法,核实得到的结果是否与期望的结果一致
    def test_first_last_middle_name(self):
    formatted_name = get_formatted_name('wolfgang', 'mozart', 'amadeus')
    self.assertEqual(formatted_name, 'Wolfgang Amadeus Mozart')

    unittest.main()
11.2 测试类
  • 常见的断言方法:

    1
    2
    3
    4
    5
    6
    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中