Python数据结构&封装解构
List
- 可变
- 线性有序
Tuple
- 不可变
- 线性有序
String:字符串是字符组成的有序序列,字符可以使用编码来理解
- 不可变
- 线性有序
Bytes:bytes是字节组成的有序的不可变序列
- 不可变
- 有序
- 使用b前缀定义
- 只允许基本ASCII使用字符形式b'abc9'
- 使用16进制表示b"\x41\x61"
ByteArray
- 可变
- 有序
Set
- 可变
- 非线性
- set元素
- set的元素要求必须可以hash
- 目前学过的不可hash的类型有list、set,可hash的就是不可变的数据结构
Dict
- 可变
- 非线性
编码与解嘛
- 字符串按照不同的字符集编码encode返回字节序列bytes p encode(encoding='utf-8', errors='strict') -> bytes
- 字节序列按照不同的字符集解码decode返回字符串 p bytes.decode(encoding="utf-8", errors="strict") -> str p bytearray.decode(encoding="utf-8", errors="strict") -> str
封装解构
举例 a = 4 b = 5 temp = a a = b b = temp 等价于 a, b = b, a 上句中,等号右边使用了封装,而左边就使用了解构
封装
- 将多个值使用逗号分割,组合在一起
- 本质上,返回一个元组,只是省掉了小括号
解构
- 把线性结构的元素解开,并顺序的赋给其它变量
- 左边接纳的变量数要和右边解开的元素个数一致
Python3解构
- 使用 *变量名 接收,但不能单独使用
- 被 *变量名 收集后组成一个列表
位置参数可变参数
- 在形参前使用*表示该形参是可变参数,可以接收多个实参
- 收集多个实参为一个tuple
def add(*nums): sum = 0 print(type(nums)) for x in nums: sum += x print(sum) add(3, 6, 9) # 调用
关键字参数可变参数
- 形参前使用**符号,表示可以接收多个关键字参数
- 收集的实参名称和值组成一个字典
p 关键字参数的可变参数 p 配置信息打印 def showconfig(**kwargs): for k,v in kwargs.items(): print('{} = {}'.format(k, v)) showconfig(host='127.0.0.1',port='8080',username='harden',password='harden')
keyword-only参数(Python3加入)
- 如果在一个星号参数后,或者一个位置可变参数后,出现的普通参数,实际上已经不是普通的 参数了,而是keyword-only参数
- args可以看做已经截获了所有的位置参数,x不使用关键字参数就不可能拿到实参
def fn(*args, x): print(x) print(args) fn(3,5) fn(3,5,7) fn(3,5,x=7)
参数解构
- 给函数提供实参的时候,可以在集合类型前使用*或者**,把集合类型的结构解开,提取出所有 元素作为函数的实参
- 非字典类型使用*解构成位置参数
- 字典类型使用**解构成关键字参数
- 提取出来的元素数目要和参数的要求匹配,也要和参数的类型匹配
def add(x, y): return x+y add(*(4,5)) add(*[4,5]) add(*{4,6}) d = {'x': 5, 'y': 6} add(**d) add(**{'a': 5, 'b': 6}) add(*{'a': 5, 'b': 6})
匿名函数
匿名函数 使用lambda关键字来定义匿名函数 口参数列表不需要小括号
冒号是用来分割参数列表和表达式的
不需要使用return,表达式的值,就是匿名函数返回值
lambda表达式(匿名函数)只能写在一行上,被称为单行函数
用途 在高阶函数传参时,使用lambda表达式,往往能简化代码
本文为原创文章,转载请标明出处