Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9413181
  • 博文数量: 1748
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20070
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1748)

文章存档

2024年(24)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: Windows平台

2018-01-04 17:45:41

元组
列表
字典
集合
结构体

序列类型: 支持 in len() 分片.
    bytearray  bytes  list  str  tuple collections.namedtuple(命名元组)
----------------------------------------------------------------------------------------------------------------------
队列: collections.deque
     deque([iterable[, maxlen]]) --> deque object  类似于 list
----------------------------------------------------------------------------------------------------------------------
元组: tuple
    元组为固定的, 一般用()限定, 如果要修改,先用 list() 转化为列表再行修改.
    tuple() 产生空元组 ()
    一个或多个元素的元组一定要用 逗号 分隔. 一个元素的元组定义 (4,)即一个元素的元组也要用到逗号.

    通过 t.count(x) 来确定对象 x 在元组 t 中出现的次数
    t.index(x) 代表 x 在元组 t 中的最左边的位置, 找不到是抛出 ValueError异常,需要异常捕获处理.

    元组可以用 +(连接)  *(有多少个副本) += *=运算,但是实际上为创建了新元组. +操作是如果为一个元素,那么操作数使用格式 (元素,) 是很有必要的

    元组的差分  a,b = (1,2)  则 a=1  b=2, 一般用于for x,y in ((1,2),(3,4), (5,6)): 的格式中.

----------------------------------------------------------------------------------------------------------------------
命名元组  collections模块的 namedtuple()函数.
    示例: 
        Sale = collections.namedtuple("Sale", "productID personID data price")
        返回一个自定义类, 用于创建命名元组
        "Sale"参数为 自定义元组数据类型的名称, 等同于类名, 在 type(x)时被显示
        参数二 为字符串,空格分隔, 每一个名称代表元组元素的一个类型.

        创建一个命名元组 item = Sale(1, 1001, '2018-01-01', 34?) #按照列的个数
        访问 item.personID ==> 1001  # 按照对应的列名直接取值.
        item._asdict() 返回内部键值对映射, 通过 **item._asdict() 转化为命名参数用于str.format

