本文章内容包括:
- 电子书
- 单元习题
- 单元项目代码
《高阶Python:代码精进之路》电子版
链接地址:点击跳转
单元习题
Chapt 1
Example
-
Python 中没有变量声明,从理论上来说,是否能够有未初始化的数据?
-
如何理解 Python 中的整数是“无限长的”,为什么它们又不是无限的呢?
-
从理论上讲,是否存在能表示无限范围的类?
-
与大多数其他编程语言相比,Python对缩进的要求较严格?
-
在整个Python 项目中最好使用完全一致的代码缩进方案,但必须要求这样吗?在程序中哪些缩进必须一致?哪里可以有所不同?请举例说明。
-
准确说明为什么制表符会导致Python程序中的缩进出现问题(从而引人语法错误)?
-
Python 严格依赖代码缩进的好处是什么?
-
Python 函数可以同时返回多少个不同的值?
-
描述本章提出的针对函数的前向引用问题的解决方案。为什么会出现这类问题?9
-
在编写Python文本字符串时,应该根据哪些条件来选择引号(单引号、双引号或三引号)?
-
至少指出一个Python列表与其他语言(例如C)数组(一般是连续存储的单个类型的集合)的不同点。
Resolving
解析 (1):Python 中没有变量声明,但由于 Python 使用动态类型,因此不存在未初始化的数据。所有变量在使用前都需要被赋值。
解析 (2):Python 中的整数在理论上可以无限长,因为它们在内存中使用了任意精度的表示方式。然而,实际上整数的大小受到可用内存的限制,因此它们并不是“真正”无限的。
解析 (3):从理论上讲,Python 中不存在能表示无限范围的类。任何数据结构或类都会受到计算机物理内存和处理能力的限制。
解析 (4):是的,Python 对缩进的要求比大多数其他编程语言严格,因为 Python 使用缩进来表示代码块的层次结构,而不是使用花括号等其他标记符。
解析 (5):在整个 Python 项目中最好使用完全一致的代码缩进方案,但并不是必须要求的。在同一个代码块内,缩进必须一致,否则会引发语法错误。在不同模块或函数中,缩进风格可以不同,但为了代码可读性,建议保持一致。
解析 (6):制表符和空格混用可能导致 Python 程序中的缩进问题,因为不同的编辑器和工具对制表符的显示长度可能不同,导致语法错误。
解析 (7):Python 严格依赖代码缩进的好处是提高代码的可读性和一致性,强制开发者写出结构清晰的代码。
解析 (8):Python 函数可以通过元组、列表或字典同时返回多个不同的值,没有数量限制。
解析 (9):前向引用问题通常出现在函数调用在定义之前的情况。解决方案是将函数定义放在调用之前或使用函数声明和调用分离的方式。
解析 (10):选择引号时,主要考虑字符串中是否包含需要转义的字符。例如,如果字符串中包含单引号,使用双引号更方便,反之亦然。三引号用于多行字符串或包含多种引号的复杂字符串。
解析 (11):Python 列表可以存储不同类型的元素,而在 C 中,数组通常只能存储单一类型的元素,并且必须预先定义大小。
Chapter 2
Example
-
给字符串的索引字符赋值是否违反Python 字符串的不变性?
-
使用 += 运算符进行的字符串连接是否违反了Python 字符串的不变性?为什么?
-
Python 中有几种方法可以索引指定字符?
-
准确说明索引和切片的关系?
-
索引字符的数据类型是什么?切片产生的子字符串的数据类型是什么?
-
在 Python 中,字符串和字符“类型”之间是什么关系?
-
说出两个运算符和一种方法,使用它们可以从一个或多个较小的字符串构建较大的字符串。
-
如果要使用 index方法查找子字符串,那么先使用 in 或 not in 来测试目标字符串的好处是什么?
-
哪些内置的字符串方法和哪些运算符会产生布尔值(真/假)?
Resolving
解析 (1):给字符串的索引字符赋值会违反 Python 字符串的不变性,因为字符串是不可变的,一旦创建就不能修改其内容。
解析 (2):使用 +=
运算符进行字符串连接不会违反 Python 字符串的不变性。实际上,+=
创建了一个新的字符串对象并将其赋值给原变量,而不是修改原字符串。
解析 (3):Python 中有几种方法可以索引指定字符,主要包括通过正索引 (s[index]
) 和负索引 (s[-index]
) 的方式。
解析 (4):索引和切片是相关的概念。索引用于访问单个字符,而切片用于访问字符串的子字符串。切片的起始和结束位置可以看作是多个索引的范围。
解析 (5):索引字符的数据类型是字符串 (str
),切片产生的子字符串的数据类型也是字符串 (str
),即使结果仅包含一个字符。
解析 (6):在 Python 中,字符串和字符没有独立的“类型”区分。单个字符实际上是一个长度为一的字符串。
解析 (7):两个运算符是 +
和 *
,一种方法是 join()
。它们可以从一个或多个较小的字符串构建较大的字符串。
解析 (8):在使用 index
方法查找子字符串之前先使用 in
或 not in
测试目标字符串的好处是,可以避免 index
在未找到子字符串时引发 ValueError
异常。
解析 (9):内置的字符串方法如 startswith()
、endswith()
、isalpha()
以及运算符如 in
和 not in
会产生布尔值 (真/假)。
Chapter 3
Example
-
你能够编写同时使用正数索引和负数索引的程序或函数吗?这样做有弊端吗?
-
创建包含1000个元素的Python列表的最有效方法是什么?假设每个元素都被初始化为相同的值。
-
如何使用切片来从列表中每隔1个元素获取1个元素?(例如创建一个包含第1、33、5、7个等元素的新列表。)
-
描述索引和切片之间的区别。
-
当切片表达式中使用的索引超出范围时会发生什么?
-
如果将列表传递给函数,并且希望函数能够更改列表的值(即函数返回的列表有所不同),应避免怎样的操作?
-
什么是不平衡矩阵?
-
为什么创建任意大矩阵需要使用列表推导式或循环?
Resolving
解析 (1):你可以编写同时使用正数索引和负数索引的程序或函数。这种做法没有太大弊端,通常用于不同的场景。例如,正数索引从左到右访问元素,而负数索引从右到左访问元素。但需要注意的是,使用负数索引时要确保索引范围正确,否则会出现索引错误。
解析 (2):创建包含1000个元素的Python列表的最有效方法是使用乘法操作符:[value] * 1000
,其中 value
是初始化每个元素的值。
解析 (3):可以使用切片来从列表中每隔1个元素获取1个元素,方法是:new_list = original_list[::2]
。这将创建一个包含第1、3、5、7等元素的新列表。
解析 (4):索引用于访问单个元素,而切片用于访问一个范围内的元素,从而生成一个新的子列表。索引是对单个位置的引用,而切片是对起始位置、结束位置和步长的组合操作。
解析 (5):当切片表达式中的索引超出范围时,Python 不会引发错误,而是返回列表中可用的元素,或者返回空列表。
解析 (6):如果将列表传递给函数,并且希望函数能够更改列表的值,应避免使用 =
操作符对列表进行赋值,因为这会创建一个新的列表对象。可以通过直接修改列表的元素或使用切片赋值来更改原列表的内容。
解析 (7):不平衡矩阵是指行和列的数量不相等的矩阵,或者某些行的元素数量不同于其他行的矩阵。
解析 (8):创建任意大矩阵需要使用列表推导式或循环,因为 Python 中的列表是动态的,没有固定的大小限制。列表推导式和循环可以灵活地初始化和填充矩阵中的元素。
Chapter 4
Example
-
像 +=这样的赋值运算符仅是一种简便写法吗?它是否可以提高程序的运行性能?
-
在大多数计算机语言中,编写Python语句a,b=a+b,a,需要的最少语句数是多少?
-
在Python中,将包含100个整数的列表的元素全部初始化为0的最有效方法是什么?
-
用1,2,3,1,2,3,1,2,3...初始化包含99个整数的列表的最有效方法是什么?如果可能的话,请写出代码。
-
如果从 IDLE 中运行 Python 程序,如何最有效地输出多维列表。
-
可以对字符串使用列表推导式吗?怎样做?
-
如何从命令行获取用户编写的 Python 程序的帮助?从IDLE 中又如何获取呢?
-
在Python中,函数被称为“第一类对象”,但在大多数其他语言(例如 C++或Java)中则不是。Python函数(可调用对象)可以做哪些在C或C中无法做到的事情?
-
包装器(wrapper)、被包装的函数(wrapped function)和装饰器(decorator)有什么区别?
-
生成器函数返回值是什么(如果有返回值的话)?
-
从Python语言的角度来看,将普通函数转换为生成器函数需要进行的一项更改是什么?
-
至少说出生成器的一项优势。
Resolving
解析 (1):像 +=
这样的赋值运算符不仅是一种简便写法,在某些情况下也可以提高程序的运行性能。它避免了创建一个新的对象,因此可以减少内存分配和拷贝操作的开销。
解析 (2):在大多数计算机语言中,编写 Python 语句 a, b = a + b, a
需要的最少语句数为 2,即 t