2.2 字符串类型

发布于:2022-12-20 ⋅ 阅读:(832) ⋅ 点赞:(0)

字符串定义

单引号或双引号,三引号都可以来定义一个字符串。

三引号允许换行。

print('''hello 
world!''')

转义字符

转义字符

功能描述

\

当位于末尾时代表转接下一行

\\

反斜杠符号

\'

单引号符号

\\"

双引号符号

\a

响铃

\b

退格BackSpace

\e

转义

\n

换行

\v

纵向制表

\t

横向制表

\r

回车

\f

换页

\000

\0yy

八进制数,其中y代表字符,比如\012代表换行

\xyy

十六进制数,其中yy代表字符,比如\x44 代表D

如果只是想单纯的正常显示字符,可以在字符串前加r或者将转义字符的\用\\替换。

比如

print(r'hello \n world!')
print('hello \\n world!')
输出结果:
hello \n world!
hello \n world!

字符串格式化

内置操作符%实现字符串格式化

格式控制方式:

%[(name)][flag][width].[precision]typecode

  • name:命名可以选择,用于指定key
  • flags:对齐方式,+表示右对齐,-表示左对齐,0表示用0填充,若为空格表示正数左侧填充空格
  • width:显示宽度
  • precision:小数点后精度
  • typecode:格式化操作符
    • s:格式化字符串
    • c:格式化单个字符
    • d:格式化十进制整数
    • u:格式化无符号数
    • o:格式化无符号八进制数
    • x:格式化无符号十六进制数
    • f:格式化浮点数
    • e/E:用科学计数法格式化浮点数,e为基底
    • g/G:格式化十进制数或浮点数

print("%10c"%65)
print("%10s"%"hi")
print("%10.3f"%10)
print("%15.3e"%65.787383749784983) #默认保留6位

# 多个占位符的操作
name = "bruce"
salary = 1000
print("我的名字是:%(name2)s,收入是%(sal)-10.2f"%{"name2":name,"sal":float(salary)})
# 注意:多个占位符的变量要写成json的格式,也可以写成元组的形式,例如
print("我的名字是:%s,收入是%-10.2f"%(name,float(salary)))

format()方法实现字符串格式化

格式说明

format的格式

replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

field_name ::= arg_name ("." attribute_name | "[" element_index "]")*

arg_name ::= [identifier | integer]

attribute_name ::= identifier

element_index ::= integer | index_string

index_string ::= <any source character except "]"> +

conversion ::= "r" | "s" | "a"

format_spec ::= <described in the next section>

format_spec 的格式

format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]

fill ::= <any character>

align ::= "<" | ">" | "=" | "^" #左移,右移,填充‘=’,居中

sign ::= "+" | "-" | " " #'!s'它调用str(),'!r'调用repr(),'!a'调用ascii()。

width ::= integer

precision ::= integer

type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

填充案例

位置填充

print("{0} {1}".format("hello", "world"))

关键字填充

print("{name} {age}".format(name='bruce',age=23))

通过字典的key

d = {'name':'bruce','age':23}
print("{student[name]} {student[age]}".format(student=d))
print("{0[name]} {0[age]}".format(d))

对象属性填充

class Student():
    name = 'bruce'
    age = 23

print("{student.name} {student.age}".format(student=Student))

下标填充

students = ['bruce','kevin', 'jerry']
print("{students[0]} {students[1]} {students[2]}".format(students =students))
print("{0[0]} {0[1]} {0[2]} {1}".format(students, 'marry'))

使用魔法参数

args=['father']
kwargs = {'name1': 'Bruce', 'name2': 'Jerry'}
print('{name1} is {name2} \'s {}'.format(*args, **kwargs)) 

格式案例

对齐

print("{:*>10}".format(2))  #右对齐,*填充,宽度10
print("{:*<10}".format(2))	#左对齐,*填充,宽度10
print("{:*^10}".format(2))  #居中对齐,*填充,宽度10

b、d、o、x分别是二进制、十进制、八进制、十六进制。

