Python学习入门
三、标准数据类型
Python中有很多内置的数据类型,以下是我们使⽤的较多的数据类型。
- 布尔值(Booleans)True或False;
- 数字(Number)整数、浮点数、分数、复数;
- 字符串(Strings)Unicode字符序列;
- 列表(Lists)有序的值的可变序列;
- 元组(Tuples)有序的值的不可变序列;
- 集合(Sets)⽆序且不重复的值的集合;
- 字典(Dictionaries)⽆序的键-值对的集合。
3.1 类型判断
type(obj): 返回obj的类型
type(1) # int
type(1.0) # float
type('1') # str
type(True) # bool
isinstance(obj,class): 测试对象obj是class的实例
isinstance(1,int) # True
isinstance('1',str) # True
3.2 布尔值 Booleans
和布尔代数的表示完全⼀致,⼀个布尔值只有True、False两种值,要么是True,要么是False。
type(True) # bool
3.2.1 布尔运算(and,or,not)
True and False # False
0 or [] # []
True or False # True
not True # False
Note:1==1.0?
3.3 数字
数字有四种类型:整数(int),浮点数(flfloat),分(fractions),复数(complex)
3.3.1 整数 int
Python可以处理任意⼤⼩的整数,当然包括负整数,在程序中的表示⽅法和数学上的写法⼀模⼀样,例
如:1,100,-8080,0,等等。
在解释器中输⼊⼀个整数也会得到⼀个同样整数的输出:
2 # 2
2-5 # -3
2/5 # 0.4
3.3.2 浮点数(flfloat)
浮点数也就是⼩数,浮点数可以⽤数学写法,如1.23,3.14,-9.01.
但是对于很⼤或很⼩的浮点数,就必须⽤科学记数法表示。
1.23e9 # 1230000000.0
1.2345678901234567890 # 1.1234567890123457
Note
整数和浮点数在计算机内部存储的⽅式是不同的,整数运算结果永远是精确的,⽽浮点数运算则可
能会有精度上的误差。
浮点数存在上界和下界,超过结果导致溢出。
由于存储有限,计算机不能精确显示⽆限⼩数,会产⽣误差。另外计算机内部采⽤⼆进制,不是所
有的⼗进制实数都可以⽤⼆进制数精确表示。
查看flfloat的最⼤值和最⼩值:
import sys
sys.float_info
3.3.3 分数 fractions
在Python中,不⽌有浮点数(flfloat),⽽且还有分数(Fraction)这个类型。
要使⽤分数,必须引⼊⼀个模块:
import fractions
然后就可以声明⼀个分数了:
x = fractions.Fraction(1,2)
这样就声明了⼀个⼆分之⼀的分数,打印这个变量则会得出:1/2
声明⼆分之⼀还可以⽤另⼀种⽅式:
x = fractions.Fraction(0.5)
Python会⾃动转换浮点数为分数,结果也是1/2.
需要注意的是,Python会⾃动进⾏约分:
import fractions
x = fractions.Fraction(0.2)
y = fractions.Fraction(2/10)
x == y
结果为True。
3.3.4 复数 complex
复数对象有两个属性real和imag⽤于查看实部和虚部。
- 语法:real + imagj
- 虚数不能单独存在,它们总是和⼀个值为0.0的实数部分⼀起构成⼀个复数
- 实数部分和虚数部分都是浮点数
- 虚数部分必须有 j 或 J
num.real # 返回该复数的实数部分
num.imag # 返回该复数的虚数部分
num.conjugat() # 返回该复数的共轭复数
3.3.4.1 complex() 函数
complex() 函数⽤于创建⼀个复数或者将⼀个数或字符串转换为复数形式,其返回值为⼀个复数。该函
数的语法为:
complex(real,imag)
其中,real可以为int、flfloat或字符串类型;⽽imag只能为int或flfloat类型。
complex(1) # 数字
complex('1') # 当作字符串处理
complex('1 + 2j') # 会出错,+号两边不能有空格
complex('1+2.0')
Note
如果第⼀个参数为字符串,第⼆个参数必须省略;若第⼀个参数为其他类型,则第⼆个参数可以选
择。
第⼀个参数为字符串,如果仍添加第⼆个参数时会报错。
>>> complex('a',1)
# TypeError: complex() can't take second arg if first is a string
3.4 字符串
- 字符串是字符组成的序列。可以⽤单引号、双引号和三引号。
- 单引号和双引号⽤法没有区别。
- 三引号允许⼀个字符串跨多⾏,其中可以包含换⾏符、制表符以及其他特殊字符。
- 如果字符串中出现转义符,可以⽤r或R来定义原始字符串,这样可以不让转义字符⽣效。
### 单引号、双引号和三引号
name_1 = 'Evan'
name_2 = "Evan"
name_3 = '''Evan'''
print(name_1,name_2,name_3)
3.4.1 创建字符串
str = 'cda123cda'
3.4.2 字符串运算符
字符串连接:使⽤ + 相当于拼接两个字符串
'Hello' + 'Python' # HelloPython
重复输出字符:使⽤ *n 相当于把字符串重复n次
'cda' * 3 # cdacdacda
3.4.3 转义字符
\可以转义很多字符,⽐如\n表示换⾏,\t表示制表符,字符\本身也要转义,所以\表示的字符就是\。
Python还允许⽤ r’ ’ 表示 ’ ’ 内部的字符串默认不转义。、
### 字符串有转义符
print(r'\t\n') # \t\n
print('\\t\\n') # 结果和上⾯⼀样,但是需要对\转义,也就是使⽤\\
3.4.4 多⾏字符串
如果字符串内部有很多换⾏,⽤\n写在⼀⾏⾥不好阅读,为了简化,Python允许⽤ ‘’’…’’’
的格式表示多⾏内容。
同时也可以结合 r’ ’ 使⽤。
text = r'''My
Apple\/
Pen'''
# text
# print(text)
3.4.5 字符串切⽚
字符串也是⼀个可迭代对象,也就是说每⼀个字符串实际上都有⼀个对应的索引值。
'Hello' + 'Python' # HelloPython
'cda' * 3 # cdacdacda
有时候我们不仅仅想取出字符串的其中⼀个字符,还想要去除其中⼀部分,这时候应该怎么做呢?
x = 'abcdefgabcd'
x[0:3:1] # 取出前三个
字符串有转义符
print(r'\t\n') # \t\n
print('\\t\\n') # 结果和上⾯⼀样,但是需要对\转义,也就是使⽤\\
text = r'''My
Apple\/
Pen'''
# t
ext
print(text)
str_me = 'dfedsfdf'
str_me[0]
str_me[1]
字符串切⽚的标准语法:
string[开始位置:终⽌位置:步⻓和⽅向]
注意:选区的区间属于左闭右开型,即从“起始”位开始,到“结束”位的前⼀位结束(不包含结束位本身)。
str[0] # 获取第⼀个元素
str[-2] # 获取倒数第⼆个元素
str[1:3] # 获取从偏移为1的字符⼀直到偏移为3的字符串,不包括偏移为3的字符串
str[1:] # 获取从偏移为1的字符⼀直到字符串的最后⼀个字符(包括最后⼀个字符)
str[:3] # 获取从偏移为0的字符⼀直到偏移为3的字符串,不包括偏移为3的字符串
str[:-1] # 获取从偏移为0的字符⼀直到最后⼀个字符(不包括最后⼀个字符串)
str[:] # 获取字符串从开始到结尾的所有元素
str[-3:-1] # 获取偏移为-3到偏移为-1的字符,不包括偏移为-1的字符
str[-1:-3]和str[2:0] # 获取的为空字符,系统不提示错误
str[::2] # 步⻓为2,⽅向从左到右
str[-1:-5:-2] # 步⻓为2,⽅向从右往左
#### 3.4.
3.4.6 字符串⽅法
3.4.6.1 find
检测 str 是否包含在mystr中,如果是则返回开始的索引值,否则返回-1
mystr.fifind(str, start=0, end=len(mystr))
a = 'abcdefgabc'
q = a.find('a',2,3)
q
a[a.find('e')]
k = a.find('abc',3)
a[k:k+3]
#
3.4.6.2 count
返回 str 在 start 和 end 之间在mystr⾥⾥⾯出现的次数
mystr.count(str, start=0, end=len(mystr))
a.count('e',0,5) # 1
a.count('ba') # 0
3.4.6.4 split
把mystr中的 str1 替换成 str2,如果count指定,则替换不超过count次
mystr.replace(str1, str2, mystr.count(str1))
a.replace('a','哈哈',1)
a = a.replace('a','哈哈哈’)
a.replace('a','k') # 这⾥我们要注意⼀下a到底变没变,为什么?
#
3.4.6.4 split
以 str 为分隔符切⽚mystr,如果maxsplit有指定值,则仅分隔maxsplit个字符串
mystr.split(str=" ", 2)
a = 'abcdefgabc'
a.split('b')
a.split('e')
a.split('q')
a.split('c')
3.4.6.5 splitlines
按照⾏分隔,返回⼀个包含各⾏作为元素的列表
mystr.splitlines()
data = '''关于你
关于你,我有太多东⻄关于你。
清醒的时候放不下矜持,不敢说我喜欢你,只有在某个夜晚多愁善感⼜萦绕在⼼头,或是朋友聚会上的⼤
醉,才敢借着情绪说,我喜欢你,喜欢了好久好久。'''
lst1 = data.splitlines(True)
lst1[1] # 我们也可以进⾏索引
3.4.6.6 lower
转换mystr中所有⼤写字符为⼩写
mystr.lower()
3.4.6.7 upper
转换 mystr 中的⼩写字⺟为⼤写
mystr.upper()
3.4.6.8 strip
删除mystr字符串两端的指定字符,如果不指定默认是空格
mystr.strip()
b = ' goo gle '
b.strip()
3.4.6.9 partition
把mystr以str分割成三部分,str前,str和str后
mystr.partition(str)
a = 'abcdefgabc'
# ⽐较split和partition
a.split('e') a.partition('e')
3.4.6.10 join
mystr中每个字符后⾯插⼊str,构造出⼀个新的字符串
mystr.join(str)
'-->'.join('北京⼤学在北京')
3.4.6.11 判断字符串内的元素类型
isalpha:如果mystr所有字符都是字⺟,则返回True,否则返回False
mystr.isalpha()
isdigit:如果mystr只包含数字,则返回True,否则返回False
mystr.isdigit()
isalnum:如果mystr所有字符都是字⺟或数字,则返回True,否则返回False
mystr.isalnum()
isspace:如果mystr中只包含空格,则返回True,否则返回False
mystr.isspace()
islower:如果mystr中的字⺟全是⼩写,则返回True,否则返回False
mystr.islower()
isupper:如果mystr中的字⺟全是⼤写,则返回True,否则返回False
mystr.isupper()
istitle:如果mystr中的⾸字⺟⼤写,则返回True,否则返回False
mystr.istitle()
4.6.12 ⽅法⼩结
由于str是不可变的序列,其实只有查找⽅法,增删改不会改变字符串本身,只是结果改变。
查 |
---|
1.检测字符串是否包含⼦串:index和fifind
两者区别在于如果没有找到,fifind返回-1,index报错
‘abc123’.index(‘c1’) # 2
‘abc123’.fifind(‘c1’) # 2
‘abc123’.fifind(‘c2’) # -1
‘abc123’.index(‘c2’) # 出错
2.统计⼦串出现次数:count
‘abc123abc’.count(‘b’) # 2
增 |
---|
1)⽤分隔符拼接字符串:join
‘1234’.join(‘abcd’) # a1234b1234c1234d
2)连接字符串:使⽤运算符 +
3)复制字符串:使⽤运算符 *
删 |
---|
1)mystr.strip(|指定字符|) 删除字符串两端的指定字符,如果不指定默认是空格
‘#abc##’.strip(’#’) # abc
’ abc '.strip() # abc
另外,lstrip和rstrip,分别是删除左边空格和删除右边空格
改 |
---|
1)转换⼩写:lower()
‘aBcD’.lower() # abcd
2)转换⼤写:upper()
‘aBcD’.upper() # ABCD
3)⾸字⺟⼤写,其他⼩写:capitalize()
‘aBcD’.capitalize() # Abcd
4)交换⼤⼩写:swapcase()
‘aBcD’.swapcase() # AbCd
分割 |
---|
split([分隔符]) 默认是空格,\t,\n分割
‘I love you’.split() # 返回3个元素的列表
‘a#b#c’.split(’#’) # 返回3个元素[‘a’,‘b’,‘c’]的列表
检测 |
---|
startswith(prefifix[,start [,end]]) # 是否以prefifix开头
endswith(suffiffiffix[,start[,end]]) # 以suffiffiffix结尾
isalnum() # 是否全是字⺟和数字,并⾄少有⼀个字符
isalpha() # 是否全是字⺟,并⾄少有⼀个字符
isdigit() # 是否全是数字,并⾄少有⼀个字符
isspace() # 是否全是空⽩字符,并⾄少有⼀个字符
islower() # str中的字符是否全是⼩写
isupper() # str中的字符是否全是⼤写
istitle() # str是否是⾸字⺟⼤写
3.4.7 函数
len(s) # 求字符串的⻓度
max(s) # 求字符串的最⼤数
min(s) # 求字符串的最⼩数
3.4.8 数字和字符串的相互转换
# float:将其他类型数据转换为浮点数
float(1)
float('1.23')
float('1.2e-3')
# str:将其他类型数据转换为字符串
str(1)
str(1.0)
str(1.0e-5)
# int:将其他类型数据转换为整数
int(3.14) # 3
int(3.5) # 3 扔掉⼩数部分
int(True) # 1
int('3.5') # 报错
int(float('3.5')) # 3
# bool:把其他类型转换为布尔类型
bool(0) # False
bool(-1) # 所有⾮0数值都为真
bool('a') # True
bool('') # False
# chr和ord 整数和字符
chr(65)
ord('a')
3.4.9 字符串的格式化
3.4.9.1 字符串格式化输出
⽅法⼀:format_string % obj
print('%s的年龄是%d' % ('⼩哥哥',20)) # 将每个值放在⼀个圆括号内,逗号隔开
⽅法⼆:str.format( ) 普通形式
'{0}的年龄是{1}'.format('⼩哥哥',20) # 和上⾯的区别是⽤{}代替%,但功能更强⼤
"{0}就是⼀个⼤城市{1}, {0}房价很贵, {0}是⼀个古城".format("北京","的代表"
⽅法三:str.format( ) 接受参数形式
'{name}的年龄是{age}'.format(age=20,name='⼩哥哥') # 参数位置可以不按顺序显示。
姓名 = '⼩哥哥'
节⽇名称 = '情⼈节快乐'
print('''亲爱的{填写姓名}:
您好,祝您{填写节⽇名称}!'''.format(填写姓名=姓名,填写节⽇名称=节⽇名称))
除此之外还有⼀些稍微复杂⼀点的格式化⽅法。
3.4.9.2 填充与对⻬
填充常跟对⻬⼀起使⽤,^<>分别是居中、左对⻬、右对⻬,后⾯带宽度
:号后⾯带填充的字符,只能是⼀个字符,不指定的话默认是⽤空格填充
# 我想填⼀个占宽8个位置的,如果不⾜就⽤空格填充
'{:^8}'.format('2333') # 居中
'{:<8}'.format('2333') # 左对⻬
'{:>8}'.format('2333') # 右对⻬
3.4.9.3 精度与类型
# 保留两位有效数字
'{:.2f}'.format(3.1415926)
3.4.9.4 ⾦额的千位分隔符
'{:,}'.format(1234567890)
3.5 表达式与运算符
3.5.1 表达式概念
- 表达式是由⼀个或多个操作数及零个或运算符组成的序列,其计算结果为⼀个值、对象、⽅法或命名空间。
- 表达式可以包含⽂本值、⽅法调⽤、运算符以及其操作数、或简单名称。简单名称可以是变量名、类型成员名、⽅法参数名、命名空间或类型名。
- 表达式可以使⽤运算符(运算符⼜可以使⽤其他表达式作为参数)或⽅法调⽤(⽅法调⽤的参数⼜可以是其他⽅法参数),因此表达式可以很简单,也可以⾮常复杂。
3.5.2 运算符种类
运算符类型有算数运算符、关系运算符、赋值运算符、逻辑运算符和条件运算符。
按照运算需要的操作数⽬,可以分为⼀元,⼆元,三元运算符:
⼀元:就是只需要⼀个操作数。例:+,-
⼆元:需要两个操作数。⼤多数都是⼆元。
三元:需要三个操作数,条件运算是三元运算符。例:b if a else c
3.5.2.1 算数运算符
算术运算符是⼀个⼆元运算符,主要包括:
注意:只要有任意⼀个操作数是浮点数,结果就会是浮点数。
3.5.2.2 关系运算符
⽤于⽐较两个表达式的值,关系运算符包括:
3.5.2.3 赋值运算符
除此之外,还有序列赋值:
x,y,z = '1','2','3' # 实质:右边是元组的⼀种写法,x=1,y=2,c=3
x,y,z = '123' # 等价于上⾯
x,y,z = '1234' # 报错,参数太多
x,y,z = '1','2','3','4' # 报错,参数太多
3.5.2.4 逻辑运算符
对于逻辑 “与”,“或”,“⾮”,我们使⽤and,or,not这⼏个关键字。
逻辑运算符and和or也称作短路运算符:它们的参数从左向右解析,⼀旦结果可以确定就停⽌。例如,
如果A和C为真⽽B为假,A and B and C不会解析C。在作⽤于⼀个普通的⾮逻辑值时,短路运算符的返
回值通常是能够最先确定结果的那个操作数。
关系运算可以通过逻辑运算符and和or组合,⽐较的结果可以⽤not来取反意。逻辑运算符的优先级⼜低
于关系运算符,在它们之中,not具有最⾼的优先级,or优先级最低,所以 A and not B or C 等于 (A
and (not B)) or C
下⾯是⼀些实例:
5 and 4 # 4
0 and 4 # 0
False or 3 or 0 # 3
2 > 1 and not 3 > 5 or 4 # True
3.5.3 运算的优先级
3.5.4 math科学计算库
math模块的内置常量:
math.pi # 3.141592653589793
math.e # 2.718281828459045
Python内置的⼀些计算函数:
Python还提供科学计算等库,例如math,导⼊math库后,常⽤的函数有: