文章目录
一、进制转换函数
Python 中 二进制以 0b
开头, 十六进制以 0x
开头, 八进制以 0o
开头。
1. bin(a: int) → str
十进制到二进制,例如
b = bin(10) # b == '0b1010'
2. int(s: str, n: int) → int
n 进制到 10 进制, 例如
i = int('ff', 16) # 16 进制到 10 进制
i = int('1010', 2) # 2 进制到 10 进制
i = int('773', 8) # 8 进制到 10 进制
3. hex(n: int) → str
10 进制转 16 进制
h = hex(15) # h == 0xf
4. oct(n: int) → str
2、10、16 进制到八进制
o = oct(10) # 10 进制转 8 进制
o = oct(0xf) # 16 进制转 8 进制
o = oct(0b11) # 2 进制转 8 进制
二、列表相关
1. 切片用法(剑指 offer 06. 倒序输出链表)
切片返回列表的一个拷贝,对切片的操作不会影响列表本身。
list[i:j]
包含list[i]
,不包含list[j]
list[::-1]
可以反向输出列表, 原列表不受影响,而list.reverse()
会改变列表顺序
2. 列表推导
使用列表推导的例子如下,使用列表推导的好处是使代码更清晰简洁,但是当推导式较为复杂是就不应使用用列表推导。且列表推导在处理大量数据时占用内存比较严重,数据量较大时应该使用生成器表达式。
nums = [x for x in range(10)] # 相当于 for x in range(10): nums.append(x)
matrix = [[j for j in range(col)] for i in range(row))
3. 生成器表达式
以处理文件为例, 下面的例子中,为了统计每行字数,分别使用列表推导和列表生成器,实现如下。列表生成器返回 generator
对象,generator
对象是可迭代的,可以使用 for
循环遍历。
生成器还可以组合起来,一个生成器表达式可以包含另一个生成器表达式,但是使用时要注意,生成器表达式返回的迭代器是有状态的,使用 for
遍历过一轮后就不能重复使用了。
# 使用列表推导, 数据量大时内存占用严重
value = [len(x) for x in open('./my_file.txt')]
print(value)
# 使用生成器表达式,适合处理大量数据,内存占用率低
expr = (len(x) for x in open('./my_file.txt')])
print(expr) # 这里 expr 是一个 generator 对象
next(expr) # 列表推导中的 value[0]
4. 列表合并
a = [0, 1]
b = [2]
c = a + b # c==[0, 1, 2]
a.extend(b) # a==[0, 1, 2]
三、filter(process:function, data:iterable) → filter object
将可迭代对象经过函数处理,过滤出符合条件的数据。返回一个filter对象(python 3.x, 2.x 返回列表),可使用 list 、set 、dict 等将结果转化为对应的可迭代数据对象。
a = [x for x in range(10)] # a == [0, 1, 2, ..., 9]
b = list(filter(lambda x:x > 5, a)) # b == [6, 7, 8, 9]
四、匿名函数(lambda)
示例:square = lambda x:x * x
等价于下面的函数。
def square(x):
return x*x
匿名函数使代码更加简洁。
五、 zip(iterable,…)→zip object
示例:
x = [x for x in range(3)] # a is [0, 1, 2]
y1 = [y for y in range(3, 6)] # b is [3, 4, 5]
y2 = [z for z in range(6, 10)] # c is [6, 7, 8, 9]
point_set1 = list(zip(x, y1)) # python3.x 中 zip 返回一个对象,需要用 list 转换
# point_set1 is [(0, 3), (1, 4), (2, 5]
point_set2 = list(zip(x, y2)) # point_set2 is [(0, 6), (1, 7), (2, 8)],这里对较长的列表做了截断
六、enumerate() 函数
在需要使用索引时,常常有如下的习惯用法:
nums = [x for x in range(10)]
for i in range(len(nums)):
nums[i] = nums[i] += i
上述代码将 nums
中的每个元素都加上了他们的下标, 其中的 range(len(nums))
可以使用 enumerate
函数替代,上面的例子可以变为如下形式, 还可以通过为 enumerate
指定第二个参数的方法来限定 i
的初始值(默认为0)。
nums = [x for x in range(10)]
for i, num in enumerate(nums):
num = num + i