数据类型-数字与字符串

在阅读本系列课程时,你需要跟着老师的课程代码在自己的Python 环境中输入运行,加深认识理解哦。

一 数字类型

1. 数字类型 int和float

在第一章用户交互我们给大家介绍了一下基本的数据类型,这一章主要是介绍不同数据类型的使用方法和深入研究。

数字类型即变量的值,如 age = 18,18则是我们保存的数据。
变量的是用来反映/保持状态以及状态变化的,毫无疑问针对不同的状态就应该用不同类型的数据去标识

数字类型只能存一个值,是不可变类型(不可变类型可以哈希,后面章节会讲解哈希)。

# int 整型,整数
定义:age=10  # age=int(10)
用于标识:年龄,等级,身份证号,qq号,个数
# float 浮点型,带小数点的数
定义:salary=3.1 #salary=float(3.1)
用于标识:工资,身高,体重,

2. int类型常用的方法

下面代码所使用的bin()、oct()、hex()在进制转换中经常用到,大家可以了解一下:

# 常用操作+内置的方法
print(bin(3)) #十进制转成二进制,0b11
print(oct(8)) #十进制转成八进制,0o10
print(10) #10
print(hex(16)) #十进制转成十六进制,0x10

在进行用户交互程序的时候我们常用 .isdigit()这个判断用户输入是不是数字,来进行下一步操作,这样就避免了程序出错,但是需要注意的是用户输入的内容默认是字符串,判断一个字符串是否是数字,我们使用这个方法。

age = input(“your age>>:”)
if age.isdigit(): # isdigit() 检测字符串是否只由数字组成
    age = int(age)# 如果大家在pycharm中敲代码if语句下面是会自动缩进的,如果在普通文档编辑器中,
    敲下'Tab'键就可以缩进
    age +=1 
print(age)

3. Python其他数字类型(了解)

#int(整型)
在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
#long(长整型)
跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,
但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,
所以如今在长整数数据后面不加字母L也不会导致严重后果了。
注意:在Python3里不再有long类型了,全都是int

>>> a= 2**64 # >>>表示在命令行模式下进行输入         
>>> type(a)  #type()是查看数据类型的方法
<type 'int'># int类型 
>>> b= 2**60
>>> type(b)
<type 'int'>
#complex复数型
>>> x=1-2j
>>> x.imag
-2.0
>>> x.real
1.0

二 字符串类型

1. 字符串类型介绍

在Python 中,加了引号的字符就是字符串类型,用于标识:描述性的内容,如姓名,性别,国籍,种族,定义形式:

name='Albert' # name=str(Albert)
#'Albert'、"Albert" 2种形式都是字符串
# str()可将其他数据类型转化成字符串

字符串格式化:

name = input('请输入名字>>:') #'请输入名字'为字符串
print('你好,%s' % name)# %s其实可以理解为占位符,在输出时会使用字符串后面的%后面的变量的值进行替换

2. 单引号,双引号和三引号的区别

#那单引号、双引号、多引号有什么区别呢? 让我大声告诉你,单双引号木有任何区别,
只有下面这种情况 你需要考虑单双的配合
msg = "My name is Albert , I'm 18 years old!"
#多引号有什么作用呢?作用就是多行字符串必须用多引号
msg = 
'''
今天我想写首小诗,
歌颂我的同桌,
你看他那乌黑的短发,
好像一只炸毛鸡。
'''
print(msg)
# 三引号里面写多行内容

3. 字符串的拼接

#数字可以进行加减乘除等运算,字符串呢?让我大声告诉你,也能?what ?是的,但只能进行"相加"和"相乘"运算。
>>> name='albert'
>>> age='18'
>>> name+age # 相加,简单拼接
'albert18'
>>> name*5 
'albertalbertalbertalbertalbert'
#注意1:
字符串1+字符串3,并不会在字符串1的基础上加字符串3,而是申请一个全新的内存空间存入字符串1和字符串3,
相当字符串1与字符串3的空间被复制了一次
#注意2:只能字符串加字符串,不能字符串加其他类型
字符串拼接(只能在字符串之间进行,且只能相加或相乘)

字符串类型只能存一个值,是不可变类型,可以哈希。

4. 字符串类型常用的方法

(1) 按照索引取值

字符串是不可变类型,并不能改变字符串的值,取值时最多可以有三个参数,分别是起始位置,结束位置和步长,可以正向取值,反向取值(起始位置大于结束位置或者没有起始位置与结束位置,步长为-1表示从最后一个开始,步长为负数)

