想写一个python系列的随笔,主要是一直想要学python。当然,工作中其实也已经用到了,在我还不会的时候。python给我的感觉是用到什么就现学什么,非常的方便简单。
写这个系列并不是随便写的,主要是想通过阅读python书籍《流畅的python》,借此来提高自己的python水平吧。
学习一门语言,无法避免的就是要学习相关的数据结构。虽然不同的与语言之间,在数据结构方面或多或少有点相通的地方,但用起来还是有各自的特点。废话不多说,开弓没有回头箭。下面就是自己看完《流畅的python》的第2章的一些收获。
看了一遍之后,其实并不能记住多少知识,在写本随笔的时候,又需要去翻看该书的电子版,相当于又回顾了一遍
一、序列概览
书中,把序列按照不同的分类标准,可以这么来分
容器序列和扁平序列
容器序列有:list,tuple,collections.deque
扁平序列有:str,bytes,bytearray,memoryview,array.array
可变序列和不可变序列
可变序列有:list,collections.deque,bytearray,memoryview,array.array
不可变序列有:tuple,bytes,str
二、常用的序列
常用的序列有:list,tuple,str,不知道其它几个用得多不多,原谅我用的少
2.1、list
python中最常用也是最重要的序列就是列表(list)了。不过,书中并没有过多的去讲述 list的各个方法,而是一上来就开始讲了列表推导式和生成器表达式
列表推导式:
代码套用了书中的例子:
>>> symbols = '$¢£¥€¤' >>> codes = [ord(symbol) for symbol in symbols] >>> codes [36, 162, 163, 165, 8364, 164]
为了不滥用列表推导式,通常的原则是,只用列表推导来创建新的列表,并且尽量保持简短。列表推导式的结果是一个list
列表推导式也可以用来两个或两个以上的可迭代类型的笛卡尔积:
>>> colors = ['black', 'white'] >>> sizes = ['S', 'M', 'L'] >>> tshirts = [(color, size) for color in colors for size in sizes] >>> tshirts [('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]
生成器表达式:
生成器表达式的语法跟列表推导差不多,只不过把方括号换成圆括号而已。
>>> symbols = '$¢£¥€¤' >>> tuple(ord(symbol) for symbol in symbols) (36, 162, 163, 165, 8364, 164) >>> import array >>> array.array('I', (ord(symbol) for symbol in symbols)) array('I', [36, 162, 163, 165, 8364, 164])
2.2、元祖
元祖(tuple)可以用作不可变的列表,它还可以用于没有字段名的记录
>>> lax_coordinates = (33.9425, -118.408056) >>> city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)
上述代码中的第二行,也是对元祖的水平拆包。
还有比如用来做两个变量的值交换:
>>> b, a = a,b
而嵌套元祖的拆包也是同理,如下:
metro_areas = [ ('Tokyo','JP',36.933,(35.689722,139.691667)), # ➊ ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)), ('Mexico City', 'MX', 20.142, (19.433333, -99.133333)), ('New York-Newark', 'US', 20.104, (40.808611, -74.020386)), ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)), ] print('{:15} | {:^9} | {:^9}'.format('', 'lat.', 'long.')) fmt = '{:15} | {:9.4f} | {:9.4f}' for name, cc, pop, (latitude, longitude) in metro_areas: # ➋ if longitude <= 0: # ➌ print(fmt.format(name, latitude, longitude))
当然,书中还有一种具名元祖,这个我以前没有接触过:
>>> from collections import namedtuple >>> City = namedtuple('City', 'name country population coordinates') >>> tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667)) >>> tokyo City(name='Tokyo', country='JP', population=36.933, coordinates=(35.689722, 139.691667)) >>> tokyo.population 36.933 >>> tokyo.coordinates (35.689722, 139.691667) >>> tokyo[1] 'JP
本章的内容比较多,先写到这里吧