想写一个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

 

本章的内容比较多,先写到这里吧

posted on 2019-01-05 16:25  tianyafu  阅读(298)  评论(0编辑  收藏  举报