3.1 数据结构和序列元组
元组是⼀个固定⻓度,不可改变的Python序列对象。
创建元组的最简单⽅式,是⽤逗号分隔⼀列值:如下运行结果(1, 2, 3) (1, 2, (3, 4), 5)
tup = 1,2,3
tup
tup1 = 1,2,(3,4),5
tup1
当⽤复杂的表达式定义元组,最好将值放到圆括号内,如上第二个所示.
⽤tuple可以将任意序列或迭代器转换成元组,运行结果:(4,0,2)
tuple([4,0,2])
元组中存储的对象可能是可变对象。
⼀旦创建了元组,元组中的对象就不能修改了:以下报错
tup = tuple(['foo', [1, 2], True])
tup[2]= False
如果元组中的某个对象是可变的,⽐如列表,可以在原位进⾏修改,运行结果:[1, 2, [3, 4, 5]]
tup=[1,2,[3,4]]
tup[2].append(5)
tup
可以⽤加号运算符将元组串联起来,运行结果:(4, 0, 2, 2, 3)
tuple([4,0,2])+(2,3)
元组乘以⼀个整数,像列表⼀样,会将⼏个元组的复制串联起来,运行结果:(1, 2, 3, 1, 2, 3)
tup = 1,2,3
tup*2
元组拆分:直接以赋值的方式进行
tuple⽅法:因为元组的⼤小和内容不能修改,它的实例⽅法都很轻量。
其中 ⼀个很有⽤的就是count(也适⽤于列表),它可以统计某个值出现的频率。
列表
与元组对⽐,列表的⻓度可变、内容可以被修改。
你可以⽤⽅括号定义,或⽤list函数。
list函数常⽤来在数据处理中实体化迭代器或⽣成器:)(iter())
串联和组合列表
和元组一样可以使用加号“+”,将两个列表串联起来,但是耗时比较久,性能不佳,一般使⽤extend追加元素。
x.extend(obj)
排序
sort做排序:对列表做排序,list_a.sort(key=len),使用列表元素的长度来排序
sorted函数?
二分搜索和维护已排序的列表
bisect模块是一个python的针对一个有序数组的插入和排序 *** 作的一个模块。
但不检查数组是否排好序,position=bisect.bisect(x,r),返回x列表中r排序的位置(默认在右)。
切片
⽤切边可以选取⼤多数序列类型的⼀部分,语法是obj[start_index:end_index:step],start_index、end_index是obj的下标,step是步调,默认是1,取值不包括end_index的值,一下输出[12, 14, 23].
list_l = [1, 23, 45, 12, 24, 14, 52, 3]
list_l.sort()
list_l[2:5:1]
一定要注意start_index,end_index,step的正负和大小,这块容易出错,从左往右取值,step必须为正,从右往左取值,step取值为负;
还要注意在连续切片时返回类型为list类型,而取单个元素时是其本身类型。
注意注意
序列函数
python中有一部分有序列的函数:
- enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中,返回该列表及对应下标:
li = [1, 3, 12, 14, 23, 23, 42, 45]
for i, value in enumerate(li):
print(i, value)
- sorted函数:sorted函数可以从任意序列的元素返回⼀个新的排好序的列表,sorted(iterable, cmp=None, key=None, reverse=False)。
- zip函数:压缩和解压,压缩:zip可以将多个列表、元组或其它序列成对组合成⼀个元组列表,zip([iterable, …]),还有解压,反向 *** 作,将行
- reversed函数:reversed 函数返回一个反转的迭代器。
reversed(iterable)
字典
最重要的数据结构,字典别名是哈希映射或关联数组。
它是键值对的大小可变集合,键和值都是 Python对象。
- del关键字或pop⽅法:(返回值得同时删除键)删除值。
- update⽅法是原地改变字典。
- 字典创建:⽤序列创建字典:输出结果:{‘a’: 1, ‘b’: 3, ‘c’: 12}
tp1 =(1, 3, 12)
tp2 =("a","b","c")
mapping=dict(zip(tp2,tp1))
mapping
还有一种方法创建字典:字典推导式(Dict Comprehension),与列表推导式类似。
cities=['oxford','beijing','tokyo','london']
countries=['uk','china','japan','uk']
d = {city:country for city,country in zip(cities,countries) if country=='uk'}
d
{'oxford': 'uk', 'london': 'uk'}
默认值:dict的⽅法get()和pop()可以取默认值返回,语法是dict.get(key[, value]),字典里有key对应的值即取,无返回none或value,如下:
words=['apple','bat','bar','atom']
by_letter={}
for word in words:
letter =word[0]
by_letter.setdefault(letter,[]).append(word)
by_letter
{'a': ['apple', 'atom'], 'b': ['bat', 'bar']}
有效的键类型:字典的值可以是任意Python对象,⽽键通常是不可变的标量类型
(整数、浮点型、字符串)或元组(元组中的对象必须是不可变的)。
这被称为“可哈希性”。
可以⽤hash函数检测⼀个对象是否是可哈希的(可被⽤作字典的键)
集合:
集合是⽆序的不可重复的元素的集合。
你可以把它当做字典,但是只有键没有值。
可以⽤两种⽅式创建集合:通过set函数或使⽤尖括号set语句。
集合⽀持合并、交集、差分和对称差等数学集合运算。
python对集合的 *** 作:
列表、集合和字典推导式:列表推导式是Python最受喜爱的特性之⼀。
它允许⽤户⽅便的从⼀个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。
形式如下(与for循环等同):
list_comp = [expr for val in collection if condition]
dict_comp = {key-expr:value-expr for value in collection if condition}
set_comp = {expr for value in collection if condition}
3.2函数
匿名(lambda)函数?
柯里化:部分参数应用:partial它指的是通过“部分参数应⽤”从现有函数派⽣出新函数的技术,是定义了⼀个可以调用现有函数的新函数。
(输出:9)
import functools
def add_numbers(x,y):
return x + y
#派生出的如下函数add_five,只有一个参数
add_five= lambda y:add_numbers(5,y)
#内置functools模块可以⽤partial函数简化上述过程
add_five=functools.partial(add_numbers,5)
x=add_five(4)
x
生成器:能以⼀种⼀致的⽅式对序列进⾏迭代(⽐如列表中的对象或⽂件中的⾏)是Python的⼀个重要特点。
这是通过⼀种叫做迭代器协议(iterator protocol,它是⼀种使对象可迭代的通⽤⽅式)的⽅式实现的,⼀个原⽣的使对象可迭代的⽅法。
常和for一块用。
⽣成器表达式如上列表集合字典的推导式。
要创建⼀个⽣成器,只需将函数中的return替换为yeild即可。
itertools模块
错误和异常处理:优雅地处理Python的错误和异常是构建健壮程序的重要部分,这块要充实下
- [ ]这块充实下
先插入对文件读写的 *** 作模式
常用的文件方法
文件的字节和Unicode:Python⽂件的默认 *** 作是“⽂本模式”,尽量使用with方法来 *** 作文件,不用open。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)