/PyHW

《笨办法学 Python》实战

Primary LanguagePython

PyHW

《笨办法学 Python》实战 plan done erros ref

  • 必须十分小心,单词拼写十分小心;
  • 改掉坏习惯 指头打 改掉了这个习惯;但一打中文的时候就回到了坏习惯。很有意思。做一些新鲜的事情有助于发现自己的旧模式
  • 学会了看报错;不再简单地复制粘贴到 浏览器,也不再简单地截图问老公,这是怎么回事。
  • 学习一个长期的项目时,通过建仓库把这件事仪式化。

给那些初学的人什么建议

  • 比想象得有意思,不要想这是程序员干的,我又不当程序员,学他干嘛;类比看电影读如何写剧本的书
  • 建一个仓库 外部化;不要默默干
  • readme 驱动进程
  • 不理解就跳过,往前做几个练习后再返回做你不懂的。不要非弄懂
  • 不要全部敲完代码才运行;用游戏心态,看看不写这句会怎么样,更有助于理解语法的含义; 比如下面这段,中间练习需要打完很多语句,我先把头尾加上,打印一句;
poem = """
\tThe lovely world
……
"""

Plan

刷完 ex1-ex39;目标是做词云和 mapping/atl

Log

  • [x]ex22:1-16;ex23
  • 181010
    • ex31
  • 181009
    • ex30
  • 181008
    • ex29
  • 181006
    • ex27-28
  • 181005
    • ex25;
  • 181004
    • ex18-ex22;ex24; 6h
      • ex22 倒序进行到 ex17
  • 181003
    • ex9-ex17; 4h
  • 181002
    • ex1-ex8; cost 5.1h
    • create repo"PyHW";log it; cost 0.5h

Error

1. encoding

报错:

➜  python python exl.py
  File "exl.py", line 5
SyntaxError: Non-ASCII character '\xef' in file exl.py on line 5, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

办法: 在 exl.py 最上面一行添加 # coding=utf-8

ref:PEP 263 -- Defining Python Source Code Encodings | Python.org

3.1 % 为 X 除以 Y 还剩 J

3.2 浮点数

不太明白:

4. 文件另存后分清在哪一个文件上操作

遇到一个特别奇葩的问题: 不断报错编码出问题

➜  python python ex4.py
  File "ex4.py", line 1
SyntaxError: Non-ASCII character '\xe8' in file ex4.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

尝试1:检查是否有语法错误,发现不是语法错误;尝试用另一种编码方式

  • # coding=utf-8 换为 # -*- coding: utf-8 -*-

  • 继续报错

尝试2:在另一个有编码的文件中实验,发现同样的# coding=utf-8 ,另一个文件就可以完美输出;

  • 说明不是语法问题;
  • 是文件问题

尝试3:复制文本到新文件 test.py ,发现可以输出打印;

  • 说明是原文件 ex4.py 有问题;
  • 检查:ex4.py 是另存前的文件;即两个同名文件分别在不同的文件夹,终端一直输出的是 python/ex4.py;而我修改的是 mac/ex4.py
  • 根本问题是:我误以为另存后编辑器显示的是另存后的文件,实际是另存前的文件
  • 经验:改文件路径后,正在编辑的为原路径文件;不是另存后的文件。

等等又错了,是否验证过

  • 另存后编辑器显示的不是另存后的文件?
  • 需要验证:
  • 新建、另存、编辑;
  • 发现猜想错误:另存后编辑器显示的就是另存后的文件;
  • 继续还原当时的场景:我选择的不是另存,是在 finder 中直接把原文件复制粘贴到目标文件夹了,且没有在编辑器重新打开新文件,造成了错误。

经验:小黄鸭

  • 要不说出来
  • 要不每做一步,写注释

太有意思了,以为自己犯错的地方,其实并不是真实错误,也就是说,真实问题没找对。

如何找到真实问题?而不是没根据地胡乱猜想?

  • 双盲实验,控制变量
  • 重现错误场景,才能真正找到问题,这也是我为什么要「重现血案」的原因。否则下次还会再犯

