链式赋值
链式赋值用于同一个对象赋值给多个变量
x=y=123 #相当于:x=123;y=123
系列解包赋值
系列数据赋值给对应相同个数的变量(个数必须保持一致)
x=y=123 #相当于:x=123;y=123
a,b=1,2 #使用系列解包赋值实现变量交换
a,b=b,a
常量
python不支持常量,即没有语法规则限制改变一个常量的值。我们只是能约定常量的命名规则,以及在程序的逻辑上不对常量进行修改。
MAX_SPEED=140 #实际上是可以修改的,只是逻辑上不去改它
最基本内置数据类型
1)数字(整数、浮点数)
运算:
+,-,*,/ (浮点数除法), // (整数除法),%,**(乘幂)
除数为0,会产生异常
使用divmod()函数可同时得到商和余数:
divmod(13,3) #返回一个元组(4,1),商4,余1
整数:
python中,除了10进制,还有其他三种进制,二进制,八进制,十六进制
12 #十进制12
0b101 #二进制5
0xff #十六进制255
使用 int() 可实现强制类型在转换
int(3.99) #直接去掉小数,返回3
int('a') #错误:单个字符或字符串,不能通过int()强制转换为整数
int("adsa1242") #错误,字符和数字混合,不能转换
int("345.67") #错误,小数字符串不可以转换
int("123") #正确,整数型字符串可以实现转换,
自动转型:
整数和浮点数混合运算时,表达式结果自动转换成浮点数。
python3中可做超大数的计算,而不会造成“整数溢出”,这也是python特别适合科学运算的特点
浮点数:
类型转换与四舍五入:
float()可以将其他类型转化成浮点数。
整数和浮点数混合运算时,表达式结果自动转换成浮点数。
round(value),可以返回四舍五入的值
增强型赋值运算符:
a=a+1 #等价于 a+=1
#此外还有: -=, *=, /=, //=, **=, %=, 且“+=”中间不能加空格
时间表示:
计算机中时间的表示是从1970年1月1日00:00:00开始,以毫秒进行计算。这样时间就可全部用数字来表示。
python中可以通过time.time()获得当前时刻,返回值是以秒为单位
【小练习】:定义多点坐标_绘出折线_并计算起始点和终点距离
import turtle
import math
#定义多个坐标
x1,y1=100,100
x2,y2=100,-100
x3,y3=-100,-100
x4,y4=-100,100
#绘制折线
turtle.penup()
turtle.goto(x1,y1)
turtle.pendown()
turtle.goto(x2,y2)
turtle.goto(x3,y3)
turtle.goto(x4,y4)
#计算起点和终点距离
distance=math.sqrt((x4-x1)**2+(y4-y1)**2)
turtle.write(distance)
布尔值: 0表示False,1表示True
比较运算符: ==,!=, >, <, <=, <=
逻辑运算符: or, and , not (或,与, 非)
同一运算符: is , is not
is与 == 的区别:
is用于判断两个变量引用的对象是否属于同一个,即比较对象的地址
== 用来判断引用变量引用对象的值是否相等,默认调用对象的__eq__()方法
整数缓存问题:
a=1000
b=1000 #a,b不在[-5,256]范围内,1000这个对象没有被缓存
a==b #True
a is b #False
python仅仅对比较小的整数对象进行缓存(范围为[-5,256]),若保存为文件执行,范围是[-5,任意正整数]
c=10
d=10 #c, d不在[-5,256]范围内,1000这个对象没有被缓存
c is d #True
2)字符串
python的字符串是不可变的,我们无法对原字符串做任何修改。但,可以将字符串的一部分复制到新创建的字符串,达到看起来修改的效果。
python不支持单字符类型,单个字符也是作为一个字符串使用的。
字符串编码
使用内置函数 ord() 可以把字符转化成对应的unicode编码;
使用内置函数 chr() 可以把十进制数字转换成对应的字符
引号创建字符串
a="ast"
b="I’am a teacher!"
c='my name is "zhaoqiang"'
空字符串和len()函数
c=''
len(c) #len(c)=0
len("abc我我") #unicode编码,英文字符和汉字字符地位一样,len为5
转义字符:
\ (续行符),\\(反斜杠符号),\’(单引号),\" (双引号),\b(退格),\n(换行),\t(制表),\r(回车)
print("aaaaa\
bbbbbb")
字符串拼接: “aa”+“bb”=“aabb”
+两边是字符串,则拼接
+号两边是数字,则相加
+号两边类型不同,则报错
str1 = "i love"+"you" #"i loveyou"
str2 = "love"*2 #"lovelove"
str()实现数字转型为字符串
str(True) #"True"
str(3.14e2) #"314.0"
使用 [ ] 提取字符
正向搜索: 0—> len-1
反向搜索:-1—> -len
a = "i love you"
print(a[0], a[1], a[2], a[3], a[4]) #"i lov"
print(a[-3], a[-2], a[-1]) #"you"
replace实现字符串替换
a = "i love you"
a = a.replace(" ","*") #间接改变a="i*love*you"
print(a)
字符串切片slice操作
slice操作可以快速提取字符串,标准格式为: [start:end:step]
[ : ] —> 提取整个字符串
[ : end]—>从头到end
[start: ]—>从start到尾
[start : end : step]—>从start到end,且步长为step
#包头不包尾
a="i love you"
b=a[1:5] #b=" lov" (包含1,但不包含5)
c=a[1:8:2] #c=" oey"
d=a[:] #d=a="i love you"
e=a[-3:] #e="you"
f=a[-8:-3] #f="love "
g=a[::-1] #g="uoy evol i",逆序排
h=a[2:400] #不会报错,从2到最后就可以
split() 和 join() 合并
split() 可以基于指定分隔符将字符串分割成多个子字符串(存储到列表中)。如果不指定分隔符,则默认使用空白字符(换行符/空格/制表符)。示例代码如下:
>>>a="to be or not to be"
>>>a.split()
['to','be','or','not','to','be']
>>>a.split('to')
['','be or not','be']
join()的作用和split()作用刚好相反,用于一系列子字符串的拼接,join()性能比 ‘+’ 好
a=['i','love','you']
''.join(a) #"iloveyou"
' '.join(a) #"i love you"
练习: 测试不同拼接符‘+’和join()的效率差异
import time
a=''
time01=time.time()
for i in range(1000000):
a+="sxt"
time02=time.time()
print("运算时间:",time02-time01)
time03=time.time()
li=[]
for i in range(1000000):
li.append('sxt')
a=' '.join(li)
time04=time.time()
print("运算时间:",time04-time03)
运算时间: 0.42529821395874023 #‘+’,在1000000次循环中会产生1000000个对象
运算时间: 0.10572123527526855 #join() ,''.join(list)效率确实高多了
字符串驻留机制和字符串比较
字符串驻留:仅保存一份相同且不可变字符串的方法,不同的值被存放在驻留池中。python支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线,字母和数字)会启用字符串驻留机制。
成员操作符
in / not in 关键字,判断某个子字符串是否在相应字符串中
字符串常用方法汇总
len() --->返回字符串长度
a.startwith("lihelin") --->是否以指定字符开头
a.endwith("lihelin") --->是否以指定字符串结尾
a.find("lihelin") --->返回第一次出现指定字符串的位置
a.rfind("lihelin") --->返回最后一次出现指定字符串的位置
a.count("lihelin") --->返回指定字符串出现的次数
a.isalnum() --->是否所有字符全是字母或数字
去除首尾信息
我们可以通过 strip() 去除字符串首尾指定信息。通过lstrip()去除字符串左边指定信息,通过rstrip()去除字符串右边指定信息。
"*s*x*t*".strip('*') #"s*x*t"
"*s*x*t*".ltrip('*') #"s*x*t*"
"*s*x*t*".rstrip('*') #"*s*x*t"
大小写转换
a.capitalize() 产生新的字符串,首字母大写
a.title() 产生新的字符串,每个单词首字母大写
a.upper() 产生新的字符串,所有字符大写
a.lower() 产生新的字符串,所有字符小写
a.swapcase() 产生新的字符串,所有字母大小写转换
格式排版
a.center(10,'*') 10个字符,a居中,左右*填充
a.ljust(10,'*') 10个字符,a左对齐,右边*填充
a.rjust(10,'*') 10个字符,a右对齐,左边*填充
其他方法
isalnum() 是否只由字母或数字组成
isalpha() 是否只由字母(包含汉字)组成
isdigit() 是否只由数字组成
isspace() 是否为空白符:\t,\n,' '
isupper() 是否为大写字母
islower() 是否为小写字母
字符串格式化
format()基本用法
a="姓名:{0} 年龄:{1}"
b=a.format("lihelin",22)
print(b)
c="姓名:{name} 年龄:{age}"
d=c.format(name="lihelin",age=22)
print(d)
填充与对齐
填充与对齐一起用,^ 、< 、>分别是居中、左对齐、右对齐,后面带宽度
:后面带填充的字符,只能是一个字符,不指定的话用空格填充
"我是{0},我喜欢数字{1:*^8}".format("lihelin",666) #要求字符数:8; ^:居中; *:填充字符
"我是{0},我喜欢数字{1:*<8}".format("lihelin",666)
数字格式化
a="我是{0},我的存款有{1:.2f}".format("lihelin",12000) #.2f:两位小数, 12000.00