----------------------------------------------------------------------------------------------------------------------
列表 list.
    l.pop() 和 l.pop(i) 为返回并移除某个(最右边)的那个元素.
    序列拆分符: * 即 赋值操作左边如果有 *var 时即为对应的位置上的对象被应用完毕后, 其与剩余的元素均赋值给var对应的引用.
    如: *dir,exe="/usr/bin/ls".split('\')  => dir=['','usr','local','bin']  exe=[ls]
          a,*b,c =[1,2,3,4]  ==> a=1  b=[2,3] c=4

    *列表进行拆解的一种应用在于 例如 计算体积的公式 

点击(此处)折叠或打开

  1. 计算体积的公式
  2. def calc(a,b,c):
  3.    return a*b*c

  4. L=[2,3,5]
  5. calc(9,*L[1:]) # 此处把 L[1:] 代表的 列表[3,5]进行拆解得到 3,5 两个数,带入到公式calc中.
对列表内的元素(数据项)迭代的方式
1. for item in L:   2. for i in range(len(L)): 然后通过 L[i] 代表某个数据项.

对列表内的数据项进行删除
1. pop  2.remove  3.对应的分片赋值为[]  4. 通过 del 列表的分片.

列表内涵 
    产生一个列表的方法. 节省很多代码
        方式一 [expression for item in iterable]
        方式二 [expression for item in iteable if condition]
        负责的情况例如:

点击(此处)折叠或打开

  1. codes = [ s+z+c for s in "MF" for z in "SMLX" for c in "BGW"
  2.     if not (s=="F" and Z=="X")]
----------------------------------------------------------------------------------------------------------------------
集合 {}  可变的集合set  固定集合frozenset
只有可哈希运算的对象可以添加到集合中, 即包括有__hash__方法的类型.
所有内置的固定数据类型. float/int/str/tuple/frozenset都可以添加到集合中, 而可变的dict/list/set不能进行哈希运算,因为他们经常变,哈希值也随之变.

集合中的数据项是无序的, 没有索引的概念, 不能分片和步距处理.  空集合一定要通过set() 创建.
集合一般用户删除重复的数据项, 因为集合包含的内容是唯一的, 即 set("hello") ==> {'h','e','l','o'} 重复的 l 字符会被过滤掉. 支持len() 和 in 操作.
集合之间可以进行子集/超集等运算.

集合内涵 {expression for item in iterable if condition}

----------------------------------------------------------------------------------------------------------------------
映射类型 - 字典 dict
内置 dict 
标准库 collections.defaultdict
有序的 collections.OrderedDict

{} 创建空字典.
{k1:v, k2:v,....} 
dict()也可以创建字典.

点击(此处)折叠或打开

  1. d1 = dict({"id":1948, "name":"ray"})
  2. d2 = dict(id=1948,name="ray")
  3. d3 = dict([("id",1948),("name","ray")])
  4. d4 = dict(zip(("id","name"),(1948,"ray")))
  5. d5 = {"id":1948, "name":"ray"}
使用 [] 来访问字典数据项  如 d5["id"],  字典添加直接赋值d["new"]=4, 删除可以用 del d5["new"], 也可以用 pop()方法

数据项迭代 可用 
1. for item in d.items():  # d.items()返回所有KV组合, 然后item[0]为key, item[1]位vale
2. for k,v in d.items() : # 直接使用 k,v的方式.
3. d.keys 和 d.values 可以单独代表所有的 key 和 values 的视图. 视图是只读的

字典也存在集合运算, 超集子集等. & | - ^等运算.

字典内涵 {key_expr:val_expr for key,value in iterable if condition}
----------------------------------------------------------------------------------------------------------------------
迭代
iter() 函数. 任何包含__iter__()方法和任意序列(包含__getitem()__方法,0为下标顺序的对象)都是一个iterable, 并提供迭代子.
使用next()获取下个迭代子, 如果没有下个迭代子,则触发 StopIteration异常.

点击(此处)折叠或打开

  1. i = iter([1,2,3,4])
  2. while True:
  3.     try:
  4.         print(next(i)) # 分别打印 2 3 4
  5.     except StopIteration:
  6.         break

enumerate()函数已迭代子为参数, 返回一个迭代子, 为一个二元组, 第一项为迭代次数(默认0开始), 第二项为迭代子的下一项.


sys.exit() 可以实现立即干净的退出.
os.path.getsize(name)  返回文件大小
os.listdir(".")  返回目录中文件和目录列表(不包含. / ..)
os.path.isfile(name) 判断是否是文件

open() 函数已文本模式打开时, 以文件对象为迭代子, 每次迭代返回文件的一行.
range() 函数一般用于整数列表或元组, 提供 for 循环中的循环计数.
random.choice() 会从序列中随机选取一个
random.sample() 把制定的iterable生成制定的项数, 并返回其中一个迭代子.

zip() 函数以一个或多个iterable为参数, 产生序列, 迭代子为元组, 元组的第一数据项来自于第一个iterable的数据, 元组的第二数据项来自第二个iterable的数据, ... 类推.

sorted()函数.  sorted(iterable, key=None, reverse=False) 例如 key=abs key=str.lower  也可以是自定义函数, 函数的输入为 iterable的迭代子, 返回也是迭代子. 注意的是排序只适合所有数据项能相互比较的组合类型
----------------------------------------------------------------------------------------------------------------------
组合类型的复制 (浅拷贝, 复制的是对象引用. 即如果iterable里边不是固定数据类型,而是内嵌可变的list/set等, 还是复制的对象引用.)
数据分片总是产生一个新的副本. 
对于不能分片的字典dict和集合set, 可以使用 dict.copy()  set.copy() 或者使用 copy.copy()完成一个新副本.
使用对应的 类型名(对象引用)也可以产生一个新副本, 例如 new_dict = dict(d) 

如果确实想要使用深拷贝, 那么需要使用copy.deepcopy()







































阅读(1387) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~