目录
基本数据类型
Python中的基本数据类型主要分为两种,即数值数据类型和字符串数据类型。
Python使用对象模型来存储数据,每一个数据类型都有一个相对应的内置类。新建一个数据,实际就是初始化并生成一个对象,即所有数据都是对象。
Python中的对象有下述3个特性:
-
标识:对象的内存地址,可以使用函数id()来获得;
-
类型:决定了该对象可以保存什么值,可执行何种操作,需遵循什么规则,可以使用函数type()来获取;
-
值:内存空间中保存的真实数据。
1.1数值
Python数值数据类型用于存储数值,其最大特点是不允许改变。如果改变数值数据类型的值,将导致重新分配内存空间。
Python3支持int、float、bool、complex(复数)等几种数据类型。
- 整型(int):可以是正整数或负整数,无小数点。Python3中的整型数据是没有大小限制的,可以作为long类型使用。整型数据的4种表现形式如下:
进制 | 开头 | 例子 |
二进制 | 0b | 0b11011 |
八进制 | 0o | 0o33 |
十进制 | 正常 | 27 |
十六进制 | 0x | 0x1b |
这四种进制数据的转换,可以通过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(复数)。
1.2字符串
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,返回-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中的变量没有类型,所说的“类型”,是变量所指的内存中对象的类型。变量命名规范如下:(下划线或字母)+(任意数目的字母、数字或下划线)。
变量名必须以下划线或字母开头,后面跟任意数目的字母、数字或下划线。
注意:
- 变量名由字母、数字和下划线组成,但是数字不能在开头;
- 系统关键字不能作为变量名使用;
- 除了下划线外,其他符号不能作为变量名使用;
- Python的变量名是区分大小写的;
- 尽量使用有意义的单词作为变量名,多个单词之间可以用下划线分割;或者除第一个单词外,其余单词的首字母用大写来命名;
- 前、后有下划线的变量名(_X_)是系统定义的变量名,对解释器有特殊意义;
- 变量的赋值方式如下:(1)普通赋值:y=1 (2)链式赋值:y=x=a=1 (3)多元赋值:x,y=1,2 x,y=y,x (4)增量赋值:x+=1
- Python是弱类型的,即变量的类型不是一层不变的,当给变量赋其他类型的值时,变量的类型随之相应地改变。
1.4正则表达式
正则表达式RE(Regular Expression)是定义模式的字符串,其本质是字符串,主要用来匹配目标字符串,以找到匹配的字符串,并对其进行处理,如替换、分割等。正则表达式匹配语法如下表所示:
语法 | 说明 | 语法实例 | 匹配字符串 |
普通字符 | 匹配自身 | ant | ant |
. | 匹配除换行符\n外的任意字符 | a.t | act |
\ | 转义字符 | \\ant | \ant |
[...] | 匹配方括号[]中间的任何一个字符。[]是字符集,可以将所有可以匹配的字符列在里面,也可以指定范围,还可以将两种混用。第一个字符如果是^,表示取反 | [ant] | n |
[a-z] | a~z的任何字符 | ||
[^ant] | 除ant之外的其他字符 | ||
\d | 数字:[0-9] | ant\d | ant8 |
\D | 非数字:[^\d] | ant\D | ants |
\s | 空白字符 | a\snt | a nt |
\S | 非空白字符 | a\Snt | amnt |
\w | 单词字符:[a-zA-Z0-9] | a\wnt | amnt |
\W | 非单词字符:[^\w] | a\Wnt | a nt |
* | 匹配前一个字符任意次(包括0) | ant* | an |
+ | 匹配前一个字符至少一次 | ant+ | ant |
? | 匹配前一个字符1次或0次 | ant? | an或ant |
{m} | 匹配前一个字符m次 | an{2}t | annt |
{m,n} | 匹配前一个字符m~n次。无m,匹配0~n次;无n,匹配到与m之间的任意次(???) | an{1,2}t | ant或annt |
^ | 匹配字符串开头(以下4个的区别是什么?) | ^ant | ant |
$ | 匹配字符串末尾 | ant$ | ant |
\A | 仅匹配字符串开头 | \Aant | ant |
\Z | 仅匹配字符串末尾 | ant\Z | ant |
| | 左右表达式任意匹配一个 | ant|cmd | cmd |
(...) | 括起来的表达式作为分组,每遇到分组的左括号,加1,作为分组编号 | (ant){2} | antant |
(P<name>...) | 分组,并除编号外增加一个别名 | (?P<n1>ant){2} | antant |
\<number> (没懂) | 引用number编号的分组来匹配 | (\d)ant\1 | 6ant6 |
(?P=name) | 引用name别名的分组来匹配 | (?P<n1>\d)a(?P=n1) | 2a2 |
(?...) | 不分组 | (?ant){2} | antant |
(?#...) | #之后的内容是注释 | ant(?#mayi)123 | ant123 |
(?=...) | 之后的字符串匹配,则成功 | 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取值如下表所示:
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()函数用法
到此,该小节就结束了,还有很多不太明白的地方,可能还有一些错误的地方,毕竟参考书有点不太给力,我这个菜鸡都发现了很多错误。虽然如此,但是这本书值得学习的地方肯定是有很多的。不懂的地方以后再慢慢看,加油!