Python数据类型之不可变对象

数据类型

不可变对象

  • 数字 Number
  • 字符串 Strring
  • 布尔值 Bloon

不可变对象指数据类型本身调用某些内置方法或属性后,其本身的值不会改变,只是会生成一个新的对象。

数字Number

# 整数
a = 123
print(a)

结果:

123

int整数

int()方法可以将字符串类型数据转换为数字类型。常用以input()用户输入后的值的转换。

# int()转换
bNum = input("输入数字:")

print("转换前的数据类型:", type(bNum))

print("转换后的值:", int(bNum))
print("转换后的数据类型:", type(int(bNum)))

结果:

输入数字:10
转换前的数据类型: 
转换后的值: 10
转换后的数据类型: 

浮点数float

  • 整数部分和小数部分
  • 可以采用科学计数法
# 浮点数
b = 3.141592
print(b)

# 科学计数法
b = 3.14e2
print(b)

# 小于1时,省略0
c = .7
print(c)

结果:

3.141592
314.0
0.7

float()方法

将数字类型转换为字符串类型。

# 数字转换为字符串
cFlo = 123

print(float(cFlo))
print(type(float(cFlo)))

结果:

123.0

布尔值

  • 表示真假的两个值:True和False
    • 将布尔值当作数字时:True为1,False为0
    • 将数字当作布尔值时:0为False,其余为True
# 布尔值当作数字
a = 1 + True
print(a)
print(True)

# 数字当作布尔值
b = 1 + False
print(b)

# True
if -1:
    print("-1为True")
else:
    print("-1为False")

结果:

2
True
1
-1为True

注:在Python中,除0以外的其它数字均被当作True。

字符串类型 Str

  • 字符串定义
  • 常见的方法、内置方法
  • 字符串格式化(%、format()、f-string、模块)

通过单引号''、双引号""或者三引号括起来的文本。在字符串中,一个空格也算一个字符。

# 单引号
str1 = 'Tom'
print(str1)

#双引号
str2 = "Bob"
print(str2)

# 三引号
str3 = """
I am
Jon
I love my home!
"""
print(str3)

结果:

Tom
Bob

I am
Jon
I love my home!

注:单引号和双引号表达的意思相同,表示单行字符串,三引号表示多行字符串。

字符串中常见的方法和属性

遍历和访问

可以通过for……in……循环来遍历字符串中的每个字符。通过“str[start : end : step]”方法来访问和修改字符串。

# 遍历字符串并打印
str1 = "hello world!"
for i in str1:
    print(i)
    
# 通过索引访问字符
str2 = "I love python!"

print(str2[2 : 6])

结果:

h
e
l
l
o
 
w
o
r
l
d
!
love

切片操作

切片是Python中最常见的操作方式,意思就是从一个对象中抽取部分值来。何为切片?就是将字符串中的子串抽取出来并返回。常见的切片操作“[start : end : step]”。

  • start:切片的起始位置,表示方法为索引(包括本索引位)。当它为0时,表示从字符串的开头开始切片。当省略掉start时,默认从开头切片。

  • end:切片的最终索引位,抽取的字符是start到end - 1 之间的字符。当它为0时,默认切片start到字符串末尾之间的所有字符。

  • step:切片的步长,决定着切片的长度。当它为正时,表示从左到右开始切片。当它为负时,表示从右向左开始切片。

start、end和step的正负影响着切片的方向。

下面,我们就以切片str1 = "I am Tom, I love Python!"为例子,详细讲讲切片的相关操作。

切取单个字符
# 字符串
str1 = "I am Tom, I love Python!"

# 切取单个字符
print(str1[0]) #正数第一个字符

print(str1[-1])#倒数第一个字符

结果:

I
!
I am Tom, I love Python!
I am Tom, I love Python!
!nohtyP evol I ,moT ma I

可以看出,当start为负数时,表示从字符串的末尾开始向前切片。

切取完整的字符串
# 切取整个字符串
print(str1[ : ]) #从左向右切片

print(str1[ : : ]) #从左向右切片

print(str1[ : : -1]) #从右向左切片

结果:

I am Tom, I love Python!
I am Tom, I love Python!
!nohtyP evol I ,moT ma I
start和end均为正(+)的情况
# 切取start到end - 1之间的所有元素
print(str1[1 : 7]) #切取索引1位置到6位置之间的所有字符

# 
print(str1[3 : 4])

#当start 大于end时
print(str1[7 : 3]) #切取空值

#step为负时
print(str1[2 : : -1]) # 从右向左切取

