图书目录

目    录

第1章  如何编写和测试Python程序   1

1.1  创建你的第一个程序   1

1.2  注释行   2

1.3  测试程序   2

1.4  添加#!(释伴)行   4

1.5  可执行的程序   5

1.6  理解$PATH   6

1.7  添加参数和帮助   7

1.8  可选实参   9

1.9  运行测试   11

1.10  添加main()函数   11

1.11  添加get_args()函数   12

1.12  测试hello.py   14

1.13  用new.py开始新程序   15

1.14  使用template.py替代new.py   17

1.15  小结   18

第2章  瞭望哨:使用字符串   19

2.1  启程   20

2.1.1  如何使用测试   20

2.1.2  用new.py创建程序   21

2.1.3  编写、测试、重复   21

2.1.4  定义实参   22

2.1.5  串连字符串   24

2.1.6  变量类型   25

2.1.7  获取字符串的正确部分   25

2.1.8  在REPL中找到帮助   26

2.1.9  字符串方法   27

2.1.10  字符串比较   28

2.1.11  条件分支   29

2.1.12  字符串格式化   30

2.1.13  编写程序   31

2.2  解决方案   31

2.3  讨论   32

2.3.1  用get_args()定义实参   32

2.3.2  关于main()   32

2.3.3  给单词的第一个字符分类   33

2.3.4  打印结果   34

2.3.5  运行测试集   34

2.4  更进一步   34

2.5  小结   35

第3章  去野餐:使用列表   37

3.1  开始编写程序   38

3.2  编写picnic.py程序   39

3.3  介绍列表   41

3.3.1  向列表添加一个元素   41

3.3.2  向列表添加多个元素   42

3.3.3  对列表进行索引   44

3.3.4  对列表进行切片化   44

3.3.5  在列表中查找元素   45

3.3.6  从列表中删除元素   46

3.3.7  对列表进行排序和反转   47

3.3.8  变更列表   49

3.3.9  连接列表   50

3.4  用if/elif/else进行条件分支   50

3.5  解决方案   51

3.6  讨论   52

3.6.1  定义实参   52

3.6.2  对条目进行赋值和排序   53

3.6.3  对条目进行格式化   53

3.6.4  打印条目   54

3.7  更进一步   54

3.8  小结   54

第4章  跳过5:使用字典   57

4.1  字典   58

4.1.1  创建字典   58

4.1.2  访问字典值   60

4.1.3  其他字典方法   61

4.2  编写jump.py   62

4.3  解决方案   64

4.4  讨论   64

4.4.1  定义参数   65

4.4.2  使用dict进行编码   65

4.4.3  处理序列中条目的多种方法   65

4.4.4  不使用str.replace()   70

4.5  更进一步   70

4.6  小结   70

第5章  吼叫信:使用文件和STDOUT   73

5.1  读取文件   74

5.2  写入文件   77

5.3  编写howler.py   79

5.4  解决方案   80

5.5  讨论   81

5.5.1  定义实参   82

5.5.2  从文件或命令行读取输入   82

5.5.3  选择输出文件句柄   83

5.5.4  打印输出   84

5.5.5  低内存版本   84

5.6  更进一步   86

5.7  小结   86

第6章  数单词:读取文件和STDIN,迭代列表,格式化字符串   87

6.1  编写wc.py   88

6.1.1  定义文件输入   89

6.1.2  迭代列表   90

6.1.3  你在数什么   90

6.1.4  格式化结果   92

6.2  解决方案   93

6.3  讨论   94

6.3.1  定义实参   94

6.3.2  使用for循环读入一个文件   94

6.4  更进一步   96

6.5  小结   96

第7章  Gashlycrumb:在字典中查找条目   97

7.1  编写 gashlycrumb.py   98

7.2  解决方案   101

7.3  讨论   102

7.3.1  处理实参   102

7.3.2  读取输入文件   102

7.3.3  使用字典推导式   103

7.3.4  lookup字典   104

7.4  更进一步   104

7.5  小结   105

第8章  苹果和香蕉:找到并替换   107

8.1  更改字符串   109

8.1.1  使用str.replace()方法   109