hobbies = "music basketball"
print(hobbies[0])
print(hobbies[1])
print(hobbies[5])
print(hobbies[0:5])
print(hobbies[:5])
print(hobbies[0:5:2]) # 从第零个元素到第四个元素,隔一个元素取一次
print(hobbies[0:5:-2])# 取不到元素,因为表示从第零个元素到第四个元素,逆序(-2为负数)隔一个元素取一次,
第零个元素前面没有元素了,所以什么都取不出来
print(hobbies[11:5:-2])# 从第11个元素到第六个元素,逆序隔一个元素取一次
print(hobbies[-1])# 取倒数第一个字符
print(hobbies[-2])# 取倒数第二个字符

(2) 长度运算

print(len('name'))# 可用来求string类型、列表等的长度

(3) 成员运算

print('a' in 'Albert')# 判断a是否在Albert中,在则返回True,否则返回False
# False
print('a' not in 'Albert')
# True

(4) 移除空白

print('   name'.lstrip())  # 移除左边空白
print('name  '.rstrip())  # 移除右边空白
print('  name  '.strip())  # 移除两边空白

(5) 切分

切分的作用:比如给你一条数据“Kobe 24 Lakers”你需要把Kobe的号码和所属球队都提取出来,那么你可以用以下方式进行切分,会返回一个列表。

print('Kobe 24 Lakes'.split(' '))
print('n a me'.split(','))
print('n,a me'.split(','))
print('n,/a /me'.split('/',1)) # 数字表示切割次数,默认全部切割
print('n,a /me'.split('/'))
print('a|b|c'.rsplit('|',1)) # 从右边开始切割

(6) 组合

print('a'.join('1234'))
print('a'.join('bcde'))
tag = ' '
print(tag.join(['I', 'say', 'hello', 'world']))  # 可迭代对象必须都是字符串

(7) 替换

print('abc name id'.replace('a', 'card')) # 将前面字符串中的a全部替换为‘card’
name = 'albert say :i have a dream,my name is albert'
# 注意此时name原来的值并没有改变,而是产生了一个替换之后新的值
print(name.replace('albert', 'Albert', 1))# 把name中的albert替换为Albert,只替换1次,默认全部替换

(8) 字符串其他操作

# find,rfind,index,rindex,count
name='albert say hello'
print(name.find('o',1,3))  # 顾头不顾尾,找不到则返回-1不会报错,找到了则显示索引
# print(name.index('e',2,4))  # 同上,但是找不到会报错
print(name.count('e',1,3))  # 顾头不顾尾,如果不指定范围则查找所有
# center,ljust,rjust,zfill
name='albert'
print(name.center(30,'-'))
print(name.ljust(30,'*'))
print(name.rjust(30,'*'))
print(name.zfill(50))  # 用0填充

# captalize,swapcase,title
print(name.capitalize())  # 首字母大写
print(name.swapcase())  # 大小写翻转
msg='albert say hi'
print(msg.title())  # 每个单词的首字母大写

# is数字系列
# 在python3中
num1=b'4'  # bytes
num2=u'4'  # unicode,python3中无需加u就是unicode
num3='四'  # 中文数字
num4='Ⅳ' #罗马数字

# isdigit:bytes,unicode
print(num1.isdigit())  # True
print(num2.isdigit())  # True
print(num3.isdigit())  # False
print(num4.isdigit())  # False

# isdecimal:uncicode
# bytes类型无isdecimal方法
print(num2.isdecimal())  # True
print(num3.isdecimal())  # False
print(num4.isdecimal())  # False

# isnumberic:unicode,中文数字,罗马数字
# bytes类型无isnumberic方法
print(num2.isnumeric())  # True
print(num3.isnumeric())  # True
print(num4.isnumeric())  # True

# 三者不能判断浮点数
num5='4.3'
print(num5.isdigit())
print(num5.isdecimal())
print(num5.isnumeric())

'''
总结:

    最常用的是isdigit,可以判断bytes和unicode类型,这也是最常见的数字应用场景

    如果要判断中文数字或罗马数字,则需要用到isnumeric
'''

# is其他
print('===>')
name='alb123ert'
print(name.isalnum())  # 字符串由字母或数字组成
print(name.isalpha())  # 字符串只由字母组成
print(name.isidentifier())
print(name.islower())
print(name.isupper())
print(name.isspace())
print(name.istitle())