结果:

 am To
m

a I
start和end均为负(-)的情况
# 均为负时,表示从末尾向前切片
print(str1[-8 : -1])

# 从索引-7的位置反向切片
print(str1[ : -7 : -1])

# 负数表示从左向向取值,start = -2 到end=-7 从右向左取值,两者矛盾,取值为空
print(str1[-2 : -7])

#步长为负时
print(str1[-5 : -11 : -1])

# 
print(str1[-8 : ]) #索引-8的位置到末尾之间的元素

#
print(str1[ : -8]) #从字符串开头到-8索引之间的元素

结果:

 Python
!nohty

tyP ev
 Python!
I am Tom, I love
start和end混合正负(+-)的情况
# start=2,step=1,表示从左向右取值,end为负表示从末尾开始倒数7个索引位
print(str1[2 : -7])

# start=-2,倒数第2个索引开始,step=1,表示从左向右取值,结束位在索引5,取值为空。
print(str1[-2 : 5])

结果:

am Tom, I love 

常见内置方法

分割方法 str.split(str, num) 和 " ".join(str)

str.split(str1, num) 表示以字符串str中指定的字符str1作为分割符(变成逗号“,”)将整个字符串分割,并以list的形式输出。num表示分割为num + 1个子字符串,当num为-1或者不指定时,表示将整个字符串分割。

# 定义字符串
str1 = "I am Tom, I love hello world!"

# 以m作为分割符,将字符串分割两次
print(str1.split("m", 2)) #可以看到,整个字符串只分割了两次,m变成了分割符号“,”

# 以l作为分割符,将字符串分割3次
print(str1.split("l", 3)) #字符串有四个字符l,num为3,表示只分割3次

# 以空格为分割符
print(str1.split(" "))

结果:

['I a', ' To', ', I love hello world!']
['I am Tom, I ', 'ove he', '', 'o world!']
['I', 'am', 'Tom,', 'I', 'love', 'hello', 'world!']

" ".join(str) 表示以" "中的内容作为分割符,将字符串str全部分割,并以list形式输出。就以上述的str1为例:

# 以逗号作为分割符
print(",".join(str1)) #将str1每个字符均分割开来,包括空格符

# 以|作为分割符
print("|".join(str1)) #

# 相同字符作为分割符
print("l".join(str1))

结果:

I, ,a,m, ,T,o,m,,, ,I, ,l,o,v,e, ,h,e,l,l,o, ,w,o,r,l,d,!
I| |a|m| |T|o|m|,| |I| |l|o|v|e| |h|e|l|l|o| |w|o|r|l|d|!
Il lalml lTlolml,l lIl lllolvlel lhlelllllol lwlolrllldl!

str.split(str1)与"",join(str)的不同之处:

  • split是以原字符串中的字符作为分割符的,且可以规定分割的次数。指定的字符会消失,变成分割符
  • join可以自定义分割符将字符串中的字符全部分割开来。**即使指定的分割符与字符串中的字符一样,字符串中的字符也不会消失。
str.replace(oldStr, newStr, num)替换方法

str.replace(oldStr, newStr, num)表示用newStr字符串替换掉str中的oldStr字符串,num表示替换次数,毕竟会有重复的字符出现。

#
str2 = "Hello worlD!"

# 用g替换l
print(str2.replace("l", "g", 2)) #指定替换次数2次
print(str2.replace("l", "w", -1)) #num为-1时,表示全部替换掉

结果:

Heggo worlD!
Hewwo worwD!
其它常见内置方法
# 大写变小写
print(str2.lower())

# 小写变大写
print(str2.upper())

# 大写变小写,小写变大写
print(str2.swapcase())

# 字符串标题化
print(str2.title()) #标题化,就是每个单词的首字母大写

# 返回字符串的长度,即返回字符的个数
print(len(str2))

# 返回字符串中最大的字符
print(max(str2))

# 返回字符串中最小的字符
print(min(str2)) #返回的是空格

# 返回字符l出现的次数
print(str2.count("l"))

结果:

hello world!
HELLO WORLD!
hELLO WORLd!
Hello World!
12
w
 
3

del str 删除字符串

   # 删除字符串

del str2 #内存中已经没有字符串了,会出现错误的提示

删除的变量再访问,程序会报错,表示内存中已经没有这个变量了。

字符串的格式化(%、format()、f-string)

格式化:就是将一种数据类型转换为另一种类型。作用:可以用来检测用户输入的数据的安全性。

