利用春节假刷掉了《Python for Informatics》,书写得非常简洁实用,有一定基础的伪新手可以很快刷完。下面对所学内容进行总结,并且对书中不够翔实的部分进行补充。
Miscellaneous
-
type(): 查询对象类型(对于TypeError的debug超有用)
dir(): 查询对象可使用的函数
help(): 查询函数使用方法
ord(): 查询 char Unicode编码
import string & string.punctuation:查询被Python视为标点的字符
#示例
type(stuff)
dir(stuff)
help(stuff.capitalize)
在Java中,只存在method;在C中,只存在function。在python中,function与method共存,区别在于对function来说,object是被执行者; 而对method来说,object是执行者。A method call is called an invocation. 个人倾向于用method。一个例子:在使用
len()时,本质上是调用了obj.__len__(self)。区分实参(argument)和形参(parameter)
形参在函数中起到传递实参值的作用,函数运行结束内存分配即被取消。注意只改变了形参值却没有改变实参值的情况。
for i in range(len(numbers)):
numbers[i] *= 2 #正确做法
for i in numbers:
i*=2 #此处i是形参
有返回值和没有返回值的函数(fruitful functions and void functions)
void函数的返回值是None类型转换
str(obj[,encoding,[errors]]):将其他类型的数据转化为便于印刷(printable)的字符串形式。
String & List & Dictionary & Tuple
1.共同点
- 均为序列(sequence),可通过序号(index)遍历(traverse)。 负数index从末端开始数。slice操作均适用。
#遍历写法Ⅰ
index = 0
while index < len(fruit):
letter = fruit[index]
print letter
index+=1
#遍历写法Ⅱ
for x in fruit:
print x
- 均有
str(), list(), dict(), tuple()方法建立空序列。
对应的是'',[],{},()
当录入argument时,上述函数均起类型转换的作用 - 字符串-->列表:
.split()list()
列表-->字符串:'d'.join(t)
字典--> 散列-列表:.items() - 公有方法:
| 四者公有 | Str & List | Dict & Tuple |
|---|---|---|
len(),in,+,sorted(),reversed() |
.sort(), .reverse() |
*+运算返回运算结果,不改变原对象
2.不同点
- String和Tuple是不可修改的(immutable),只能通过建立新序列来改变value(即使用+运算符)。其他二者是可修改的。
- 基于上面的特性,String和Tuple不会因为别名(aliasing)而出问题。万物皆对象,一个对象可以对应多个变量名。对象有mutable与immutable之分。
- 除了String中的元素均为char,其他三者中的元素不要求为同一类型。
- Dictionary和Tuple中的元素都是散列的(hashable)。因此没有t.sort()或reverse()函数。但可以通过
d.items()将字典数组化而排序。
PS. python 提供sorted(seq[,key[,reverse]])(输入任意序列,返回排序后的列表)和reversed(seq)(输入任意序列,返回倒序循环体(iterator),因此无法直接输出,需要套list()) - 增加序列中的元素:
String & Tuple:+运算符
List :.append()函数
Dict: 在原有字典的基础上,直接定义key-value pair(散列的优势)
3.操作总结
[ String ]
str[n:m]:字符串切割(string slice)
属于运算符。返回[n,m)子字符串。有[n:m], [n:], [:m], [:]四种形态。
语法糖:reverse string:str[::-1]in:子序列判断
输入两个string,布尔运算前者是否在后者中出现。= < >:字符串比较
大写(uppercase)优先于小写(lowercase);同大小写比较字符串长度。str.find(sub[,start[,end]]):返回子字符串在原字符串中最早出现的位置。
str.count(substr[,start[,end]]):返回子字符串出现次数(比起写循环设置计数变量,是个语法糖)。str.strip([char]):剥离数组开头和结尾处的指定字符。默认值为空格。返回值。
str.rstrip([char)]:只剥离结尾处的指定字符。返回值。str.split([delimiter,[num_lines]):将字符串依据定界符拆开(默认为空格),并返回列表形式。str.startswith(prefix[,start[,end]])
str.startswith(prefix[,start[,end]]):返回布尔值。str.lower()str.upper():改变大小写。返回值。
str.capitalize():只大写第一个字母。返回值。str.replace(old,new[,max]): 返回值(string为immutable,故不会改变原字符串)。
str.maketrans(x[,y[,z]]):制作翻译表。若只有一个argument,则该argument必须为dict;若两个arguments,则分别对应替换值与被替换值;若三个arguments,字符串中第三个argument对应的所有字符均被删除(None)。
str.translate(table):依据翻译表翻译字符串中的字符。str.encode():将字符串形式转化为byte形式
byte.decode():将byte形式转换为字符串形式占位符(format operator)
%d : integer
%g : float
%s : string
'In %g years I have spotted %d %s. %(0.5, 111, 'single dogs' )
f"...{}...{}": python3.6的新语法,
a = 'mom'
b = 'dad'
c = f'I love {a} and {b}!'
print(c)
"...{}...{}".format(a,b): 同理
- 字符串解析(parsing strings)
data = 'From maxmoe@connect.ust.hk Sat Feb 19 09:22:16 2018'
atops = data.find('@')
sppos = data.find(' ', atops)
host = data[atops+1,sppos]
print(host)
[ List ]
注意list的大部分method都是无返回值的(直接修改原list,与string method不同)
-
+:连结(concatenate)
*: 将list内各元素都重复n遍 -
[:]列表切割同字符串 -
t.index(obj):找到列表中指定对象第一次出现时的序号。和String的find()函数相似。
t.count(obj):计算列表指定对象出现的次数。(和String的count()指令略有不同,String有start和end的选择输入,List没有) -
t.append([index,]obj):在列表末尾(默认值)加上新元素
t1.extend(t2): 合并两个列表
t.insert(index,obj):在列表指定位置插入元素 -
t.sort(): 将列表内元素以从小到大的顺序排列
t.reverse([key=...][,reverse=...]):将列表内元素倒序排列 -
t.pop(index):删除列表中序号为index的元素并返回该元素。原列表亦被修改。
del t[index]:运算符。可与切割序号[:]连用(slice index)删除多个元素。
t.remove(element):用于不知序号但知道具体元素的情况 - functions:
len()sum()max()min() -
t = list(string): 将字符串拆分成字符并且以列表形式储存。
delimiter.join(t):将列表中的元素用定界符连接成字符串。定界符可为空字符串''。 - 定义二维数组 :python虽然不需定义变量类型,但必须初始化变量
# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5;
Matrix = [[0 for x in range(w)] for y in range(h)]
Dictionary
- 用于储存元素出现频率(histogram)
-
get(key, default):返回字典中钥匙对应的值,如果不存在该钥匙,返回默认值。 - 字典的for循环遍历key。
-
d.keys(): 返回字典key构成的List -
d.items():将字典中的key-value pair以list-tuple格式返回。在遍历时有两个递归变量
Tuple
-
('a')是string不是tuple,('a',)才是tuple - tuple比较采取的是one by one的方式,而不是len
- 特色功能(神似线性代数):
用于快速交换元素顺序:a,b = b,a
用来充当dictionary的key,二者结合有多维数组的储存效果
File
-
fileObj = open(file_name,[,access_mode,[buffering]]):打开文件(但并不读取)并提供句柄(handle,本质上是file object)。默认read模式。通常与try: except:连用。
模式一览
fileObj.close()
fileObj.write(string) :不换行直接写。写完记得close,防止修改丢失。
fileObj.read([count_bytes]) :读取文件。默认全部读取。
- 文件中的换行均视为句末存在一字节换行符(\n)。
-
repr(str):输入对象,输出字符串表达式(byte形式)。 - 读取在线文档:
from urllib.request import urlopen
word_url = 'www.pigpig.com'
word_list = urlopen(word_url)
urlopen()函数读出的是class 'http.client.HTTPResponse'(file-like object),使用.read()方法之后才会成为byte,按需求可能需要套上str(obj,'utf-8')
- 读取本地文档:
fhand = open(url_path) #type(fhand):<class '_io.TextIOWrapper'>
本地文档使用的文档读取函数比urlopen友好许多。不需.read()函数转化成byte格式,遍历直接为string格式,并且直接适用正则表达式。
写在后面
何时使用哪一种序列是一个需要经验的判断。就个人理解,string多数使用在需要输出(print out)的情况;list表现出严格线性,在排序中必不可少,但会存在复杂度为O(n)的情况,对大量数据不友好;dictionary有着key-value的特性,易于增加元素,在频率统计中效果拔群;而与线性代数神似的tuple,同时具有序列和元素的性质,分别可以用于元素顺序改变和充当dict的key。

