(五)Python----bytes,bytearray字节,字节序,(线性结构),切片

本文详细介绍了Python中的bytes和bytearray对象,包括它们的定义、ASCII表示、基本操作(索引、替换、类方法)、字节序转换以及切片和赋值。通过实例展示了如何处理字节序列,以及在实际编程中的应用场景,如猴子吃桃问题和杨辉三角计算。
摘要由CSDN通过智能技术生成

一. bytes,bytearray字节序列

Python3引入

bytes可变字节序列

bytearray字节数组,列表

定义方式

  1. bytes() 定义

在这里插入图片描述
encode()编码,先当与定义bytes
decode()解码
encoding=编码格式
errors=

  1. b前缀定义
    只允许使用ASCII字符形式
    使用16进制表示
b3=bytes('abc','utf8')   #默认位UTF-8


b1=bytes()  
b2=b''


最优---给一个字符串编码----->字节序列
b3='abc'.encode()

b为bytes的前缀
在这里插入图片描述
在这里插入图片描述

ASCII 表

内存中的数据都是一个字符

\t --->\x09
\r --->13--->\x0d
\n --->10--->\x0a

\x30~~~~ \x39  字符0~~~~ 9

16进制   10进制      字符
\x41------>65-------->A
\x61------>97-------->a

这里的1指的是字符

在这里插入图片描述
在这里插入图片描述

二. bytes操作

1. 索引

返回的是该字节对应的10进制数

b=b'abcdefg'
print(b[2])

2. replace,find

str相似不可变
输入的是bytes,输出的也是bytes

例如:替换,查找

print(b'12341124'.replace(b'f',b'k'))
print(b'abc'.find(b'b'))

在这里插入图片描述

3. 类方法bytes.fromhex(string)

将16进制转为字符

string必须是2个字符16进制形式,‘2134 23a 21b’ 空格将被忽略
bytes.fromhex(‘2314 23 4a 6b00’)
在这里插入图片描述

4. hex() 十六进制表达

将字符转为16进制

'abc'.encode().hex()

三. bytearray操作

支持,从一个字节序列或者一个buffer复制出一个新的对象

1. 初始化

bytearray(string,encoding[,errors])

不能用b当前缀

2. 索引

返回对应的十进制数

prrint(bytearray(b'abcd'[2]))  

a=bytearray(b'abcdefg')
print(a[2])
#99

3. replace,find

与bytes相似

b'abcdef'.replease(b'f',b'z')
b'ab',find(b'c')

4. 如何改变extend,append,pop

  1. extend,后面为一个可迭代的整数集合
    bytearray支持,从一个字节序列或者一个buffer复制出一个新的对象
    a=bytearray(‘abcd’)
    b.bytearray(a)

在这里插入图片描述

  1. append(int) 必须为元素(0~~255)为16进制的
    在这里插入图片描述

  2. pop()

a.pop()  默认山吹最后一个元素
a.pop(-2)  删除倒数第二个元素

弹出的类型为整形10进制
在这里插入图片描述

  1. remove()
    必须用整形10进制数

在这里插入图片描述

fromhex()

将16进制转为字符
生成的是bytearray,还可以追加

bytearray.fromhex('63 62 62')

hex()

将字符转为16进制

bytearray('abc'.encode().hex())

索引

bytearray(b'abcdef')[2]返回字符对应的10进制

其他方法

在这里插入图片描述

四. 字节序(内存中)

内存中对于一个超过一个字节数据分布方式

在这里插入图片描述

  1. 大端模式,big-endian,
    网络传输更多使用大端模式所以需要将小端模式转换为大端模式
    Mac OS使用打断模式
    Java续集及使用大端模式

  2. 小端模式,little-endian,
    Intel X86 CPU使用小端模式
    Windows,linux使用小端模式,,所以需要将大端模式转换为小端模式

int和bytes转换

byteorder表示大端big小端little

  1. int.from_bytes(bytes,byteorder)
    按照指定字节序,将一个字节序列表示为-整数

大端模式
在这里插入图片描述

  1. int.to_bytes(length,byteorder)
    按照指定字节序,将一个整数表示为-----一个指定长度的字节序列

在这里插入图片描述
在这里插入图片描述

五. 切片

线性结构

  • 可迭代 for … in
  • 有长度, 通过len(x) 获取,容器
  • 可索引,通过整数下标 可以 访问元素,正索引,夫索引
  • 切片

如: list,tuple,str,bytes,bytearray