%()旧式格式化

在文本内或者需要输出的地方用%(s、d、r)来表示需要转换的类型,然后在后面紧跟着%(str1[num[list[...]]])等输出的数据。

# 旧式%()格式化
str3 = "Tom"
age = 25

print("I am %s, I %d years old today, I vervy love %r!" %(str3, age, "Python"))

结果:

I am Tom, I 25 years old today, I vervy love 'Python'!

可以看到,用%s、%d、%r分别表示需要输入的数据类型,然后%()里面的就相应按类型替换输出。其中,%s表示字符串,%d表示数字,%r表示 原始数据对象
所以输出时加了双绰号,表示它是原始数据对象。

特别注意: 双引号中以%表示的符号数量必须与%()里面的数据数量相同,不然程序会出错。

format()新式格式化
  • 使用函数形式进行格式化,替代%百分号格式化
  • 使用索引参数进行格式化。
  • 使用命名参数进行格式化。
  • 使用字典dict进行格式。

format()是Python最新出推出的字符串格式化函数。它的格式为“{}.format()”,{}对应着后面括号内的数据。

format函数是使用“{}”来占位的,有“{}”的地方就可以使用format里面的参数。

# format()格式化
print("I am {}, I {} years old today, I vervy love {}!".format(str3, age, "Python")) #{}与()中的数据相对应。

# 在{}中使用索引来对应后面的数据
print("I am {1}, I {2} years old today, I vervy love {0}!".format("Python", age, str3))

# 使用命名参数格式化
s = "我叫{name},我今年{age}岁了,我喜欢{Object}!"
print(s.format(name = "Tom", age = 25, Object = "Python"))

#使用字典dict格式化字符
dict_s = {"name" : "Tom", "age" : 25, "Object" : "Python"} # 这里的age应该对应上字符串中的字符
s = s.format(**dict_s) # **为解包。
print(s)

结果:

I am Tom, I 25 years old today, I vervy love Python!
I am 25, I Tom years old today, I vervy love Python!
我叫Tom,我今年25岁了,我喜欢Python!
我叫Tom,我今年25岁了,我喜欢Python!

可以看出,format()与%能够实现相同的功能。而且,format()可以通过索引、命名参数和dict方式来格式化字符。
其中,“**” 表示解包

# 将format前面的内容提取出来,然后再调用这个函数
s = "{}{}{}{}{}{}!"

print(s.format("hello ", "world", ",", "I ", "love ", "Python"))

结果:

hello world,I love Python!
f-String格式化

格式:f"{}"。{}中就是需要传递的参数值。

#f-string格式化
obj = "Python"
print(f"I am {str3}, I {age} years old, I vervy love {obj}!")

结果:

I am Tom, I 25 years old, I vervy love Python!

f-string格式化符最主要用于检测用户输入的数据的安全性。

附加: r""" """可以实现换行输入,而且里面的转义字符也不会发生作用,只相当于普通字符输出。

# 换行输入
print(r"""I am Tom, I \n
25 years old \n""") #转义字符没有发生功能作用,相当于普通字符。

结果:

I am Tom, I \n
25 years old \n
in 与 not in

in 用于检测某字符是否属于某字符串,如果在字符串中返回True,否则返回False。not in 起相反的效果,如果某字符不在某字符串中返回True。

# in、not in的使用
str4 = "hello python!"

print("h" in str4)
print("w" in str4)

print("w" not in str4)
print("l" not in str4)

结果:

True
False
True
False
转义字符(\t、\n、\、r"")

转义字符是具有特殊意义的字符系列。如\n表示换行,\t表示制表符,\表示一个斜杠。
在引号中有转义字符时,一般会被当作特殊字符看待,r""可以让其被看作普通字符。

# 将转义字符当作普通字符
print(r"\n\n\t\\")

结果:

\n\n\t\\

常用的转义字符:

\:些行没有结束,下一行继续书写
\n:换行符
\r:回车符
\t:制表符
\000:空格
\':单引号
\"":双引号
\\:转义成反斜杠

举例:

# 
print("I love Python!")

# 换行字符
print("I love \n Python!")

print(r"I love \\ Python!")

# 表示此行没有结束,下一行继续书写
print("I love \
Python!")

结果:

I love Python!
I love 
 Python!
I love \\ Python!
I love Python!

none类型

noen表示空值,什么也没有。一般用于在函数中返回。函数中没有return时就默认为return none。

# 返回空值
def a():
    return none

你可能感兴趣的:(Python数据类型之不可变对象)