[Python3] 对Str,List,Dict,Tuple的思考

利用春节假刷掉了《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 [email protected] 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: 连用。
    [Python3] 对Str,List,Dict,Tuple的思考_第1张图片
    模式一览

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):

本地文档使用的文档读取函数比urlopen友好许多。不需.read()函数转化成byte格式,遍历直接为string格式,并且直接适用正则表达式。

写在后面

何时使用哪一种序列是一个需要经验的判断。就个人理解,string多数使用在需要输出(print out)的情况;list表现出严格线性,在排序中必不可少,但会存在复杂度为O(n)的情况,对大量数据不友好;dictionary有着key-value的特性,易于增加元素,在频率统计中效果拔群;而与线性代数神似的tuple,同时具有序列和元素的性质,分别可以用于元素顺序改变和充当dict的key。

你可能感兴趣的:([Python3] 对Str,List,Dict,Tuple的思考)