8.1.2  使用str.translate()   110

8.1.3  变更字符串的其他方法   110

8.2  解决方案   111

8.3  讨论   112

8.3.1  定义参数   112

8.3.2  替换元音的8种方法   113

8.4  用测试进行重构   125

8.5  更进一步   126

8.6  小结   126

第9章  拨号诅咒:用单词列表生成随机嘲讽话   127

9.1  编写abuse.py   128

9.1.1  验证实参   129

9.1.2  导入随机模块并生成种子   131

9.1.3  定义形容词和名词   131

9.1.4  采集随机样本并选择   132

9.1.5  对输出进行格式化   133

9.2  解决方案   134

9.3  讨论   135

9.3.1  定义实参   135

9.3.2  使用parser.error()   136

9.3.3  程序退出值和STDERR   136

9.3.4  用random.seed()控制随机性   137

9.3.5  用range()进行迭代并使用抛弃变量   137

9.3.6  构建嘲讽语句   138

9.4  更进一步   139

9.5  小结   139

第10章  电话:随机变更字符串   141

10.1  编写telephone.py   142

10.1.1  计算变更的数量   144

10.1.2  变更空间   144

10.1.3  选择要变更的字符   145

10.1.4  变更字符串   147

10.1.5  编写程序   148

10.2  解决方案   148

10.3  讨论   149

10.3.1  变更字符串   150

10.3.2  使用list代替str   151

10.4  更进一步   152

10.5  小结   152

第11章  瓶装啤酒之歌:

编写和测试函数   153

11.1  编写bottles.py   154

11.1.1  反向计数   154

11.1.2  编写函数   155

11.1.3  为verse()编写测试   156

11.1.4  使用verse()函数   160

11.2  解决方案   160

11.3  讨论   162

11.3.1  反向计数   162

11.3.2  测试驱动开发   162

11.3.3  verse()函数   163

11.3.4  遍历歌曲小节   164

11.3.5  1500个其他解决方案   166

11.4  更进一步   166

11.5  小结   167

第12章  赎金条:随机大写文本   169

12.1  编写ransom.py   170

12.1.1  修改文本   171

12.1.2  掷硬币   171

12.1.3  创建新字符串   172

12.2  解决方案   172

12.3  讨论   174

12.3.1  遍历序列中的元素   174

12.3.2  编写函数来选择字母   175

12.3.3  编写list.append()的另一种方法   175

12.3.4  使用str代替list   176

12.3.5  使用列表解析式   176

12.3.6  使用map()函数   176

12.4  方法比较   177

12.5  更进一步   178

12.6  小结   178

第13章  圣诞节的十二天:算法设计   179

13.1  编写twelve_days.py   180

13.1.1  计数   181

13.1.2  创建序数值   182

13.1.3  制作小节   183

13.1.4  使用verse()函数   185

13.1.5  打印   186

13.1.6  开始编程   186

13.2  解决方案   186

13.3  讨论   188

13.3.1  制作一个小节   188

13.3.2  生成小节   191

13.3.3  打印小节   192

13.4  更进一步   193

13.5  小结   193

第14章  押韵机:使用正则表达式创建押韵单词   195

14.1  编写rhymer.py   197

14.1.1  分解单词   198

14.1.2  使用正则表达式   198

14.1.3  使用捕获组   201

14.1.4  真实性   205

14.1.5  创建输出   206

14.2  解决方案   206

14.3  讨论   208

14.3.1  取单词词干   208

14.3.2  对正则表达式进行格式化和注释   210

14.3.3  在程序之外使用 stemmer()函数   211

14.3.4  创建押韵字符串   212

14.3.5  不带正则表达式的stemmer()   213

14.4  更进一步   214

14.5  小结   214

第15章  肯德基修士:关于正则表达式的更多故事   215

15.1  编写friar.py   217

15.1.1  使用正则表达式拆解文本   218

15.1.2  简写类   218

15.1.3  否定简写类   220

15.1.4  使用带有已捕获的正则表达式的re.split()   221

15.1.5  编写fry()函数   223

15.1.6  使用fry()函数   227

