Python 知识扩展(一)

一、进制转换函数

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值