感知问题 分析现象 定义问题:需要排查 复现问题:人很容易想当然,想当然就定义不了真实问题,也就无法找对真正解决办法 设计方案:写在注释里 逐一检验 计划实施 复盘归档 是也乎哉

关键是你测试前的设计过程是否有

为什么测试 测试什么场景 场景构建怼卟? 怎么证明? 指令效果吻合预期嘛? 怎么证明? 为什么

这一个小事件,让我有机会用工程思维解决问题

ex8. True, False 没有大写,打印不出来

ref: 为什么 Python 里的 True 和 False 两个布尔值首字母要大写呢? - 知乎

ex8. 为什么既有单引号又有双引号

print formatter % (
	"I had this thing.",
	"That you could type up right.",
	"But it didn't sing.",
	"So I said goodnight."
)

'I had this thing.' 'That you could type up right.' "But it didn't sing." 'So I said goodnight.'

11ex:把年龄身高输入到了weight = raw_input ()

不能填在这里,应该填在终端命令行。当脚本暂停,输入你的年龄。

12ex: pydoc raw_input

13ex: 运行程序不再是上面的 python ex13.py 而是 python ex13.py apple pear grape

参数 argument 模块 module

14ex argv & raw_input

17ex 语句里必须有变量;忘记加 %d

18ex 函数后没有加冒号

18ex def 的意义是定义函数,只定义不调用,打印不出来

比如

def print_two_again(arg1, arg2):
    print "arg1: %r, arg2: %r" % (arg1, arg2)

终端是打印不出来,必须再加上函数的内容 print_two("qi", "lin")

19ex 函数名不能有空格 cheese_and _crackers 是错误的

19ex print 缩进说明是函数模块的一部分,表示打印此函数的结果;

20ex 开始变难

24ex 如果函数没有返回值,没有加 return, 则报错信息为

typeError: 'NoneType' object is not iterable 下次遇到此类报错信息就能快速反应是没有加 return 的原因 \t\t?

25ex file.split(' ') 单引号里应该有空格;如没有则报错

报错

>>> words = ex25.break_words(sentence)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ex25.py", line 5, in break_words
    words = stuff.split(' ')
ValueError: empty separator

如何调试? 尝试1:

  • 返回 ex25.py 在 words = stuff.split('') 加空格 => words = stuff.split(' ')
  • 尝试:从头开始输入,不再报错

25ex shell 里的语句一句都不能少

比如:>>> ex25.print_last_word(sorted_words) 当时觉得无关紧要就没有打印,后面 sortedwords 就全乱了 说明函数的位置很重要

26ex x += 1 和 x = x+1

二、SymbleTable

边做边参考官方文档,非常清晰:https://python-reference.readthedocs.io/en/latest/docs/file/seek.html|ex20/ex2001 词|含义|解释 ---|---|---|--- function|函数|y(x)|exall return|返回|return 右边的东西作为函数的返回值|ex21 file.seek|指定文件位置|file.seek(0):从文件的开始位置;参考https://python-reference.readthedocs.io/en/latest/docs/file/seek.html|ex20/ex2001 file.read|Returns specified amount of bytes from the file.|f.read():返回全部内容|ex20 file.readline|Reads one entire line from the file.|f.readline():返回第一行的 string 字符|ex2001 file.write|写入|file.write(x);x=open(file_name)|ex17/16 file.truncate|清空文件|file.truncate()|ex16 file.close|关闭|file.close()|ex17 open|打开文件|打开文件并写入:open(file, 'w')|ex17 def|定义函数|类似于声明,ladies and gentlemen|ex18 exists|命令|exists 这个命令将文件字符串作为参数,文件存在则返回True;学会通过 import 调用它:from os.path improt exists/exists(file_name)|ex17 cat|命令|查看全部: cat test.txt|ex17 "w"|特殊字符串|表示文件的访问模式,写入;read只读;append 追加|ex16