链式赋值用于同一个对象赋值给多个变量
x=y=123相当于x=123,y=123
a,b,c=4,5,6 相当于a=4,b=5,c=6
实现变量互换
>>> a,b=1,2
>>> a,b=b,a
>>> a
2
python不支持常量
>>> MAX_SPEED=120
>>> print(MAX_SPEED)
120
>>> MAX_SPEED=140#实际可以改,逻辑不修改
>>> print(MAX_SPEED)
140
python支持整数和小数
运算符:+,-,*
/ | 浮点数除法 |
---|---|
// | 取整 7//2=3 |
% | 取余 7%4=3 |
** | 幂 2**3=8 |
>>> a=7/2
>>> a
3.5
>>> a=7//2
>>> a
3
>>> a=7%2
>>> a
1
>>> a=2**3
>>> a
8
注意:0不能做除数
使用divmod()函数同时得到商和除数
>>> divmod(9,5)
(1, 4)
除了十进制,还有:
0b或0B,二进制 0 1
0o 0O,八进制 01234567
0X,0x,十六进制,0123456789abcdef
>>> 0b101
5
>>> 0o10
8
>>> 0o9
SyntaxError: invalid token
>>> 0xf
15
>>> 0xff
255
使用int()实现类型转换:
>>> int(3.234)
3
>>> int(True)
1
>>> int(False)
0
>>> int("3242ser")
Traceback (most recent call last):
File "" , line 1, in
int("3242ser")
ValueError: invalid literal for int() with base 10: '3242ser'
>>> int("2434")
2434
自动转型:
整数和浮点数运算,结果是浮点数
整数可以有多大:
python3中int可以存储任意大小的整数,long被取消。适合科学运算。
>>> googol=10**100
>>> googol
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
float
科学技术法
3.14,314E-2,e或E
>>> float(3)
3.0
>>> 314E-2
3.14
>>> float("3.14")
3.14
>>> b=3+3.4
>>> b
6.4
>>> round(3.65)
4
a=a+1 等价于a+=1
其他运算符号以此类推
中间不能加空格
>>> a=12
>>> a+=1
>>> a
13
时间也是数字,以毫秒为单位计时,从1970年1月1日00:00:00开始。
python中可以通过time.time()获得当前时刻,整数部分是毫秒,小数部分是微秒
>>> import time
>>> time.time()
1584168039.9242876
>>> b=int(time.time())
>>> b
1584168132
>>> totalminute=b/60
>>> totalminute
26402802.2
>>> totalminute=b//60
>>> totalhours=totalminute//60
>>> totalhours
440046
>>> totalDays=totalhours//24
SyntaxError: unexpected indent
>>> totalDays=totalhours//24
>>> totalDays
18335
>>> totalYears=totalDays//365
>>> totalYears
50
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((x1-x4)**2+(y1-y4)**2)
turtle.write(distance)
python3中,把True和False定义成了关键字,但他们的本质还是1和0,甚至可以和数字相加。
>>> a=True
>>> b=3
>>> a+b
4
== | 是否相等 |
---|---|
!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
是真命题就是True,不是就是False
很常用
运算符 | 格式与说明 |
---|---|
or 或 | x or y,x为true,不计算y,直接返回true;x为false,则返回y。 |
and 和 | x and y,x为true,则返回y的值;x为false,不计算y,直接返回false |
not 非 | not x,x为true则返回false;x为false则返回true |
>>> a=True
>>> b=False
>>> a or 30
True
>>> b or 30
30
>>> a or 30/0
True
is:判断是不是引用一个对象
is not:是否不是一个对象
is与==区别:
is比较对象的id,而= =是比较对象的值
>>> a=1000
>>> b=1000
>>> a==b
True
>>> a is b
False
>>> id(a)
36192896
>>> id(b)
36192880
python只是对比较小的整数对象进行缓存,范围为【-5,256),在这个范围的对象会进行缓存。
>>> a=10
>>> b=10
>>> a is b
True
但是如果保存为文件执行或者在Pycharm执行,【-5,任意正整数)的范围的对象都会缓存。
is比==运算效率高,在变量和None进行比较时,用is。
字符串不是数字,更关注逻辑思维,而不是数学能力。
字符串本质是字符序列,定义好后是不可变的,只能再建一个新的。
Python不支持单字符类型,单字符就是长度是1的字符串。
用Unicode,可以表示任何书面语言,默认16位。
使用内置函数ord()可以把字符串转换成对应的Unicode码。
使用内置函数chr()可以把十进制数字转换成对应的字符。
>>> ord('A')
65
>>> ord('黄')
40644
>>> chr('66')
Traceback (most recent call last):
File "" , line 1, in
chr('66')
TypeError: an integer is required (got type str)
>>> chr(66)
'B'
单引号或双引号
但如果字符串里有单引号,就应该用双引号包着,例如a=“I’m a teacher”
如果字符串里有双引号,就应该用单引号包着。
多行字符串用三个单引号或三个双引号包起来。
>>> resume='''name="hj"
company='xx' age=24
love=hjh'''
>>> print(resume)
name="hj"
company='xx' age=24
love=hjh
len()表示字符串长度
空字符串长度为0
>>> c=''
>>> c
''
>>> len(c)
0
>>> len('uhugen你好')
8
\+特殊字符
\t是制表符
>>> a='i\nlove\nyou' #\n表示换行符
>>> print(a)
i
love
you
>>> b='i\'m a teacher' #\'表示单引号
>>> print(b)
i'm a teacher
>>> print('njhihhhj\
chugibj')#\是续行符
njhihhhjchugibj
+或空格相连
>>> 'ad'+'sd'
'adsd'
>>> '3'+'3'
'33'
>>> 3+3
6
>>> 'ad' 'sd'
'adsd'
>>> a='hj'*30
>>> a
'hjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhj'
end=‘任意字符串’
print('sd',end='$')
print("df",end="\t")
print("dss")
======================= RESTART: F:/python.exec/mypy06.py ======================
sd$df dss
input()
>>> myname=input("请输入名字")
请输入名字hj
>>> myname
'hj'
>>> str("5.20")
'5.20'
>>> str("314e-2")
'314e-2'
>>> str(314e-2)
'3.14'
>>> str(True)
'True'
字符串就是字符序列
索引也叫偏移量
正向搜索:最左侧第一个字符,偏移量是0,直到len(str)-1
反向搜索:最右侧第一个字符,偏移量是-1
>>> a="fbjsdbfjeb"
>>> a[0]
'f'
>>> a[20] #超过范围了
Traceback (most recent call last):
File "" , line 1, in
a[20]
IndexError: string index out of range
>>> a[-1]
'b'
>>> a[-2]
'e'
字符串定义好是不可变的,如果想修改
>>> a="fbjsdbfjeb"
>>> a.replace("f","0") #把f换成0
'0bjsdb0jeb'
实际上创建了新的字符串对象,而不是改了以前的
即截取子字符串
[起始偏移量start:终止偏移量end:步长step]
>>> a = "abcdefghijklmn"
>>> a[2]
'c'
>>> a[1:5]#起始偏移量到终止偏移量,包头不包尾
'bcde'
>>> a[1:5:2]
'bd'
[:]是取所有的,默认步长为1
>>> a[:]
'abcdefghijklmn'
>>> a[2:]#从2开始直到最后
'cdefghijklmn'
>>> a[:2]
'ab'
也可以反向搜索,也是包头不包尾
>>> a[-3:]
'lmn'
>>> a[:-3]
'abcdefghijk'
>>> a[::-1]#反向排
'nmlkjihgfedcba'
>>> a[2:400]#超过范围也不会报错
'cdefghijklmn'
>>> "to be or not to be"[::-1]
'eb ot ton ro eb ot'
>>> "sxtsxtsxtsxt"[::3]#输出所有s
'ssss
把字符串分割成多个字符串
默认按换行符、空格符、制表符分割
>>> a="to be or not to be"
>>> a.split()
['to', 'be', 'or', 'not', 'to', 'be']
>>> a.split("to")
['', ' be or not ', ' be']
join()是连接起来
>>> "abc"+"cde"
'abccde'
>>> a=['sxt','sxt100','sxt200']
>>> '*'.join(a)
'sxt*sxt100*sxt200'
>>> ''.join(a)
'sxtsxt100sxt200'
推荐用join(),因为不会生成新对象。+会生成新对象。
测试+拼接符和join()不同的效率
import time
time01 = time.time() #起始时刻
a = ""
for i in range(1000000):
a += "sxt"
time02 = time.time()
print("运算时间:"+str(time02-time01))
time03 = time.time() #起始时间
li = []
for i in range(1000000):
li.append("sxt")
a = "".join(li)
time04 = time.time()
print("运算时间:"+str(time04-time03))
>>>
======================= RESTART: F:/python.exec/mypy07.py ======================
运算时间:1.2640724182128906
>>>
======================= RESTART: F:/python.exec/mypy07.py ======================
运算时间:1.2120695114135742
运算时间:0.42902445793151855
字符串驻留:仅保存一份相同且不可变字符串的方法,但仅包含下划线、数字和字母。
>>> a = "hkj"
>>> b = "hkj"
>>> a is b
True
>>> c = "as_d"
>>> d = "as_d"
>>> c is d
True
>>> id(c)
36256704
>>> id(d)
36256704
>>> e = "df@12"
>>> f = "df@12"
>>> e is f
False
>>> id(a)
36319456
>>> id(b)
36319456
>>> id(e)
36319616
>>> id(f)
36319552
直接使用==和!=对字符串进行比较,是否含有相同的字符。
is 和not is比较的是对象的id。
in/not in 关键字,判断某个字符或字符串是否存在于字符串中。
>>> a = "asdfdsf"
>>> "d" in a
True
>>> "sdf" not in a
False
>>> a='你好,我是crammerhj'
>>> len(a)
14
>>> a.startswith('你好') #是否以指定字符串开始
True
>>> a.endswith('hj')#是否以指定字符串结尾
True
>>> a.find('r')#正向搜索
6
>>> a.rfind('r') #反向搜索
11
>>> a.count('r')#指定字符串出现了几次
2
>>> a.isalnum() #是否全是字母和数字
False
>>> 'vhgjh123'.isalnum()
True
>>> " sxt ".strip()#默认去除首位空格
'sxt'
>>> " s x t ".strip()#注意是去除首位,不包括中间
's x t'
>>> "*s*x*t*".strip("*")
's*x*t'
>>> "*s*x*t**".strip("*")
's*x*t'
>>> "*s*x*t**".rstrip("*")#去除右边尾部*,lstrip()是去除左边首部字符
'*s*x*t'
>>> a = "hello,world, I am hj"
>>> a.capitalize()
'Hello,world, i am hj'
>>> a.title()
'Hello,World, I Am Hj'
>>> a.upper()
'HELLO,WORLD, I AM HJ'
>>> a.lower()
'hello,world, i am hj'
>>> a.swapcase()
'HELLO,WORLD, i AM HJ'
center(),ljust(),rjust()
>>> a = "sxt"
>>> a.center(10,"*")#10个字符
'***sxt****'
>>> a.center(10)#默认用空格
' sxt '
>>> a.ljust(10,"*")#左对齐
'sxt*******'
>>> "sxt100".isalnum()#是否都是字符串
True
>>> "sxt你好".isalpha()#是否都是字母,汉字也算
True
>>> "23.2".isdigit()#是否都是数字
False
>>> "232".isdigit()
True
>>> "aA".isupper()#是否都是大写字母,islower()是小写字母
False
>>> "AA".isupper()
True
>>> "\t\n".isspace()#是否都是空白
True
>>> a = "名字是:{0},年龄是:{1}"
>>> a.format("hj",24)
'名字是:hj,年龄是:24'
>>> a = "名字是:{0},年龄是:{1},{0}是一个好姑娘"#0处是同一个字符串
>>> a.format("hj",24)
'名字是:hj,年龄是:24,hj是一个好姑娘'
>>> c = "名字是{name},年龄是{age}"
>>> c.format(age=24,name='hj')#可以不在乎顺序
'名字是hj,年龄是24'
:后面表示填充的字符
^<>分别表示居中左对齐右对齐
>>> "我是{0},我喜欢数字{1:*^8}".format("hj",666) #8表示字符串长度
'我是hj,我喜欢数字**666***'
小数用f,整数用d进行格式化
>>> a = "我是{0},我的存款有{1:.2f}" #:.2f表示保留两位小数
>>> a.format("hj",358576.23442)
'我是hj,我的存款有358576.23'
>>> "{:0>10d}".format(3)
'0000000003'
io.StringIO
>>> s = "hello,hj"
>>> import io
>>> sio = io.StringIO(s)
>>> sio
<_io.StringIO object at 0x022DD7B0>
>>> sio.getvalue()
'hello,hj'
>>> sio.seek(7)
7
>>> sio.write("g")
1
>>> sio.getvalue()
'hello,hg'
>>>