# 格式也支持二进制数字
print("int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42))
#'int: 42;  hex: 2a;  oct: 52;  bin: 101010'

# 以0x,0o或0b作为前缀
print("int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42))
#'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

f,%,e 浮点型,百分比,指数记法

print("{pai:10.2f}".format(pai=3.1415926))
print("{:10.2%}".format(0.28))
print("{pai:10.2e}".format(pai=3.1415926))

结果:
      3.14
    28.00%
  3.14e+00

'!s'它调用str(),'!r'调用repr(),'!a'调用ascii()

print("{!r:}".format("hello"))
print("{!s:}".format("hello"))
print("{!a:}".format("hello"))

结果:
'hello'
hello
'hello'

字符串内置函数

搜索替换函数

函数

功能描述

name.capitalize()

首字母大写

name.count('x')

查找某字符x在字符串内出现的次数

name.find('x')

查找字符x在字符串内第一次出现的位置,返回其下标,如果不存在返回-1

name.index('x')

查找字符x在字符串内第一次出现的位置,返回其下标,如果不存在报错

name.replace(olderstr, newstr)

查找替换,以newstr替换oldstr

字符串去空格

函数

功能

name.strip()

去掉字符串开头和结尾的空格和换行符

name.strip('x')

去掉开头和结尾指定字符或字符串

name.lstrip('x')

去掉字符串左边的空格和换行符或指定的字符x

name.rstrip('x')

去掉字符串右边的空格和换行符或指定的字符x

字符串判断

函数

功能

name.isalnum()

判断字符串是否全部为字母或数字,并且不为空

name.isalpha()

判断字符串是否全部为字母,并且不为空

name.isdigit()

判断字符串是否全部为数字,并且不为空

name.isspace()

判断字符串是否全部为空白字符,

name.islower()

判断字符串是否全部为小写字母

name.isupper()

判断字符串是否全部为大写字母

name.istitle()

判断字符串是否全部首字母大写

字符串分割截取split

A = 'this is a good day'
print(A.split(" "))
结果:
['this', 'is', 'a', 'good', 'day']

字符串拼接join

A = ['this', 'is', 'a', 'good', 'day']
print(' '.join(A))
结果:
this is a good day

A = 'this'
print(' is'.join(A))
结果:
t ish isi iss

会在序列的两个元素之间插入连接的字符。

字符串的+和*

+:字符串拼接

*:字符串重叠追加

print("*2"*3)
print("hello"+"world")

结果:
*2*2*2
helloworld

下标访问

从0开始

print("hello"[1])
结果:
e

字符串截取

s[n:m:i]

n是开启的索引,m是结束的索引但是不包括该位置,i是步长。

正向下标从0开始到len(s)-1

反向下标从负的len(s)到-1

s = "hello world"
s1 = s[0:5:2]
s2 =s[0:]
s3 = s[-4:-1]
print(s)
print(s1)
print(s2)
print(s3)

嵌套引号

s = "hello"     "world"
print(s)
结果
helloworld

str()和repr()

str():面向用户和终端

repr():面向机器

s = "hello world"
print(repr(s))
print(str(s))

结果:
'hello world'
hello world

字符串转字节encode()

s = ' dsds dsd '
s1= s.encode()
print(type(s1))

ljust()和rjust()

rjust()该方法返回字符串的右边的长度宽度,填充是通过使用指定的fillchar(默认为空格)。如果宽度小于len(s)返回原始字符串。

rjust(width[, fillchar])

s = "hello"
print(s.ljust(10,'0'))

translate() 函数

#!/usr/bin/python3
intab = "aeiou"
outtab = "12345"
trantab = str.maketrans(intab, outtab)# 制作翻译表
str = "this is string example....wow!!!"
print(str.translate(trantab))

结果:
th3s 3s str3ng 2x1mpl2....w4w!!!

字节类型bytes

bytes 只负责以字节序列的形式(二进制形式)来存储数据,至于这些数据到底表示什么内容(字符串、数字、图片、音频等),完全由程序的解析方式决定。

bytes 类型的数据非常适合在互联网上传输,可以用于网络通信编程;

不可变字节序列

1)bytes构造函数

bytes(iterable_of_ints):参数iterable_of_ints代表整数可迭代对象,包括元组,列表等,其整数不能超过255。

2)字节操作符运算

  • 重复字节序列内容,生成新变量。var2 = b‘python’,var2*2 输出结果为b‘pythonpython’

3)操作函数

bytes类型和字符串类型的操作函数几乎一样。而bytearray类型要比bytes类型多一些增删方面的函数。

和bytearray对比

bytearray是可变的字节数组

remve(value)删除列表中某个值的第一个匹配项;

pop(index =-1) 移除字节序列列表中的一个元素,默认最后一个元素。

insert(index,item)在下标为index的位置插入新的元素item。原下标位置的元素向后推移。

append(int) 尾部追加一个元素

extend(iterable_of_ints)将一个可迭代的整数结婚追加到当前bytearray

字节转字符串

decode()方式

bytes()方式

s = b' dsds dsd '


s1= s.decode()
print(type(s1))

#为 bytes() 方法指定字符集
b4 = bytes('Python31岁了', encoding='UTF-8')#UTF-8中文占3个字节
print("b4: ", b4)
结果
b4:  b'Python31\xe5\xb2\x81\xe4\xba\x86'

注意:中文乱码的原因,编解码采用包不同的编码格式时。

字节在网络传输中的顺序

Little Endian 和Big Endian

是计算机字节顺序的两种格式,Little Endian 把低字节存放在内存的低位;Big Endian把低字节存放在内存高位。

如果将0x1234abcd写入以0x0000开始的内存中,则

传输时如果发送端和接收端计算机的字节顺序不一致需要进行转换。

代码示例

 打印爱心

print('\n'.join(
    [' '.join
        (
            [
                ('Love'
                 [
                     (x - y) % len('Love')
                 ]
                 if ((x * 0.05) **2 + (y * 0.1) **2 - 1) **3 - (x * 0.05) **2 * (y * 0.1) **3 <= 0 else ' '
                 )
                for x in range(- 30, 30)
            ]
        ) for y in range(30, -30, -1)
    ]
)
)