Python入门之(2.1)基本数据类型

Python基础数据类型详解
本文详细介绍了Python中的基本数据类型,包括数值、字符串、变量和正则表达式等内容。通过丰富的示例代码展示了如何使用这些数据类型进行各种操作。

 

目录

基本数据类型

1.1数值

1.2字符串

1.3变量

1.4正则表达式


 

基本数据类型

Python中的基本数据类型主要分为两种,即数值数据类型字符串数据类型

Python使用对象模型来存储数据,每一个数据类型都有一个相对应的内置类。新建一个数据,实际就是初始化并生成一个对象,即所有数据都是对象

Python中的对象有下述3个特性:

  1. 标识:对象的内存地址,可以使用函数id()来获得;

  2. 类型:决定了该对象可以保存什么值,可执行何种操作,需遵循什么规则,可以使用函数type()来获取;

  3. 值:内存空间中保存的真实数据。

1.1数值

Python数值数据类型用于存储数值,其最大特点是不允许改变。如果改变数值数据类型的值,将导致重新分配内存空间。

Python3支持int、float、bool、complex(复数)等几种数据类型。

  • 整型(int):可以是正整数或负整数,无小数点。Python3中的整型数据是没有大小限制的,可以作为long类型使用。整型数据的4种表现形式如下:
整型数据的表现形式(以十进制的27为例)
进制开头例子
二进制0b0b11011
八进制0o0o33
十进制正常27
十六进制0x0x1b

这四种进制数据的转换,可以通过Python中的内置函数bin()、oct()、int()和hex()来实现。

  • 浮点型(float):浮点型数据由整数部分和小数部分组成。浮点型常量也可使用科学计数法表示,如2.5e2=2.5\ast 10^{2}=250
  • 布尔型(bool):布尔型数据的运算结果是常量True或False,这两个常量的值是1和0,可以和数值型数据进行运算。
  • 复数(complex):复数由实数部分和虚数部分构成,可以用a+bj或者complex(a,b)表示。复数的实部和虚部都是浮点型数据。

注意:

  1. float()函数可以显式地将int类型数据强制转换成float类型数据;
  2. int()函数可以将float类型数据强制转换成int类型数据,执行取整运算,而不是四舍五入运算。如,int(2.7)的值为2;
  3. type()函数可以任何值或变量的数据类型;
  4. isinstance()函数可以判断某个值或变量是否为给定的类型;
  5. complex(x)将x转换为复数,实数部分为x,虚数部分为0.complex(x,y)将x和y转换成复数,实部为x,虚部为y。x和y为数字表达式。

数值数据类型及转换测试代码: 

a,b,c,d=20,3.5,False,5+6j
print(type(a),type(b),type(c),type(d))
e=20170000000201700002017
f=e+5
print(e)
print(f)
g=2.17e+18
print(g)
print(bin(26),oct(26),hex(26))
print(oct(0x26),int(0x26),bin(0x26))
print(int(35.8),float(23))
print(isinstance(24,float))
print(complex(5))
print(complex(3,4))

 

运行结果:

E:\PycharmProjects\PythonTest\venv\Scripts\python.exe E:/PycharmProjects/PythonTest/ssss.py
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
20170000000201700002017
20170000000201700002022
2.17e+18
0b11010 0o32 0x1a
0o46 38 0b100110
35 23.0
False
(5+0j)
(3+4j)

Process finished with exit code 0

 

在上面的代码中,第一行是数据的定义,刚开始还有点没看懂,因为C、C++等都是一个变量一个变量地定义。Python根据赋值给变量的数据自动确定变量的类型并分配相应的存储空间,所以变量a、b、c和d的类型分别是int、float、bool和complex(复数)。

1.2字符串

Python中的字符串是用单引号(')、双引号('')或三引号(''')括起来,同时使用反斜杠(\)转义特殊字符的一段文字。字符串是一个有序字符的集合,用于存储和表示基本的文本信息,但是它只能存放一个值,一经定义,不可改变