切片sequence

sequence[start:stop]
sequence[start:stop:step]
  • 通过给定的索引区间获得线性结构的一部分数据
  • start,stop,step为整数,可以是正整数,负整数,零
  • start为0时,可以省略
  • stop为末尾时,可以省略
  • step为1时可以省略
  • 切片是,索引超过上界(有边界),就取到末尾,超过下界(左边界),取到开头
  • start一定要在stop的左边
  • [:] 表示从头到尾,全部元素被取出,等效 于 copy()方法—浅拷贝

【:】前包后不包------> [ )

'abcdef'[:]

负数表示从后取

  1. str字符串
    但start和stop顺序不能反,如下,最后一个
    在这里插入图片描述
  2. bytes字节
    step步长,和start,stop同向
    step跳过几个字节
(范围为1---4),取第一个1,和范围内的第2
print(b'abcdef'[1:4:2])
#bd

在这里插入图片描述

3. 切片赋值

切片操作 ,在等号左边
被插入的可迭代对象写在等号的右边
在这里插入图片描述
替换为一个可迭代对象
同时也可以删除------替换为空
在这里插入图片描述
在这里插入图片描述

练习

猴子吃桃

在这里插入图片描述

求杨辉三角形

在这里插入图片描述
在这里插入图片描述
逐行计算

n=6
#前两行
triangele=[[1],[1,1]]

for i in range(2,n):
    cul =[1]
    pre=triangele[i-1]
    for j in range(i-1):
        cul.append(pre[j+0]+pre[j+1])
    cul.append(1)
    triangele.append(cul)
print(triangele)
n=6
triangele=[]
for i in range(n):
    cul =[1]
    triangele.append(cul)  #申请地址(门牌号)
    if i ==0:
        continue
    pre=triangele[i-1]      #取出上一行的值
    for j in range(i-1):    #依次追上一行内容
        cul.append(pre[j+0]+pre[j+1])
    cul.append(1)
print(triangele)

两头补零:在每一行的左右补零

在这里插入图片描述
尾部补零(相当于,只给尾部追加一个0)
第一个1就是尾部的0+前面的1
在这里插入图片描述

n=10
#前两行
triangele=[[1],[1,1]]

for i in range(2,n):
    new =triangele[i-1]
    new.append(0)
    print(new)
    row=[None]*(i+1)
    for j in range(i+1):
        row[j]=new[j-1]+new[j]
    triangele.append(row)

如果是将每一行打印出来,就没有必要将所有的行都存起来

n=6
pre=[]
for i in range(n):
    cur=[1] #当前行
    if i !=0:
        for j in range(1,i):
            cur.append(pre[j-1]+pre[j])
        cur.append(1)
    print(cur)
    pre=cur

对称法
一次开辟空间,左右对称减少一半的计算
在这里插入图片描述
在这里插入图片描述

n=6
pre=[]
for i in range(n):
    cur=[1]*(i+1) #当前行
    for j in range(i//2):
        val=pre[j]+pre[j+1]
        cur[j+1]=val
        cur[-j-2]=val
    print(cur)
    pre=cur

排除重复覆盖的项
在这里插入图片描述

n=6
pre=[]
for i in range(n):
    cur=[1]*(i+1) #当前行
    #为 左边
    for j in range(1,i//2+1):
        val=pre[j-1]+pre[j]
        cur[j]=val
        #减少多余的赋值(覆盖性的)
        if i !=2*j:
            cur[-j-1]=val
    print(cur)
    pre=cur

如果 j 从零开始
得到终点的索引处i和j关系为i=2*(j+1)
在这里插入图片描述

n=7
tariangel=[[1],[1,1]]
for i in range(2,n):
    row=[1]*(i+1) #当前行
    #为 左边
    for j in range(i//2):
        var=tariangel[i-1][j]+tariangel[i-1][j+1]
        row[j+1]=var
        #减少多余的赋值(覆盖性的)
        if i !=2*(j+1):
            row[-j-2]=var
    tariangel.append(row)
print(tariangel)

单行覆盖
用单个列表,覆盖,切片(不能用负索引)
在这里插入图片描述

# 单列表,覆盖,切片完成
n=6
row=[1]*n  #依次性开辟
for i in range(n):
    old=1   #row[0]
    for j in range(i//2):
        val=old+row[j+1] # range(2) 0,1
        old=row[j+1]
        row[j+1]=val
        row[i-(j+1)]=val
    print(row[:i+1])

随机数字

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值