学习笔记: 《Python编程快速上手--让繁琐工作自动化》, 英文名《Automate the boring stuff with Python》英文原版在线免费阅读
使用编程软件: Anaconda + PyCharm CE, 备选: Sublime Text
辅助app: SoloLearn
- 变量名只能包含字母、数字和下划线, 且不能以数字开头;本书的变量名采用驼峰形式,没有用下划线。类似lookLikeThis
- 注释采用 # 符号
print()
函数,input()
函数,len()
函数,str()
,int()
和float()
函数
- 数据类型: 整数,浮点数,字符串,布尔/Boolean
- 比较操作符:
==, !=, <, >, <=, >=
- 布尔操作符:
and, or, not
- 控制流if语句:
if, else, elif
while
语句: 只要while
语句的条件为真就会继续执行break
语句:break
相当于中断当前循环,跳出语句。执行后面的内容。continue
语句: 注意满足continue
条件意味着回到while
循环开头, 重新继续开始,而非直接继续往下(否则等于不存在或等于break
)- 死循环程序的处理: Ctrl-C //PyCharm的快捷键是Command-F2
for
循环和range()
函数: 注意range(i)=range(0, i, 1)
包括的数共i个,从0到i-1,不包括i; 类似地,range(m, n, t)
表示起止为m,终止为n-1,步长为t的整数计数, 例子range(5, -1, -1)
- 内建函数与导入模块: 例子,
import random, sys, os, math; random.randint(1, 10)
;import sys; sys.exit()
提前结束程序
-
函数的创建与调用: def语句
-
返回值和
return
语句 -
None值,
print()
默认返回该值 -
关键字参数,
print()
函数自动在末尾添加了换行,即关键字参数end默认为换行,而关键字sep默认为一个空格,用来代表',',比如print('cats', 'dogs', 'mice')
显示 cats dogs mice。 -
局部和全局作用域
-
global语句
- 列表,列表值(列表本身作为一个值)/list value,表项(列表中的值)/iterms:
[1, 2, 3]
,['cat', 'bat', 'rat', 'elephant']
,['hello', 3.14159, True, None, 42]
- 正负数下标, 切片/slice与子列表sublist:
spam = ['cat', 'bat', 'rat', 'elephant']
,spam[0:-1]==['cat', 'bat', 'rat']
, btw, 发现切片不允许表项数据类型不同。 len(spam) == 4
,len('abc') == 3
- 列表连接使用+操作符(list concatenation),删除列表中下标处的值用del语句:
del spam[2]
- 对列表supplies的循环使用技巧, 使用语句
for in in range(len(supplies))
,str(i)
,supplies[i]
in
和not in
操作符- 多重赋值技巧:
cat = ['fat', 'black', 'loud']
,size, color, disposition = cat
- 增强的赋值操作:
spam += 1
,spam -=1
,spam *=1
,spam /= 1
,spam %= 1
- 方法/methods只能在列表上调用:
index()
,append()
,insert()
,remove()
,sort()
, sort默认按ASCII字符顺序排序字幕顺序需要设置关键字参数key为spam.sort(key=str.lower)
- 类似列表的类型(但不能修改、添加或删除):字符串, 元组/tuple, tuple采用圆括号代替方括号
- 用
list()
和tuple
函数来转换类型 - 变量包含对列表值的引用,而不是列表值本身;而对于字符串和整数值,变量包含了字符串或整数值
- 4.7.1 传递引用:
eggs()
被调用时,没有使用返回值来为spam赋新值,因为eggs(spam)
只是相当于让someParameter指向spam的列表,但由于someParameter和spam同时指向列表,因此对列表的.append
操作修改了列表的内容。这是列表和元组或字符串等一般变量的不同之处。 - copy模块的用法:
copy.copy()
,copy.deepcopy()
-
字典数据类型:键-值
-
字典(example: spam)与列表:
if color in spam.keys(): if color in spam.values(): if color in spam: // means spam.keys() list(spam.keys())
-
keys(), values(), iterms()
for v in spam.values(): for k in spam.keys(): for i in spam.items():
-
get()
方法有两个参数, 第一个是要取值的键,第二个是如果该键不存在时,返回的备用值:str(spam.get('xxx', 0))
,不使用get()
而字典没有相应的键时,程序运行会产生错误消息。 -
setdefaut()
方法有两个参数,第一个是要检查的键,第二个是如果该键不存在时要设置的值:spam.setdefault('color', 'black')
,可以确保一个键存在的快捷方式。//get()
和setdefault()
的区别参见这里。 -
漂亮打印pprint模块:
pprint.pprint()
,pprint.pformat()
-
使用数据结构对真实世界建模: 井字棋游戏为例
-
嵌套的(nested)字典和列表
- 嵌套读取的一个例子:
for k, v in guests.items(): numBrought = numBrought + v.get(item, 0)
-
转义字符: \t制表符, \n换行符, \倒斜杠, \`单引号, \"双引号
-
原始字符串,在引号之前加r 。用于正则表达式字符串很有用。
>>> print(r'That is Carol\'s cat.'') That is Carol\'s cat.
-
三重引号, 三个单引号或三个双引号作为起止。其间所有的引号、制表符或换行符(不需要额外敲入
\n
)都视为字符串的一部分。 -
注释单行用#,多行用三重双引号作为起止
-
无论spam是列表,字符串还是元祖/tuple,切片读取的代码都是spam[]格式,in和not in操作符同样可用
-
字符串方法
.upper()
,.lower()
,.isupper()
,.islower()
,.isalpha()
,.isalnum()
,.isdecimal()
,.isspace()
,.istitlle()
,.startswith()
,endswith()
,.join()
,.split()
,.rjust()
,.ljust()
,.center()
,.strip()
,.rstrip()
,.lstrip()
, -
用pyperclip模块拷贝粘贴字符串
>>> import pyerclip >>> pyerclip.copy('Hello world!') >>> pyerclip.paste() 'Hello world!'
- 安装第三方模块pyperclip的方法,Windows下使用Anaconda,可以打开anaconda prompt输入
pip install pyperclip
即可, Mac下终端输入:conda install -c conda-forge pyperclip
, 等待响应Collecting package metadata (repodata.json): done
等之后即可。如果输入pip install pyperclip
则仅仅是给Mac自带的python程序安装该包,与Anaconda无关。 - PyCharm设置解释器选项中的pyperclip安装包配置问题参见这里。
- 安装第三方模块pyperclip的方法,Windows下使用Anaconda,可以打开anaconda prompt输入
-
项目“口令保管箱”程序pw.py运行FAQ:
- 可以将路径改成Anaconda的python.exe所在路径,参考附录B的做法添加到环境变量中的PATH
- 路径名称中的目录名(或者可能包括用户名)有空格,可以将整条路径语句用双引号前后包围起来。
- 注意pw.py代码的第一行中为
#!python3
,这里3和python之间没有空格,否则也会运行网上看到的其他人的运行问题:Can't open file... [Errno 2] No such file or directory - 注意pw.bat中的代码最后结尾部分有
%*
,用于表示输入任何变量,对应这里的account - windows下输入pw email后,运行成功,可以ctrl+c查看效果,如果只输入pw,后面没有接email等任意账号,则会显示Usage开头的那条语句。
-
项目“表格打印”编写FAQ:
- 不要用书中的生成列表方法
colWidths = [0] * len(tableData)
, 理由是因为[[None]*n]*m
这样的方式生成的列表, 里面的全部都这是引用, 都是同一个对象, 并不是m个对象! 因为你已经将多个引用复制到同一个对象。 for a in range(len(tableData)):
这样的语句不要错写成for a in range(tableData):
或for a in tableData:
- 不要用书中的生成列表方法
-
技术专家Cory Doctorow声称,甚至应该在教授编程之前,先教授正则表达式:知道正则表达式可能意味着用3步解决问题,而不是用3000步。(论vi正则表达式练习的重要性)
-
import re
导入正则表达式块之后,使用re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
返回一个Regex(正则表达式)对象,这里re是regular express的缩写,compile表示编制、编译的意思,所以括号内是正则表达式,引号内的\d表示一个数字字符,而引号前加r表示将该字符串标记为原始字符串(见P97, 6.1.4),而非转义字符。 -
Regex对象的search()方法查找传入的字符串,返回一个Match对象,Match对象有一个group()方法返回匹配的文本。
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') >>> mo = phoneNumRegex.search('My number is 415-555-4242') >>> print('Phone number found: ' + mo.group())
-
利用括号分组,管道匹配多个分组,问号实现可选匹配,星号匹配零次或多次,加号匹配一次或多次,花括号匹配特定次数。
-
花括号匹配次数{}默认为贪心匹配模式,加?改为非贪心。
-
.findall()和.search()的区别,在于前者返回一个匹配字符串列表或字符串的元组的列表。
-
字符分类\w, \W, \s, \S
>>> xmasRegex =re.complier(r'\d+\s\w+') >>> xmasRegex.findall('12 drummers, 11 pipers, 10 lords, 9 ladies, 8 maids, 7 swans, 6 geese, 4 birds, 3 hens, 2 doves, 1 partridge') ['12 drummers', '11 pipers', '10 lords', '9 ladies', '8 maids', '7 swans', '6 geese', '4 birds', '3 hens', '2 doves', '1 partridge']
这里
\d+\s\w+
表示一个或多个数字,接一个空白字符,接一个或多个字母/数字/下划线字符. -
字符分类[aeiouAEIOU]将匹配所有元音字符,不论大小写。
-
字符分类左方括号后加上一个插入字符^, 得到非字符类。
-
开始匹配和结尾匹配, 在正则表达式开始处插入
^
,结尾处使用$
-
通配字符:
(.*)
匹配除换行外的所有字符,默认贪心模式。 -
.sub()方法替换字符串
-
管理复杂的正则表达式, re.VERBOSE, re.IGNORECASE, re.DOTALL
-
os.path
模块的完整文档在Python网站上 -
os.getcwd()
获取当前工作目录。os.chdir(path)
改变工作目录。os.makedirs(path)
创建新文件夹。 -
绝对路径和相对路径:
os.path.abspath(path)
,os.path.isabs(path)
,os.path.relpath(path, start)
最后一个相当于找出从start到path的相对路径字符串。 -
os.path.basename(path)
路径的基本名称(最后一个目录或文件),os.path.dirname(path)
路径的目录名称(最后一个目录和文件之前的所有路径全名)。os.path.split(path)
相当于将前面的dirname和basename一分为二。 -
os.path.getsize(path)
查看文件大小。os.listdir(path)
查看文件夹内容。 -
查看路径有效性:
os.path.exists(path)
,os.path.isdir(path)
,os.path.isfile(path)
-
文件读取的两种方法过程。
- 打开一个已存在的文本文件hello.txt
>>> helloFile = open('.../hello.txt') >>> helloContent = helloFile.read() >>> helloContent `hello world!`
- 采用realines()方法:
>>> sonnetFile = open('sonnet29.txt') >>> sonnetFile.readlines()
-
写入文件
>>> baconFile = open('bacon.txt', 'w') >>> baconFile.write('Hello world!\n') 13 >>> content = baconFile.read() >>> baconFile.close() >>> print(content)
-
用shelve模块保存变量,
shelve.open('mydata')
,shelf值又keys()和values()方法。 -
用pprint.pformat()函数保存变量。
-
问题:函数和方法的区别是什么? 回答:Difference between Method and Function in Python
参考内容: |
---|
PyCharm Tutorial #1 - Setup & Basics: |
Getting Started with PyCharm |
- Shift + Alt + C: 查看文件修改记录
参考内容: |
---|
简明 VIM 练级攻略 |
VIM总结之一: VIM编辑器常用命令详解 |
- 在PyCharm中启用或取消vim插件功能的快捷键: Ctrl + Alt + v
- undo: u, 3u means undo last 3 times
- redo: ctrl + r
- search: /, and press n to locate the next words
- :%s/old/new/gc: search all old and replace with new, gc means greedily with confirm
- :$/old/new: work in the first old with new in current line
- :$/old/new/g: all in current line
- :set nu
- :set nonu
- a, o, A, O, i, I, 0, ^, $, gg, G, nG, h, nh, n+, n-, x, nx, H, L
- dd, ndd, dW, d$, d0, d^, dG, dnG, dw, dW: delete lines
- cw
- p, P: paste
- c
- r, 5r, R
- v, V: visualize and select
- R
- fx: find x in the current line
- y, yy: means ddP or copy current line, notice that dd means cut, not delete
- b, w, e, B, nw, W: jump words