目录
基本数据类型
1.1数值
1.2字符串
1.3变量
1.4正则表达式
Python中的基本数据类型主要分为两种,即数值数据类型和字符串数据类型。
Python使用对象模型来存储数据,每一个数据类型都有一个相对应的内置类。新建一个数据,实际就是初始化并生成一个对象,即所有数据都是对象。
Python中的对象有下述3个特性:
标识:对象的内存地址,可以使用函数id()来获得;
类型:决定了该对象可以保存什么值,可执行何种操作,需遵循什么规则,可以使用函数type()来获取;
值:内存空间中保存的真实数据。
Python数值数据类型用于存储数值,其最大特点是不允许改变。如果改变数值数据类型的值,将导致重新分配内存空间。
Python3支持int、float、bool、complex(复数)等几种数据类型。
整型(int):可以是正整数或负整数,无小数点。Python3中的整型数据是没有大小限制的,可以作为long类型使用。整型数据的4种表现形式如下: 整型数据的表现形式(以十进制的27为例) 进制开头例子二进制0b0b11011八进制0o0o33十进制正常27十六进制0x0x1b这四种进制数据的转换,可以通过Python中的内置函数bin()、oct()、int()和hex()来实现。
浮点型(float):浮点型数据由整数部分和小数部分组成。浮点型常量也可使用科学计数法表示,如。布尔型(bool):布尔型数据的运算结果是常量True或False,这两个常量的值是1和0,可以和数值型数据进行运算。复数(complex):复数由实数部分和虚数部分构成,可以用a+bj或者complex(a,b)表示。复数的实部和虚部都是浮点型数据。注意:
float()函数可以显式地将int类型数据强制转换成float类型数据;int()函数可以将float类型数据强制转换成int类型数据,执行取整运算,而不是四舍五入运算。如,int(2.7)的值为2;type()函数可以任何值或变量的数据类型;isinstance()函数可以判断某个值或变量是否为给定的类型;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(复数)。
Python中的字符串是用单引号(')、双引号('')或三引号(''')括起来,同时使用反斜杠(\)转义特殊字符的一段文字。字符串是一个有序字符的集合,用于存储和表示基本的文本信息,但是它只能存放一个值,一经定义,不可改变。
注意:
反斜杠可以用来转义;在反斜杠前使用r,可以让反斜杠不发生转义;(r怎样使用?像下面的例子一样放在含有不转义的反斜杠的字符串的前面?)字符串可以用+运算符进行字符串连接,用*运算符进行字符串重复;Python中的字符串有两种索引方式,即从左往右从0开始,和从右往左从-1开始;反斜杠可以作为续行符,表示下一行是上一行的延续;还可以使用"""..."""或者'''...'''跨越多行;(反斜杠作为续行符的时候怎样用,只能用在字符串里面吗?后面的一种方法怎样使用?)可以对字符串进行切片来得到子串。切片的语法是用冒号分隔两个索引,形式为 字符串变量[头下标:尾下标];(含有的字符个数等于尾下标-头下标吗?ans:等于)字符串不能被改变。向一个索引位置赋值,比如word[0]='m',会导致错误;find()函数用于在一个较长的字符串中查找子字符串,返回子串所在位置的最左端索引。如果没有找到,返回-1;lower()函数返回字符串的小写字母表示,upper()函数返回字符串的大写字母表示;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,返回-1S.index(substr[,start[,end]])返回S中出现substr的第一个字母的索引;如果S中没有substr,返回一个运行时错误S.rfind(substr[,start[,end]])返回S中最后出现的substr的第一个字母索引;如果S中没有substr,返回-1S.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()函数是怎样实现的?)
Python是一种动态类型语言,在赋值过程中可以绑定不同类型的值。这个过程叫作变量赋值操作,赋值时才确定变量的类型。
Python中的变量不需要声明,但是每个变量在使用前必须赋值。只有变量赋值后,才会创建该变量并分配内存空间。在Python中的变量没有类型,所说的“类型”,是变量所指的内存中对象的类型。变量命名规范如下:(下划线或字母)+(任意数目的字母、数字或下划线)。
变量名必须以下划线或字母开头,后面跟任意数目的字母、数字或下划线。
注意:
变量名由字母、数字和下划线组成,但是数字不能在开头;系统关键字不能作为变量名使用;除了下划线外,其他符号不能作为变量名使用;Python的变量名是区分大小写的;尽量使用有意义的单词作为变量名,多个单词之间可以用下划线分割;或者除第一个单词外,其余单词的首字母用大写来命名;前、后有下划线的变量名(_X_)是系统定义的变量名,对解释器有特殊意义;变量的赋值方式如下:(1)普通赋值:y=1 (2)链式赋值:y=x=a=1 (3)多元赋值:x,y=1,2 x,y=y,x (4)增量赋值:x+=1Python是弱类型的,即变量的类型不是一层不变的,当给变量赋其他类型的值时,变量的类型随之相应地改变。正则表达式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)运算符与表达式