注意:

  1. 反斜杠可以用来转义;在反斜杠前使用r,可以让反斜杠不发生转义;(r怎样使用?像下面的例子一样放在含有不转义的反斜杠的字符串的前面?
  2. 字符串可以用+运算符进行字符串连接,用*运算符进行字符串重复;
  3. Python中的字符串有两种索引方式,即从左往右从0开始,和从右往左从-1开始;
  4. 反斜杠可以作为续行符,表示下一行是上一行的延续;还可以使用"""..."""或者'''...'''跨越多行;(反斜杠作为续行符的时候怎样用,只能用在字符串里面吗?后面的一种方法怎样使用?
  5. 可以对字符串进行切片来得到子串。切片的语法是用冒号分隔两个索引,形式为 字符串变量[头下标:尾下标];(含有的字符个数等于尾下标-头下标吗?ans:等于
  6. 字符串不能被改变。向一个索引位置赋值,比如word[0]='m',会导致错误;
  7. find()函数用于在一个较长的字符串中查找子字符串,返回子串所在位置的最左端索引。如果没有找到,返回-1;
  8. lower()函数返回字符串的小写字母表示,upper()函数返回字符串的大写字母表示;
  9. replace()函数返回某个字符串的所有匹配项均被替换之后的字符串。(前面说字符串一经定义,不能改变,那么replace函数的实现机制是怎样的?是又分配了内存空间吗?

若字符串中包含特殊含义的符号,需要使用转义字符。常见的转义字符如下表所示:

常见的转义字符
转义字符含义转义字符含义转义字符含义
\'单引号\a发出系统响铃声\f换页符
\''双引号\t横向制表符\o八进制数代表的字符
\n换行符\v纵向制表符\x十六进制数代表的字符
\b退格符\r回车符\000终止符,其后的字符串全部忽略

字符串数据类型测试代码:

mystr='I \' am a student'
print(mystr,type(mystr),len('My major is computer.'))
print('c:\\address\name')
print(r'c:\\address\name')
print('hello,'+mystr,mystr*2)
print(mystr[3:5])
print(mystr+'\
     My major is computer')
print(mystr.find('am'))
print(mystr.lower(),mystr.upper())
print(mystr.replace('student','teacher'))

运行结果:

E:\PycharmProjects\PythonTest\venv\Scripts\python.exe E:/PycharmProjects/PythonTest/ssss.py
I ' am a student <class 'str'> 21
c:\address
ame
c:\\address\name
hello,I ' am a student I ' am a studentI ' am a student
 a
I ' am a student     My major is computer
4
i ' am a student I ' AM A STUDENT
I ' am a teacher

Process finished with exit code 0

第二行中len函数用来求字符串的长度,在C、C++、Java等语言中分别是怎样求字符串的长度的?算出来的字符串的长度有没有包含最后的'\0'?

第三行中,\\不是转义字符,我记得在C中好像是,表示一个反斜杠?

Python中提供了大量的字符串操作函数,常用的字符串操作函数如下表所示:

常用字符串操作函数
字符串函数名功能描述
len(str)获取字符串str的长度,即字符串中字符的个数
strcpy(str1,str2)复制字符串
strcat(str1,str2)连接两个字符串
strcmp(str1,str2)比较两个字符串的大小
S.find(substr[,start[,end]])返回S中出现substr的第一个字母的索引;如果S中没有substr,返回-1
S.index(substr[,start[,end]])返回S中出现substr的第一个字母的索引;如果S中没有substr,返回一个运行时错误
S.rfind(substr[,start[,end]])返回S中最后出现的substr的第一个字母索引;如果S中没有substr,返回-1
S.rindex(substr[,start[,end]])返回S中最后出现substr的第一个字母的索引;如果S中没有substr,返回一个运行时错误
S.count(substr[,start[,end]])计算substr在S中出现的次数
S.replace(oldstr,newstr[,count])把S中的oldstr替换为newstr,count为替换次数
S.strip([chars])把S中前、后由chars指定的特殊字符全部去掉
S.expandtabs([tabsize])把S中的tab字符替换为空格,每个tab替换为tabsize个空格
S.split(sep[,maxsplit])以sep为分隔符,把S分割成一个列表对象
S.splitlines([keepends])按照行分隔符,把S分割成一个列表对象
S.join(seq)返回通过指定字符连接序列中所有元素后所生成的新字符串
S.swapcase()字符串S大小写互换
S.capitalize()字符串S首字母大写
str.strip()去掉字符串S两边的空格
str.lstrip()去掉字符串S左边的空格
str.rstrip()去掉字符串S右边的空格
S.encode([encoding[,errors]])对字符串S编码
S.decode([encoding[,errors]])对字符串S解码
S.startwith(prefix[,start[,end]])判断字符串S是否以prefix开头
S.endwith(suffix[,start[,end]])判断字符串S是否以suffix结尾
S.isalnum()判断字符串S是否全是字母和数字,并至少有一个字符
S.isalpha()判断字符串S是否全是字母,并至少有一个字符
S.isdigit()判断字符串S是否全是数字,并至少有一个数字
S.isspace()判断字符串S是否全是空白字符,并至少有一个空格
S.islower()判断字符串S中的字母是否全是小写
S.isupper()判断字符串S中的字母是否全是大写
S.istitle()判断字符串S是否是首字母大写的
S.rjust(width)获取固定长度,右对齐,左边不够用空格补齐
S.ljust(width)获取固定长度,左对齐,右边不够用空格补齐
S.center(width)获取固定长度,中间对齐,两边不够用空格补齐
S.zfill(width)获取固定长度,右对齐,左边不够用0补齐

 

字符串函数使用举例代码:

mystr='PythonInteresting'
print('字符串字符大小写变换函数示例:')
print('%s lower= %s' % (mystr,mystr.lower()))
print('%s upper= %s' % (mystr,mystr.upper()))
print('%s swapcase= %s' % (mystr,mystr.swapcase()))
print('%s capitalize= %s' % (mystr,mystr.capitalize()))
print('%s title= %s' % (mystr,mystr.title()))
print('字符串格式相关函数示例:')
print('%s ljust= %s' % (mystr,mystr.ljust(20)))
print('%s rjust= %s' % (mystr,mystr.rjust(20)))
print('%s center= %s' % (mystr,mystr.center(20)))
print('%s zfill= %s' % (mystr,mystr.zfill(20)))
print('字符串搜索相关函数示例:')
print('%s find on = %d' % (mystr,mystr.find('on')))
print('%s find t = %d' % (mystr,mystr.find('t')))
print('%s find t from %d = %d' % (mystr,1,mystr.find('t',1)))
print('%s find t from %d to %d = %d' % (mystr,1,2,mystr.find('t',1,2)))
print('%s rfind t = %d' % (mystr,mystr.rfind('t')))
print('%s count t = %d' % (mystr,mystr.count('t')))
print('字符串替换相关函数示例:')
print('%s replace t to & = %s' % (mystr,mystr.replace('t','&')))
print('%s replace t to & = %s' % (mystr,mystr.replace('t','&',1)))
print('字符串分隔相关函数示例:')
mynewstr='apple banana orange peach'
print('%s strip= %s' % (mynewstr,mynewstr.split()))
mynewstr='apple;banana;orange;peach'
print('%s strip= %s' % (mynewstr,mynewstr.split(';')))
print('字符串判断相关函数示例:')
print('%s startwith P= %s' % (mystr,mystr.startswith('P')))
print('%s endwith m= %s' % (mystr,mystr.endswith('m')))
print('%s isalnum= %s' % (mystr,mystr.isalnum()))
print('%s isalpha= %s' % (mystr,mystr.isalpha()))
print('%s isupper= %s' % (mystr,mystr.isupper()))
print('%s islower= %s' % (mystr,mystr.islower()))
print('%s isdigit= %s' % (mystr,mystr.isdigit()))
strnew='3478'
print('%s isdigit= %s' % (strnew,strnew.isdigit()))

运行结果:

E:\PycharmProjects\PythonTest\venv\Scripts\python.exe E:/PycharmProjects/PythonTest/ssss.py
字符串字符大小写变换函数示例:
PythonInteresting lower= pythoninteresting
PythonInteresting upper= PYTHONINTERESTING
PythonInteresting swapcase= pYTHONiNTERESTING
PythonInteresting capitalize= Pythoninteresting
PythonInteresting title= Pythoninteresting
字符串格式相关函数示例:
PythonInteresting ljust= PythonInteresting   
PythonInteresting rjust=    PythonInteresting
PythonInteresting center=  PythonInteresting  
PythonInteresting zfill= 000PythonInteresting
字符串搜索相关函数示例:
PythonInteresting find on = 4
PythonInteresting find t = 2
PythonInteresting find t from 1 = 2
PythonInteresting find t from 1 to 2 = -1
PythonInteresting rfind t = 13
PythonInteresting count t = 3
字符串替换相关函数示例:
PythonInteresting replace t to & = Py&honIn&eres&ing
PythonInteresting replace t to & = Py&honInteresting
字符串分隔相关函数示例:
apple banana orange peach strip= ['apple', 'banana', 'orange', 'peach']
apple;banana;orange;peach strip= ['apple', 'banana', 'orange', 'peach']
字符串判断相关函数示例:
PythonInteresting startwith P= True
PythonInteresting endwith m= False
PythonInteresting isalnum= True
PythonInteresting isalpha= True
PythonInteresting isupper= False
PythonInteresting islower= False
PythonInteresting isdigit= False
3478 isdigit= True

Process finished with exit code 0

对print里面的格式有点疑惑?

第6行和第7行title()函数和capitalize()函数的作用是一样的?都是首字母大写吗?

isdigit()函数是怎样实现的?

1.3变量

Python是一种动态类型语言,在赋值过程中可以绑定不同类型的值。这个过程叫作变量赋值操作,赋值时才确定变量的类型。

Python中的变量不需要声明,但是每个变量在使用前必须赋值。只有变量赋值后,才会创建该变量并分配内存空间。在Python中的变量没有类型,所说的“类型”,是变量所指的内存中对象的类型。变量命名规范如下:(下划线或字母)+(任意数目的字母、数字或下划线)。

变量名必须以下划线或字母开头,后面跟任意数目的字母、数字或下划线。

注意:

  1. 变量名由字母、数字和下划线组成,但是数字不能在开头;
  2. 系统关键字不能作为变量名使用;
  3. 除了下划线外,其他符号不能作为变量名使用;
  4. Python的变量名是区分大小写的;
  5. 尽量使用有意义的单词作为变量名,多个单词之间可以用下划线分割;或者除第一个单词外,其余单词的首字母用大写来命名;
  6. 前、后有下划线的变量名(_X_)是系统定义的变量名,对解释器有特殊意义;
  7. 变量的赋值方式如下:(1)普通赋值:y=1  (2)链式赋值:y=x=a=1  (3)多元赋值:x,y=1,2    x,y=y,x     (4)增量赋值:x+=1
  8. Python是弱类型的,即变量的类型不是一层不变的,当给变量赋其他类型的值时,变量的类型随之相应地改变。

1.4正则表达式

正则表达式RE(Regular Expression)是定义模式的字符串,其本质是字符串,主要用来匹配目标字符串,以找到匹配的字符串,并对其进行处理,如替换、分割等。正则表达式匹配语法如下表所示:

正则表达式匹配语法一览表
语法说明语法实例匹配字符串
普通字符匹配自身antant
.匹配除换行符\n外的任意字符a.tact
\转义字符\\ant\ant
[...]匹配方括号[]中间的任何一个字符。[]是字符集,可以将所有可以匹配的字符列在里面,也可以指定范围,还可以将两种混用。第一个字符如果是^,表示取反[ant]n
[a-z]a~z的任何字符
[^ant]除ant之外的其他字符
\d数字:[0-9]ant\dant8
\D非数字:[^\d]ant\Dants
\s空白字符a\snta nt
\S非空白字符a\Sntamnt
\w单词字符:[a-zA-Z0-9]a\wntamnt
\W非单词字符:[^\w]a\Wnta nt
*匹配前一个字符任意次(包括0)ant*an
+匹配前一个字符至少一次ant+ant
?匹配前一个字符1次或0次ant?an或ant
{m}匹配前一个字符m次an{2}tannt
{m,n}匹配前一个字符m~n次。无m,匹配0~n次;无n,匹配到与m之间的任意次(???)an{1,2}tant或annt
^匹配字符串开头(以下4个的区别是什么?)^antant
$匹配字符串末尾ant$ant
\A仅匹配字符串开头\Aantant
\Z仅匹配字符串末尾ant\Zant
|左右表达式任意匹配一个ant|cmdcmd
(...)括起来的表达式作为分组,每遇到分组的左括号,加1,作为分组编号(ant){2}antant
(P<name>...)分组,并除编号外增加一个别名(?P<n1>ant){2}antant
\<number>  (没懂)引用number编号的分组来匹配(\d)ant\16ant6
(?P=name)引用name别名的分组来匹配(?P<n1>\d)a(?P=n1)2a2
(?...)不分组(?ant){2}antant
(?#...)#之后的内容是注释ant(?#mayi)123ant123
(?=...)之后的字符串匹配,则成功a(?=\d)后面是数字的a
(?!...)之后的字符串不匹配,则成功a(?!\d)后面不是数字的a
(?<=...)之前的字符串匹配,则成功(?<=\d)a前面是数字的a
(?<!...)之前的字符串不匹配,则成功(?<!\d)a前面不是数字的a

 

看了上面的正则表达式一览表之后有些内容没怎么看懂,都用红色标出来了。。。

在Python中使用正则表达式,需要引入re模块。该模块中的常用函数介绍如下。

  • re.compile()函数

使用正则表达式之前,需要将自定义的模式编译为正则表达式对象(也称模式对象),这个对象代表了模式对应的正则表达式。匹配时,可以调用其match()和search()方法。

re模块中编译正则表达式对象的函数为re.compile()。例如p1=re.compile('abc*'),p1就是经过编译得到的正则表达式对象。

函数语法:re.compile(pattern,flags=0)

参数说明:pattern是匹配的正则表达式;flags是标志位,控制匹配的方式。

compile()函数中的flag取值如下表所示:

compile()中的flag取值
flag取值含义

re.A

re.ASCII

\w、\W、\b、\B、\d、\D、\s以及\S只进行ASCII匹配(什么意思呢?

re.DEBUG显示编译的表达式的debug信息

re.I

re.IGNORECASE

匹配时,不区分大小写

re.M

re.MULTILINE

'^'匹配整个字符的开始以及每一行字符串的开始。'$'匹配整个字符串的结尾以及每一行字符串的结尾(???

re.S

re.DOTALL

'.'匹配包括换行符在内的任何一个字符

re.x

re.VERBOSE

写传递给compile()的pattern参数时进行换行、注释
  • re.match()函数

re.match()函数尝试从字符串的起始位置匹配一个模式。匹配成功,re.match()函数返回一个匹配的对象,否则返回None。

函数语法:re.match(pattern,string,flags=0)

参数说明:pattern是匹配的正则表达式;string是进行匹配的目标串;flags是标志位,控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。

  • re.search()函数

re.search()函数扫描整个字符串并返回第一个成功的匹配。匹配成功,返回一个匹配的对象,否则返回None。

函数语法:re.search(pattern,string,flags=0)

参数含义同re.match()函数

  • re.findall()函数

re.findall()函数返回的总是正则表达式在字符串中所有匹配结果的列表。

函数语法:re.findall(pattern,string[,flags=0])

参数含义同re.match()函数

  • re.sub()函数

re.sub()函数用于替换字符串中的匹配项。

函数语法:re.sub(pattern,repl,string,count=0,flags=0)

参数说明:pattern是正则表达式中的模式字符串;repl是替换的字符串,也可为一个函数;string是要被查找替换的原始字符串;count是模式匹配后替换的最大次数,默认为0,表示替换所有的匹配。

难点:正则表达式??内容好多啊,好难啊,有个验证邮箱的题目,感觉邮箱没有固定的格式啊,所以也就没有一个针对邮箱的正则表达式,都是先设定一个前提,然后在写邮箱的正则表达式??

例题:编写一个Python程序,输入学生信息,并检测输入的电话号码格式是否正确。

代码如下:

import re #导入re模块
address = "李明 13530315051 liming@126.com" \
          "刘东 13791072536 liudong@163.com" \
          "张晓 18667676767 zhangxiao@sina.com" \
          "陈旭阳 18884026791 chenxuyang@sohu.com" \
          "欧阳贝贝 15840236688 ouyangbeibei@sina.com;"  #构造用户信息字符串
p1=re.compile(r'\d+') #构造检测字符串中数字的正则表达式
phone=p1.findall(address)  #用findall检测字符串中的所有数字,并存入元组变量phone
print(phone)  #输出提取到的所有数字信息
#构造电话号码检测的正则表达式
p2=re.compile('^0\d{2,3}\d{7,8}$|^1[358]\d{9}$|^147\d{8}')
#利用循环结构检测每一个提取的数字
for e in phone:
    m=p2.match(e)
    if(m):
        print(p2.match(e).group())

运行结果如下:

E:\PycharmProjects\PythonTest\venv\Scripts\python.exe E:/PycharmProjects/PythonTest/ssss.py
['13530315051', '126', '13791072536', '163', '18667676767', '18884026791', '15840236688']
13530315051
13791072536
18667676767
18884026791
15840236688

Process finished with exit code 0

对代码最后一行的group()函数有点疑惑,详见:Python中group()函数用法

到此,该小节就结束了,还有很多不太明白的地方,可能还有一些错误的地方,毕竟参考书有点不太给力,我这个菜鸡都发现了很多错误。虽然如此,但是这本书值得学习的地方肯定是有很多的。不懂的地方以后再慢慢看,加油!

下一节:Python入门之(2.2)运算符与表达式

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值