第三章 基本数据类型
3.1 数字类型
3.1.1 数字类型
Python语言包括三种数字类型
-
整数类型
-
浮点数类型
-
复数类型
3.1.2 整数类型 int
- Python支持任意大的数字,具体可以大到什么程度仅受内存大小的限制
- 十进制整数:0、-1、9、123
- 十六进制整数,必须以
0x、OX
开头:0x10、0xfa、0xabcdef - 八进制整数,必须以
0o、0O
开头:0o35、0o11 - 二进制整数,必须以
0b、0B
开头:0b101、0b100
浮点数类型 float
- 浮点数就是包含小数点的数
- Python语言中浮点数的数值范围存在限制,小数精度也存在限制。这种限制与在不同计算机系统有关。
- 浮点数示例:
15.0、0.37、-11.2、2.3e2
3.1.4 复数类型 complex
-
Python中的复数由两部分组成:实部和虚部
复数的形式为:实部+虚部j
-
复数示例:
2+3j、-0.5-0.9j
>>> a=2+3j >>> a.real # 查看复数实部 2.0 >>> a.imag # 查看复数虚部 3.0 >>> a.conjugate() # 共轭复数 (2-3j)
补充 其他数据类型
布尔类型 bool
- 布尔类型是用来表示
3>2
True
2>3
False
字符串类型str
- 字符串类型使用单引号、双引号、三单引号、三双引号作为定界符来表示字符串,并且不同的定界符之间可以互相嵌套
- 字符串实例:
'abc'、'123'、"Python"、'中国'
- 空串表示为’'或""
三引号’’'或"""表示的字符串可以换行,支持排版较为复杂的字符串;三引号还可以在程序中表示较长的注释。
[例]
print(
"""
静夜思
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
"""
)
程序结果:
静夜思
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
列表 list
- Python中列表和字符串一样,也是一种序列类型,列表是一种数据集合
- 列表用
[ ]
来表示,列表内容以逗号进行分隔 - 列表示例:
[1,2,3,4]、[3,4,5,"abc"]、["one","two","three","four"]
元组 tuple
- 元组用
()
来表示,元组内容以逗号进行分隔。 - 元组的内容不能修改
- 示例:
(1,2,3,4)、(3,4.5,"abc")
字典 dict
- 字典是Python中唯一内建的映射类型,可用来实现通过数据查找关联数据的功能。
- 字典是键值对的无序集合。字典中的每一个元素都包含两部分:键和值
- 字典格式:
{键:值, 键:值, ...}
- 字典示例:
{'CN':'China', 'AU':'Australia','DE':'Germany'}
集合set
-
集合是一组对象的集合,对象可以是各种类型
-
集合又各种类型元素组成,但元素之间没有任何顺序,并且元素都不重复。
-
集合用大括号
{}
来表示 -
集合示例:
{'train','car','ship','bus'}
3.2 数字类型的操作
要点:Python解释器为数字类型提供数值运算操作符、数值运算函数、类型转换函数等操作方法
3.2.1 内置的数值运算操作符
操作符 | 描述 |
---|---|
x+y | x与y之和 |
x-y | x与y之差 |
x*y | x与y之积 |
x/y | x与y之商 |
x//y | x与y之整数商,向下取整 |
x%y | x与y之商的余数 |
-x | x的负值,即:x*(-1) |
+x | x本身 |
x**y | x的y次幂 x y x^y xy,等价于pow(3,2) |
-
+
运算符还可以用于列表、元组、字符串的连接,但不支持不同类型的对象之间相加或连接。>>> [1,2,3]+[4,5,6] # 连接两个列表 [1, 2, 3, 4, 5, 6] >>> (1,2,3)+(4,) # 连接两个元组 (1, 2, 3, 4) >>> 'ab'+'12' # 连接两个字符串 'ab12'
-
*
运算符还可以用于列表、元组、字符串类型与整数的乘法,表示序列元素的重复,生成新的序列对象。>>> [1,2,3]*3 [1, 2, 3, 1, 2, 3, 1, 2, 3] >>> (1,2,3)*3 (1, 2, 3, 1, 2, 3, 1, 2, 3) >>> 'abc'*3 'abcabcabc'
-
Python还有赋值运算符
+=、-=、*=、/=、//=、**=、%=
等大量复合赋值运算符。例如:
x+=3
等价于x=x+3
练习题:
1.语句a=(3/4)+3%2
;运行后,a的值为( )。a=0.75+1=1.75
2.若x=3.5;z=8
则x+z%3/4
的值为( ). 3.5+(8%3)/4=3.5+8%3/4=3.5+2/4=3.5+0.5=4.0
3.设f=g=2.0,使f为4.0的表达式是( ). D
A. f/=g*10
# f=f/(g*10)=2/20=0.1
B. f-=g+2
# f=f-g-2=-2
C. f*=g-6
# f=f*(g-6)=2 *(2-6)=-8
D. f+=g
# f= f+g=4
x=1,x*=3+5**2
的值为( ) x*=x*(3+25)=1*28=28
思考与练习
请将下面数学表达式用Python写出来,并运算结果。
1. x = ( 2 4 + 7 − 3 × 4 ) 5 x=\frac{(2^4+7-3\times4)}{5} x=5(24+7−3×4)
2. x = ( 1 + 3 2 ) × ( 16 m o d 7 ) / 7 x=(1+3^2)\times(16 mod 7)/7 x=(1+32)×(16mod7)/7
>>> x=(2**4+7-3*4)/5
>>> x
2.2
>>> x=(1+3**2)*(16%7)/7
>>> x
2.857142857142857
关系运算操作符 补充
关系运算符根据表达式的值得真假返回布尔值:
<
(小于)、>
(大于)、<=
(小于等于)、 >=
(大于等于)、 ==
(等于)、!=
(等于)、!=
(不等于)
Python关系运算符最大的特点是可以连用。如5>2<7
>>> a = 3
>>> a == 2
False
>>> 1<a<5 # 等价于1<a 且 a<5
True
>>> 5<a>1
False
思考
1.让用户输入一个值赋值给x,判断x是否为’男‘
2.让用户输入一个值赋值给x,判断x是否在[0,100]间
>>> x=input("")
>? 男
>>> x == "男"
True
>>> x=int(input())
>? 45
>>> 0<=x<=100
True
逻辑运算符 补充
逻辑运算符将表达式连接在一起,一般会返回布尔值
and(与):两边都是真,结果为真
or(或):只要一个为真,结果为真
not(非):取反
>>> x = False
>>> y = True
>>> x or y
True
>>> not (x or y)
False
>>> not x or y
True
>>> i = 7
>>> j = 8
>>> i>=j and i<j
False
>>> a=5; b=2; c=1
>>> a-b>2 or b ==c
True
习题
1.若希望当a的值为奇数时,表达式的值为“真”,a的值为偶数时,表达式的值为“假”。则不能满足要求的表达式是( ) C
A. a%2 ==1
B. not a%2 == 0
C. not a%2 # not 8%2 = True not 9%2 =False
D. a%2
2.判断t是否为闰年。闰年的条件:年份t能被400整除,或者能被4整除但不能被100整除。
t = eval(input("请输入年份:"))
if t%400==0 or t%4==0 and t%100!=0:
print(str(t)+"年是闰年")
else:
print(str(t)+"年不是闰年")
and和or具有惰性求值或逻辑短路的特点,当连接多个表达式时只计算必须要计算的值
>>> 3<5 or a>3 # a没有定义
True
>>> 3>5 or a>3 # a没有定义
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'a' is not defined
3.2.4 位运算符
位运算符只能用于整数,其内部执行过程为:首先将整数转换为二进制数,然后右对齐,必要的时候左侧补0,按位进行运算,最后再把计算结果转换为十进制数字返回。
运算符 | 说明 |
---|---|
& | 1&1=1、1&0=0&1=0&0=0 |
`` | `` |
^ | 1 ^ 1= 0^0=0、1 ^ 0=0^1=1 |
<< | 每左移一位相当于乘以2 |
>> | 每右移一位相当于整除以2 |
>>> bin(3) # 3的二进制
'0b11'
>>> 3 << 2 # 把3左移2位
12
>>> bin(12)
'0b1100'
>>> bin(7) # 7的二进制
'0b111'
>>> 3 & 7 # 011&111=011
3
>>> bin(8)
'0b1000'
>>> 3|8 # 位或运算
11
>>> bin(11) # 11 | 1000= 1011
'0b1011'
>>> bin(5) # 5的二进制
'0b101'
>>> 3^5
6
>>> bin(6) # 11^101=110
'0b110'
3.2.2 内置的数值运算函数
Python解释器提供了一些内置函数,在这些内置函数之中,有6个函数与数值运算相关
函数 | 描述 |
---|---|
abs(x) | x的绝对值 |
divmod(x,y) | (x//y,x%y)求商和余数,输出为二元组形式(也称为元组类型) |
pow(x,y[,z]) | (x**y)%z 求幂,[…]表示该参数可以省略,即pow(x,y),它与x**y 相同 |
round(x[,ndigits]) | 对x四舍五入,保留ndigits位小数。round(x)返回四舍五入的整数值 |
max(x1,x2,…,xn) | 求最大值,n没有限定 |
min(x1,x2,…,xn) | 求最小值,n没有限定 |
>>> x=-100
>>> y=abs(x)
>>> y
100
>>> x=10
>>> y=3
>>> z=divmod(x,y)
>>> z
(3, 1)
>>> x=10
>>> y=2
>>> z=3
>>> m=pow(x,y,z)
>>> m
1
>>> x = 3.14159
>>> round(x,2)
3.14
>>> a = [3,0,5]
>>> max(a)
5
>>> min(a)
0
>>> sum(a)
8
3.2.3 内置的数字类型转换函数
函数 | 描述 |
---|---|
int(x) | 将x转换为整数,x可以是浮点数或字符串 |
float(x) | 将x转换为浮点数,x是整数或字符串 |
complex(re[,im]) | 生成一个复数,实部为re,虚部为im,re可以是整数、浮点数或字串符,im可以是整数或浮点数但不能为字符串 |
>>> int("123")
123
>>> int(0b10)
2
>>> int(0o10)
8
>>> int(0x10)
16
>>> int(-2.34)
-2
>>> float(3) # 把整数转换为实数
3.0
>>> float('3.5') # 把数字字符串转换为实数
3.5
>>> complex(3) # 指定实部
(3+0j)
>>> complex(3,5) # 指定实部和虚部
(3+5j)
map()
==map()==是接收一个函数f依次映射到序列或迭代对象上的每个元素,并返回一个map对象。格式:
map(函数f,list数据)
>>> x,y=map(int,["45","56"])
>>> x,y
(45, 56)
>>> a,b=map(round,[3.4546,4.6757],(3,2))
>>> a,b
(3.455, 4.68)
>>> round(3.4546,3)
3.455
>>> round(4.6757,2)
4.68
思考
Exer1:用户输入一个三位自然数,计算并输出其百位、十位和个位上的数字。
x = int(input("请输入一个三位自然数:"))
a = x//100
b = (x-a*100)//10
c = x-a*100-b*10
print("百位数字为:"+str(a),"十位数字为:"+str(b),"个位数字为:"+str(c))
程序结果:
请输入一个三位自然数:324
百位数字为:3 十位数字为:2 个位数字为:4
x=int(input())
a=x//100
b=x//10%10
c=x%10
print(a,b,c)
i=input("请输入一个三位自然数:")
print("百位数字为"+i[0])
print("十位数字为"+i[1])
print("个位数字为"+i[2])
x=int(input('请输入一个三位数:'))
a,b=divmod(x,100)
b,c=divmod(b,10)
print(a,b,c)
x=input("请输入一个三位数:")
a,b,c=map(int,x)
print(a,b,c)
3.3 模块1:math库的使用
3.3.1 math库概述
- math库是Python提供的内置数学类函数库
- math库不支持复数类型
- math库一共提供了4个数学常数和44个函数。
- 44个函数共分为4类:
- 16个数值表示函数
- 8个幂对数函数
- 16个三角对数函数
- 4个高等特殊函数
3.3.2 math库解析
math库包括4个数学常数
常数 | 数学表示 | 描述 |
---|---|---|
math.pi | π \pi π | 圆周率,3.141592653589793 |
math.e | e e e | 自然对数,2.718281828459045 |
math.inf | ∞ \infty ∞ | 正无穷大,负无穷大为-math.inf |
math.nan | 非浮点数标记,NaN(Not a Number) |
3.4 实例3:天天向上的力量
例:天天向上
一年365天,以第1天的能力值为基数,记为1.0,当好好学习时能力值相比前一天提高1%,当没有学习时能力值相比前一天下降1%。每天努力和每天放任,一年下来的能力值相差多少呢?
根据题目,天天向上的力量是 ( 1 + 0.001 ) 365 (1+0.001)^{365} (1+0.001)365,放任或向下的力量是 ( 1 − 0.001 ) 365 (1-0.001)^{365} (1−0.001)365
import math
dayup = math.pow((1.0+0.001), 365) # 提高0.001
daydown = math.pow((1.0-0.001), 365) # 放任0.001
print("向上:{:.2f},向下:{:.2f}.".format(dayup,daydown))
程序结果:
向上:1.44,向下:0.69.
思考:
已知三角形的两边长及其夹角,求第三边长
公式: c = a 2 + b 2 − 2 a b cos θ c=\sqrt{a^2+b^2-2ab\cos\theta} c=a2+b2−2abcosθ
import math
a=int(input("请输入一条边的长度:"))
b=int(input("请再输入另一条边的长度:"))
x=int(input("请输入上述两条边的夹角度数(角度值):"))
x=math.radians(x)
j=math.cos(x)
c=(a**2+b**2-2*a*b*j)**0.5
print(c)
结果:
请输入一条边的长度:3
请再输入另一条边的长度:4
请输入上述两条边的夹角度数(角度值):90
5.0
3.5 字符串类型及其操作
- 字符串是用双引号
“”
或者单引号''
括起来的一个或多个字符 - 字符串对象是不可变的。字符串对象提供的涉及到字符串”修改“的方法都是返回修改后的新字符串,并不对原始字符串做任何修改。
3.5.1 字符串类型的表示
字符串是一个字符序列:字符串最左端位置标记为0,依次增加。字符串中的编号叫做”索引“。
国 | 无 | 德 | 不 | 兴 | 人 | 无 | 德 | 不 | 立 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
- 单个索引辅助访问字符串中的特定位置
格式为:<string>[<索引>]
- 切片,通过两个索引值返回一个子串。
格式为:<string>[<start>:<end>:step]
- 这个子序列从索引start开始直到索引end结束,但不包括end位置。step代表步长。
>>> a='国无德不兴 人无德不立'
>>> a[2]
'德'
>>> x=8
>>> a[x-2]
'人'
>>> a[-7]
'兴'
>>> a[-11:-7]
'国无德不'
>>> a[1:-1]
'无德不兴 人无德不'
>>> a[2:-2:2]
'德兴人德'
反斜杠字符(\
)是一个特殊字符,在字符串中表示转义,即该字符与后面相邻的一个字符共同组成了新的含义。
\n
:表示换行
\\
:表示反斜杠
\'
:表示单引号
\"
表示双引号
\b
:退格,把光标移动到前一列位置
\f
:换页符
\n
:换行符
\r
:回车
\v
:垂直制表符
\ooo
:3位八进制数对应的字符
\xhh
:2位十六进制数对应的字符
\uhhhh
:4位十六进制数表示的Unicode字符
\t
:表示制表符(Tab)等。
>>> print("Python\n语言\t程序\t设计")
Python
语言 程序 设计
>>> print("c:\\now")
c:\now
>>> a= 'Let\'s go'
>>> print(a)
Let's go
3.5.3 基本的字符串操作符
字符串之间可以通过+或*进行连接
-
加法操作(+)将两个字符串连接成为一个新的字符串
-
乘法操作(*)生成一个由其本身字符串重复连接而成的字符串
>>> "pine"+"apple" 'pineapple' >>> 3*'pine' 'pinepinepine'
操作符 | 描述 |
---|---|
x in s | 如果x是s的元素,返回True,否则返回False |
x not in s | 如果x不是s的元素,返回True,否则返回False |
>>> c='cat,dog'
>>> "d" in c
True
>>> "z" in c
False
>>> "z" not in c
True
思考1:A=“5”+“8” A的值是多少? ’ 58’
思考2:name=”志存高远、脚踏实地“;name[5:]、name[0:-1]、name[:5]、name[0:-5]的值分别是多少?
>>> name="志存高远、脚踏实地"
>>> name[5:]
'脚踏实地'
>>> name[0:-1]
'志存高远、脚踏实'
>>> name[:5]
'志存高远、'
>>> name[0:-5]
'志存高远'
[例]获取星期字符串
程序读入一个表示星期几的数字(1~7),输出对应的星期字符串名称。例如,输入3,返回“星期三”。代码如下:
weekstr = "星期一星期二星期三星期四星期五星期六星期日"
weekid=eval(input("请输入星期数字(1-7):"))
pos = (weekid-1)*3
print(weekstr[pos:pos+3])
程序结果:
请输入星期数字(1-7):3
星期三
3.5.3 内置的字符串处理函数
操作 | 含义 |
---|---|
len(x) | 返回字符串x的长度,也可返回其他组合数据类型元素个数 |
str(x) | 返回任意类型x所对应的字符串形式 |
chr(x) | Unicode码对应的单个字符 |
ord(x) | 返回单字符表示的Unicode编码 |
hex(x) | 返回整数x对应十六进制数的小写形式字符串 |
oct(x) | 返回整数x对应八进制的小写形式字符串 |
bin(x) | 整数转换为二进制形式字符串 |
>>> len("pine")
4
>>> len("祖国,你好!")
6
>>> bin(16)
'0b10000'
>>> oct(16)
'0o20'
>>> hex(16)
'0x10'
>>> ord('A')
65
>>> chr(65)
'A'
>>> chr(ord('A')+1)
'B'
3.5.4 内置的字符串处理方法
操作 | 含义 |
---|---|
str.upper() | 字符串中字母大写 |
str.lower() | 字符串中字母小写 |
str.islower() | 判断字符串是否都是小写,是时,返回True,否则False |
str.isnumeric() | 判断字符串是否都是数字,是时,返回True,否则False |
str.isdigit() | 同str.isnumeric() |
str.isupper() | 判断字符串是否都是大写,是时,返回True,否则False |
str.isspace() | 当str所有字符都是空格,返回True,否则返回False |
str.replace(old,new[,count]) | 返回字符串str的副本,所有old子串被替换为new,如果count给出,则前count次old出现被替换。查找字符串所有匹配项并替换,返回字符串。 |
str.split(sep=None,maxsplit=-1) | 返回一个列表,由str根据sub子串出现的次数。用来将字符串分隔成序列。如果不指定分隔符,则空格、换行符、制表符等都将被认为是分隔符,把连续多个空白字符看作一个分隔符。 |
str.join(iterable) | 用来连接元组、列表等中的元素,注意其元素一定要是字符串。返回一个新字符串,由组合数据类型iterable变量的每个元素组成,元素间用str分隔。 |
str.find() | 可以在一个较长的字符串中查找子串,并返回子串所在位置的左端索引位置,如果没有找到则返回-1 |
str.strip([chars]) | 去掉字符串两侧的空格,并返回字符串。返回字符串str的副本,在其左侧和右侧去掉chars中列出的字符。 |
>>> a='Python'
>>> a.lower()
'python'
>>> a.upper()
'PYTHON'
>>> string = 'Python is a programming language.'
>>> string.replace('a','A')
'Python is A progrAmming lAnguAge.'
>>> string.split()
['Python', 'is', 'a', 'programming', 'language.']
>>> s="2017-10-31"
>>> s.split("-")
['2017', '10', '31']
>>> a=["1","2"]
>>> "t".join(a) # "t"为连接符
'1t2'
>>> b=s.split("-")
>>> '/'.join(b)
>>> s="apple,peach,banana,peach,pear"
>>> s.find("peach")
6
>>> s.find("peach",7) #从7位置字符开始往后找
19
>>> string = ' Python is a programming languages'
>>> string.strip()
'Python is a programming languages'
思考题:
>>>x='aaa bb c d e fff '
>>>b=','.join(x.split())
>>>b
结果为:
'aaa,bb,c,d,e,fff'
>>>b.replace("c",'cc').upper()
'AAA,BB,CC,D,E,FFF'
3.6 字符串类型的格式化
要点:字符串通过format()方法进行格式化
3.6.1 format()方法的基本使用
字符串format()方法的基本使用格式是:
<模板字符串>.format(<逗号分隔的参数>)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2poXWRZN-1593708679984)(/Users/eve/Desktop/PYTHON/SchoolCourse/第3章 基本数据类型/Picture/屏幕快照 2020-06-06 15.04.15.png)]
-
format方法:位置匹配
-
不带编号,即“
{}
”:>>> '{} {}'.format('hello','world') 'hello world'
-
带数字编号,可调换顺序,即“
{1}
”、“{2}
”>>> '{0} {1} {0}'.format('hello','world') 'hello world hello'
-
带关键字,即“
{a}
”、“{tom}
”:>>> '{a} {tom}'.format(a='hello',tom='world') 'hello world'
-
3.6.2 format()方法的格式控制
format方法:格式转换
'{[位置匹配][:格式]}'.format()
格式 | 说明 |
---|---|
b | 输出整数的二进制 |
c | 输出整数对应的Unicode字符 |
d | 输出整数的十进制 |
o | 输出整数的八进制 |
x | 输出整数的小写十六进制 |
X | 输出整数的大写十六进制 |
e | 输出浮点数对应的小写字母e的指数形式 |
E | 输出浮点数对应的大写字母E的指数形式 |
f | 输出浮点数的标准浮点形式 |
% | 输出浮点数的百分形式 |
m,n | 控制输入的宽度,精度 |
, | 千分位的分隔符 |
>>> '{:o}'.format(10)
'12'
>>> "Pi is {pi:5.2%}".format(pi=3.14159)
'Pi is 314.16%'
>>> "{:.3}".format(1/3)
'0.333'
>>> '{0:,%}'.format(1000/3)
'33,333.333333%'
格式 | 说明 |
---|---|
< | 左对齐 |
> | 右对齐 |
^ | 居中 |
>>> "Pi is {:#<10.2f}".format(3.1415)
'Pi is 3.14######'
思考
请写出下面的结果:
print('树立{0}命运{1}'.format('人类','共同体意识'))
print('2/3约等于{0:.2f}'.format(2/3))
print('{:+>10}'.format('守望相助'))
树立人类命运共同体意识
2/3约等于0.67
++++++守望相助