文章目录
- 3.内建数据结构、函数与文件
- 3.1数据结构与序列
- 3.2函数
- 3.3文件
- 4.NumPy基础:数组与向量化计算
- 4.1 NumPy ndarray:多维数组对象
3.内建数据结构、函数与文件
3.1数据结构与序列
- 元组
元组是一组固定长度、不可变的python对象序列;
使用tuple函数可以将任意序列或者迭代器转换成元组;
使用 + 号合并两个元组;使用“ * ”生成含有多份拷贝的元组
元组拆包:将元组类型的值赋值给表达式,python会对等号右面的值进行拆包
元组方法:count()统计某个数值在元组中出现的次数
- 列表
列表与元组类似,不过列表内容可变;使用“[]”或者list创建
list(‘foo’)=[‘f’,‘o’,‘o’]
list函数在数据处理中常用于将迭代器或者生成器转化为列表列表方法:append(),insert(),remove(),pop(),extend(),sort()
list.sort( key=None, reverse=False):
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
strings1 = ['foo', 'card', 'bar', 'aaaa', 'abab']
#根据字符串中不同字母的数量对字符串集合进行排序
strings1.sort(key=lambda x: len(set(list(x))))
print(strings1) ---------['aaaa', 'foo', 'abab', 'bar', 'card']
内建的bisect模块实现了二分查找和已排序列表的插值;
bisect.bisect会找到元素应当被插入的位置,并保持序列排序,而bisect.insort将元素插入到相应位置切片: list[start:stop:step]:包含start不包含stop,个数为stop-start个;step表示每隔step个取一个;
切片也可以被序列赋值:seq[3:4] = [6, 3]—>将索引为3的元素替换成6,3
对列表或者元组进行反转时可以将步进值设置为“-1”,
Python3 range() 返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候 不会打印列表-------Python 3.x已经去掉xrange,全部用range代替
- 内建序列函数
- enumerate():遍历一个序列的同时追踪其元素索引
b={}
for index,value in enumerate(a):
b[index]=value
print(b)-----------{0: 'hello', 1: '迪迦', 2: 'abc'}
- sorted():返回一个根据提供序列元素排序后的新列表
sort()是应用在list上的方法,sorted可以应用于任何可以迭代的序列对象;
sort()是作用原始列表,sorted()是返回一个新列表
- zip():zip将元组、列表或者其他序列进行配对,返回一个包含元组的列表;
zip可以处理任意长度的序列,生成列表的长度有最短序列决定
zip1=["A","B","C"]
zip2=["a","c","c"]
zip3=["D","E"]
print(list(zip(zip1,zip2,zip3)))----[('A', 'a', 'D'), ('B', 'c', 'E')]
a = [('你的', '名字'), ('热干', '面'), ('迪迦', '奥特曼')]
#使用zip拆分序列,将行的列表转换成列的列表
first,second=zip(*a)
print(first)------------('你的', '热干', '迪迦')
print(second)-----------('名字', '面', '奥特曼')
- reversed():将序列的元素进行倒序排序;
reversed是一个生成器,若没有进行实例化(使用list函数或者for循环)的时候,reversed()不会产生一个倒叙的列表。
- 字典:又名哈希表,关联数组;字典的“键”不可改变
字典方法:del(),pop(),keys(),values(),update():合并字典,键相同时对值进行更新
dic = {1: '你的名字', 2: "迪迦", 3: "麻辣烫"}
dic2 = {1: '你的名字', 2: "迪迦", 3: "麻辣香锅"}
del dic[1]
print(dic)
print(dic.pop(2))
dic.update(dic2)
print(dic)
{2: '迪迦', 3: '麻辣烫'}
迪迦
{3: '麻辣香锅', 1: '你的名字', 2: '迪迦'}
Python 字典 setdefault() 方法和 get()方法 类似, 如果键不已经存在于字典中,将会添加键并将值设为默认值。
dict.setdefault(key, default=None)----key:要查找的键值–default:键值不存在时设置的默认值
words = ['apple', 'bat', 'bar', 'atom', 'bat']
by_letter2 = {}
for word in words:
# 键不存在时返回空列表然后追加数据
by_letter2.setdefault(word[0],[]).append(word)
print(by_letter2)---------{'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'bat']}
defaultdict类的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值
哈希化:通过hash函数检查一个对象是否可以哈希化(即检查是否可变)
5. 集合:一种无序且元素唯一的容器
6. 列表、集合和字典的推导式
列表:[expr for val in collection if condition]
集合:{expr for val in collection if condition}
字典:{key_expr:value_expr for value in collection if condition}map(function, iterable, …)函数:function – 函数 iterable – 一个或多个序列
以参数序列中的每个元素调用function函数,返回包含每次调用function返回值的新列表
Python 2.x 返回列表。
Python 3.x 返回迭代器。
strings = ['aasd', 'asd', 'asd']
lis = list(map(len, strings))
print(lis) ----[4, 3, 3]
3.2函数
- 位置参数,关键字参数(关键字参数位于位置参数的后面)
- 函数返回多个参数时,时间是返回一个元组,然后对元组进行拆分
- 全局变量(global)和局部变量(lobal);变量作用域称为命名空间(namespace)
- 局部命名空间(lobal namespace):函数被调用时创建,函数参数立即存入该空间,函数调用结束后销毁该空间。
正则表达式模块re
- re.match():尝试从字符串起始位置匹配一个模式,如果不是其实位置匹配成功的话match()返回none, 语法格式:re.match(pattern, string, flags=0)
- re.search(): 扫描整个字符串并返回第一个成功的匹配。语法格式:re.search(pattern, string, flags=0)
- re.sub用于替换字符串中的匹配项。语法格式:re.sub(pattern, repl, string, count=0, flags=0)
import re
states = ['##apple', ' !#$cat', 'south catch#!$', 'West vir?']
def clear_strings(strings):
result = []
for value in strings:
value = value.strip() # 清除左右间隔
value = re.sub('[!#?$]', '', value) # 清除不需要的注释
value=value.title()
result.append(value) # 添加到列表中
return result
print(clear_strings(states))----['Apple', 'Cat', 'South Catch', 'West Vir']
- 匿名函数(lambda表达式):是一种通过单个语句生成函数的方式,其结果是返回值;
匿名函数使用关键字lambda定义,该关键字仅表达“我们声明一个匿名函数”的意思
- 迭代器:iter()函数用来生成迭代器
迭代器就是一种用于在上下文中(比如for循环)向Python解释器生成对象的对象。大部分以列表或列表型对象为参数的方法都可以接收任意的迭代器对象。包括内建方法比如min、max和sum,以及类型构造函数比如list和tuple;
- 生成器:普通函数每次返回单个结果,而生成器返回一个多结果序列,每个元素产生之后暂停,直到下一个请求;创建生成器只需要将“return”关键字改为“yield”关键字;
生成器表达式:(expr for value in collection if condition);将列表表达式中的"[]“改为”()"即可
gen = (x * 2 for x in range(10))
print(gen) # 实际调用生成器时代码并不会执行
print(sum(gen)) # 请求生成器的元素时代码才会执行
--<generator object <genexpr> at 0x000001497AC44C10>
--90
# 根据首字母对连续函数进行分组
import itertools
# groupby根据函数的返回值对序列中的连续元素进行分组
first_letter = lambda x: x[0]
for letter, words in itertools.groupby(words, first_letter):
print(letter, list(words)) # words是一个生成器
a ['apple']
b ['bat', 'bar']
a ['atom']
b ['bat']
3.3文件
with open(path,文件模式) as f: - -打开文件
使用with语句,文件会在with代码块结束后自动关闭。对于可读文件,最常用的方法是read、seek和tell。
read返回文件中一定量的字符 ;
tell方法可以给出句柄当前的位置
seek方法可以将句柄位置改变到文件中特定的字节
4.NumPy基础:数组与向量化计算
4.1 NumPy ndarray:多维数组对象
ndarray数组函数
- arr.shape:用来表示数组每一维度的数量
- arr.dtype:用来表示数组的数据类型
- arr.ndim:返回数组”维度“
- arr.astype:用于转换数组类型–使用astype时会生成一个新数组,即使传入的dtype与之前一样
- np.zeros:创建全是0的数组
- np.ones:创建全是1的数组
- np.empty:创建一个没有初始化数值的数组
- np.array:将输入数据(可以是元组、列表、数组等)转化为ndarray,默认复制所有输入数据
- np.asarray:将输入转化为ndarray,如果已经是ndarray则不进行复制
- np.arange:python内置range函数的数组版本,返回一个数组
数组知识杂记
- 任何在两个等尺寸数组之间的算术操作都应用了逐元素操作
- 带有标量计算的算术操作,会把计算参数传递给数组的每一个元素
- 同尺寸数组之间的比较,会产生一个布尔值数组
- 数组切片:区别于list列表,数组切片是原数据的视图,即对切片的修改会反映到原数据上
- 数组切片:arr[1,2]:1是对行切片,2是对列切片
布尔索引:与数学操作类似,数组的索引操作可以向量化
names = np.array(['jack', 'saiwen', 'jack', 'aisi'])
print(names=='jack') # [ True False True False]
print((names=='jack').dtype) # bool
print(data)
print('----' * 10)
print(data[names == 'jack'])
[[ 0.73982662 0.34342689 -0.09198625]
[-0.35124318 -0.22351474 1.53671694]
[ 0.98612959 0.56425184 -1.23695489]
[-0.62939775 -0.01318117 -1.69442004]]
----------------------------------------
[[ 0.73982662 0.34342689 -0.09198625]
[ 0.98612959 0.56425184 -1.23695489]]
- 使用布尔值索引选择数据时,总是生成数据的拷贝,即使返回的数组并没有任何变化。
- Python的关键字and和or对布尔值数组并没有用,请使用&(and)和|(or)来代替。