15.2  解决方案   228

15.3  讨论   229

15.3.1  手动编写fry()函数   230

15.3.2  编写带有正则表达式的fry()函数   231

15.4  更进一步   232

15.5  小结   232

第16章  扰码器:随机重排单词中部   233

16.1  编写scrambler.py   234

16.1.1  把文本分解成行和单词   235

16.1.2  捕获组、非捕获组和可选组   236

16.1.3  编译正则表达式   236

16.1.4  对一个单词进行扰码   237

16.1.5  对所有单词进行扰码   239

16.2  解决方案   239

16.3  讨论   241

16.3.1  处理文本   241

16.3.2  对单词进行扰码   243

16.4  更进一步   243

16.5  小结   244

第17章  疯狂填词:使用正则表达式   245

17.1  编写mad.py   246

17.1.1  使用正则表达式找到尖括号   247

17.1.2  停止并打印错误   250

17.1.3  获取值   251

17.1.4  替换文本   252

17.2  解决方案   252

17.3  讨论   253

17.3.1  用正则表达式进行替换   253

17.3.2  不用正则表达式找到占位符   254

17.4  更进一步   256

17.5  小结   256

第18章  希伯来数:使用ASCII值对文本进行数字编码   257

18.1  编写gematria.py   258

18.1.1  清洁单词   259

18.1.2  序数字符值和范围   260

18.1.3  求和与归约   262

18.1.4  使用functools.reduce   263

18.1.5  对单词进行编码   264

18.1.6  拆解文本   265

18.2  解决方案   265

18.3  讨论   266

18.3.1  编写word2num()   267

18.3.2  排序   268

18.3.3  测试   270

18.4  更进一步   270

18.5  小结   270

第19章  每日健身:解析CSV文件,创建文本表输出   271

19.1  编写wod.py   272

19.1.1  读取带分隔符的文本文件   272

19.1.2  手动读取CSV文件   274

19.1.3  用csv模块进行解析   277

19.1.4  创建读取CSV文件的函数   278

19.1.5  选择健身项目   279

19.1.6  格式化输出   281

19.1.7  处理无效数据   281

19.1.8  编程时间   282

19.2  解决方案   282

19.3  讨论   284

19.3.1  读取CSV文件   284

19.3.2  潜在的运行错误   285

19.3.3  使用pandas.read_csv()解析文件   286

19.3.4  对表进行格式化   287

19.4  更进一步   289

19.5  小结   289

第20章  密码强度:生成安全且容易记忆的密码   291

20.1  编写password.py   293

20.1.1  创建唯一的单词列表   295

20.1.2  清洁文本   296

20.1.3  使用集合   298

20.1.4  对单词进行过滤   298

20.1.5  将单词首字母大写   300

20.1.6  采样和制作密码   300

20.1.7  l33t-ify   300

20.1.8  整体运行   301

20.2  解决方案   302

20.3  讨论   304

20.3.1  清洁文本   304

20.3.2  ransom()函数   305

20.3.3  l33t()函数   305

20.3.4  处理文件   306

20.3.5  采样和创建密码   307

20.4  更进一步   308

20.5  小结   308

第21章  井字棋:探索状态   309

21.1  编写tictactoe.py   310

21.1.1  验证用户输入   312

21.1.2  更改棋盘   313

21.1.3  打印棋盘   313

21.1.4  确定赢家   314

21.2  解决方案   315

21.2.1  验证实参和变更棋盘   317

21.2.2  对棋盘进行格式化   320

21.2.3  找到赢家   321

21.3  更进一步   322

21.4  小结   322

第22章  井字棋归来:带有类型提示的交互式版本   323

22.1  编写itictactoe.py   323

22.1.1  元组对话   325

22.1.2  具名元组   326

22.1.3  添加类型提示   328

22.1.4  用Mypy进行类型验证   329

22.1.5  更新不可变的结构   330

22.1.6  向函数定义添加类型提示   331

22.2  解决方案   332

22.2.1  使用TypedDict的版本   334

22.2.2  思考状态   336

22.3  更进一步   336

22.4  小结   336

后记   337

附录  使用argparse   339