一、一些概念
1.链式赋值
同一个对象赋值给多个变量。e.g. x=y=123 -->x=123;y=123
2.系列解包赋值
给对应相同个数的变量(个数必须保持一致)e.g. a,b,c=4,5,6 -->a=4;b=5;c=6
Tips: 使用系列解包赋值实现变量交换(a,b=b,a)
>>> a,b=1,2
>>> a,b=b,a
>>> print(a,b)
2 1
3.常量
Python不支持常量,无语法规则限制。仅能约定常量的命名规则(全大写字母,多单词间用_隔开),以及在程序的逻辑上不对常量的值作出修改。
>>> MAX_SPEED = 120
>>> print(MAX_SPEED)
120
>>> MAX_SPEED = 140 #实际是可以改的。只能逻辑上不做修改。
>>> print(MAX_SPEED)
140
二、最基本内置数据类型(type)
① 整型;②浮点型;③布尔型;④字符串型
1.数字(整数和浮点数)
Tips:1.0不能做除数。
2.divmod()函数可以同时得到商和余数,返回的是一个元组。
e.g. >>> divmod(13,3)
(4, 1)
2.整数
Python3 中,int 可以存储任意大小的整数。(Python2 中,int 是32 位,long 类型是64 位,存在限制),故Python3可以做超大数的计算,而不会造成“整数溢出”,特别适合科学运算。
Tips: Googol 是Google 最初的名字,意为10的100次方。
Ⅰ.整数有四种进制:①10进制;
②0b 或0B,二进制0 1
③0o 或0O,八进制0 1 2 3 4 5 6 7
④0x 或0X,十六进制0 1 2 3 4 5 6 7 8 9 a b c d e f
后三者方便“位运算”操作
Ⅱ.int()实现类型转换:①浮点数直接舍去小数部分。e.g. int(9.9)结果是9;
②布尔值True 转为1,False 转为0。e.g. int(True)结果是1;
③字符串符合整数格式(浮点数格式不行)则直接转成对应整数,否则报错。
>>>int("456")#整数格式直接变整数
456
>>>int("456abc")#有字母不行
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
int("456abc")
ValueError: invalid literal for int() with base 10: '456abc'
>>>int("456.78")#浮点格式不行
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
int("456.78")
ValueError: invalid literal for int() with base 10: '456.78'
Ⅲ.自动转型:整数和浮点数混合运算时,表达式结果自动转型成浮点数。
e.g. 2+8.0 的结果是10.0
3.浮点数(float)
Ⅰ.科学计数法表示(内存中同样)。e.g. 3.14 / 314E-2 / 314e-2
Ⅱ.类型转换和四舍五入:①float(). 注意:运算后,对象并未改变,而是生成了新的对象;
②浮点数格式字符串同样可以转换;
③round(value)可以返回四舍五入的值,同样不会改变原有值,而是产生新的值。
4.增强型赋值运算符
Tips: “+=”中间不能加空格!
5.时间的表示
计算机中, “unix 时间点”:“1970 年1 月1 日00:00:00”(相当于这是一个基准点),其余时间以毫秒(1/1000 秒)进行计算。
Python 中可以通过time.time() 获得当前时刻,返回的值是以秒为单位,带微秒(1/1000 毫秒)精度的浮点值。例如:1530167364.8566。注:使用前需导入import time。
6.定义多点坐标_绘出折线_并计算起始点和终点距离
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)
Tips: 开方需要引入math中的sqrt(Value)
7.布尔值
Python2:没有布尔值,直接用数字0 表示False,用数字1 表示True。
Python3:True 和False 被定义为关键字,但本质还是1 和0,甚至可以和数字相加。
8.比较运算符
9.逻辑运算符
#短路现象:30/0应报错,但或运算中,若a为True,后面的不运算
a=True
a or 30/0
10.同一运算符
用于比较两个对象的存储单元,实际比较的是对象的地址。
①is:判断两个标识符是不是引用同一个对象;
②is not:判断两个标识符是不是引用不同对象。
Tips:1.is 与== 区别:
is 用于判断两个变量引用对象是否为同一个,既比较对象的地址。
== 用于判断引用变量引用对象的值是否相等,默认调用对象的__eq__()方法。
2.整数缓存问题:
Python在命令中对比较小的整数对象进行缓存(范围为[-5, 256]);在Pycharm 或者保存为文件执行时,范围是[-5,任意正整数]。 全局解释器范围
命令 文件执行
Tips:is 运算符比== 效率高(==存在调用__eq__()),在变量和None 进行比较时,应该使用is。
三、字符串
逻辑思维的重要性远远超过数学能力
字符串的本质是:字符序列。Python 的字符串是不可变的,我们无法对原字符串做任何修改,且不支持单字符类型,单字符也是作为一个字符串使用的。
1.字符串的编码
Python3 的字符默认为16 位Unicode 编码,ASCII 码是Unicode 编码的子集。(Unicode可以表示世界上任何书面语言的字符。)
使用内置函数ord()可以把字符转换成对应的Unicode 码;
使用内置函数chr()可以把十进制数字转换成对应的字符。
2.创建字符串
①通过单引号或双引号创建字符串。
小技巧:a = "I'm a teacher!"字符串包含‘’,使用“”来创建,反之同样。
②连续三个单引号或三个双引号,可以帮助我们创建多行字符串。
>>> resume = ''' name="gaoqi"
company="sxt" age=18
lover="Tom"'''
3.空字符串和len()函数
Python 允许空字符串的存在,不包含任何字符且长度为0。
len()用于计算字符串含有多少字符。
4.转义字符
使用“\+特殊字符”,实现某些难以用字符表示的效果。
5.字符串拼接
1. 可以使用+将多个字符串拼接起来。例如:’aa’+ ’bb’ ==>’aabb’。
(1) 如果+两边都是字符串,则拼接。
(2) 如果+两边都是数字,则加法运算。
(3) 如果+两边类型不同,则抛出异常。
2. 可以将多个字面字符串直接放到一起实现拼接。例如:’aa’’bb’==>’aabb’
注:产生的是新的对象
6.字符串复制
使用*可以实现字符串复制。
>>> a = 'Sxt'*3
>>> a
'SxtSxtSxt'
7.不换行打印(end="")
调用print 时,会自动打印一个换行符。若不想换行打印,可以自己通过参数end = “任意字符串”。实现末尾添加任何内容:print("sxt",end=' '),前面双引号里面是打印的东西,后面是参数。
8.从控制台读取字符串input()
使用input()从控制台读取键盘输入的内容。
>>> myname = input("请输入名字:")
请输入名字:school
>>> myname
'school'
9.str()实现数字转型字符串
将其他数据类型转换为字符串。
str(5.20) ==> ‘5.2’ str(3.14e2)==>’314.0’ str(True) ==> ‘True’
10.使用[]提取字符
字符串中每个字符都有一个索引编号,可以在字符串后面添加[],在[]里面指定偏移量,来提取该位置的单个字符。
正向搜索:
最左侧第一个字符,偏移量是0,第二个偏移量是1,以此类推。直到len(str)-1为止。
反向搜索:
最右侧第一个字符,偏移量是-1,倒数第二个偏移量是-2,以此类推,直到-len(str)为止。
a b c d
正向:0 1 2 3
反向:-4 -3 -2 -1 超范围报错
>>>a='abcdefghijklmnopqrstuvwxyz'
>>>a
'abcdefghijklmnopqrstuvwxyz'
>>>a[0]
'a'
>>>a[-26]
'a'
11.replace()实现字符串替换
字符串不可改变,有时候需要替换某些字符时,只能通过创建新的字符串来实现。
>>>a = 'abcdefg'
>>>a
'abcdefg'
>>>a[0] = 'w'#此处相当于修改字符串中的字符,字符串不可修改
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
a[0] = 'w'
TypeError: 'str' object does not support item assignment
>>>a = '123456789'
>>>a
'123456789'
>>>a = 'abcdefghijklmnopqrstuvwxyz'#这里是可以变的,因为只是把不同的对象给到变量
>>>a
'abcdefghijklmnopqrstuvwxyz'
>>>a = a.replace('c','王')
'ab王defghijklmnopqrstuvwxyz'
实际上我们是创建了新的字符串对象,并指向了变量a,而不是修改了以前的字符串。
12.字符串切片slice 操作
快速的提取子字符串。标准格式为:[起始偏移量start:终止偏移量end:步长step] (包头不包尾)
三个量为正数的情况:
三个量为负数的情况:
切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。起始偏移量小于0,则会当做0,终止偏移量大于“长度-1”会被当成-1。
小练习:将”sxtsxtsxtsxtsxt”字符串中所有的s 输出 --> ”sxtsxtsxtsxtsxt”[::3]
13.split()分割和join()合并
split()可以基于指定分隔符将字符串分隔成多个子字符串(存储到列表中)。如果不指定分隔符,则默认使用空白字符(换行符/空格/制表符)。
>>> a = "to be or not to be"
>>> a.split()
['to', 'be', 'or', 'not', 'to', 'be']
>>> a.split('be')
['to ', ' or not to ', '']
join()的作用和split()作用刚好相反,用于将一系列子字符串连接起来。
>>> a = ['sxt','sxt100','sxt200']
>>> '*'.join(a)
'sxt*sxt100*sxt200'
Tips:join()和+的使用注意:使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+来拼接字符串。推荐使用join 函数,因为join 函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。
测试+拼接符和join()的效率:
import time
time1=time.time()# +的起始时间
a=""
for i in range(10000000):
a += "sxt"
time2=time.time()# +的终止时间
print("运算时间:"+str(time2-time1))
time3=time.time()# join()的起始时间
li=[]
for i in range(10000000):
li.append("sxt")
a="".join(li)
time4=time.time()# join()的终止时间
print("运算时间:"+str(time4-time3))
最终结果:运算时间:19.856602668762207
运算时间:0.6600668430328369
14.字符串驻留机制和字符串比较
仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。
标识符规则的字符串:仅包含下划线(_)、字母和数字。启用字符串驻留机制
>>> a = "abd_33"#此字符串符合驻留机制
>>> b = "abd_33"
>>> a is b
True# 符合驻留机制,故为同一对象
>>> c = "dd#"# 此字符串不符合驻留机制
>>> d = "dd#"
>>> c is d
False# 不符合驻留机制,故不是同一对象
可以直接使用==,!=对字符串进行比较,是否含有相同的字符。(Value值)
成员操作符:in /not in 关键字,判断某个字符(子字符串)是否存在于字符串中。
>>>a = "abcdefg"
>>>"b" in a
True
>>>"bcd" in a
True
>>>"ddd" in a
False
15.字符串一些常用方法
Ⅰ.常用查找方法
a='''我是高淇,今年18 岁了,我在北京尚学堂科技上班。我的儿子叫高洛希,他6 岁了。我是一个编程教育的普及者,希望影响6000 万学习编程的中国人。我儿子现在也开始学习编程,希望他18 岁的时候可以超过我'''
Tips:a.isalnum(),汉字也是字母
Ⅱ.去除首尾信息
strip()去除字符串首尾指定信息。通过lstrip()去除字符串左边指定信息,rstrip()去除字符串右边指定信息。不指定默认为空格。
>>> "*s*x*t*".strip("*")
's*x*t'
>>> "*s*x*t*".lstrip("*")
's*x*t*'
>>> "*s*x*t*".rstrip("*")
'*s*x*t'
>>> " sxt ".strip()
'sxt'
Ⅲ.大小写转换
a = "gaoqi love programming, love SXT"
Ⅳ.格式排版
center()、ljust()、rjust()这三个函数用于对字符串实现排版。
>>> a="SXT"
>>> a.center(10,"*")#一共10个字符,字符串居中,左右填补*
'***SXT****'
>>> a.center(10)#一共10个字符,字符串居中,左右填补空格(默认)
' SXT '
>>> a.ljust(10,"*")#一共10个字符,字符串左对齐,右边填补*
'SXT*******'
Ⅴ.其他方法
(1)isalnum() 是否为字母或数字
(2)isalpha() 检测字符串是否只由字母组成(含汉字)。
(3)isdigit() 检测字符串是否只由数字组成。
(4)isspace() 检测是否为空白符 空白符:空格,\t(制表符),\n(换行符)
(5)isupper() 是否为大写字母
(6)islower() 是否为小写字母
16.字符串格式化
Ⅰ.format()基本用法
格式化字符串的函数str.format(),不限个参数,位置可以不按顺序。基本语法是通过{} 和: 来代替以前的% 。
{索引}/{参数名},两种形式直接映射参数值。
>>> a = "名字是:{0},年龄是:{1}" #{0}和{1}充当占位符角色,设定好格式,为后续填充占位
#但有顺序
>>> a.format("高淇",18) #把高淇和18填入上述占位符位置
'名字是:高淇,年龄是:18'
>>> a.format("高希希",6) #把高希希和6填入上述占位符位置
'名字是:高希希,年龄是:6'
>>> b = "名字是:{0},年龄是{1}。{0}是个好小伙" #同样数字的占位符使用同样的值
>>> b.format("高淇",18)
'名字是:高淇,年龄是18。高淇是个好小伙'
>>> c = "名字是{name},年龄是{age}" #使用参数名来标识,不用关注顺序
>>> c.format(age=19,name='高淇')
'名字是高淇,年龄是19'
Ⅱ.填充与对齐
二者常一起使用。
^、<、>分别是居中、左对齐、右对齐,后面带宽度;
:号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充。
>>> "{:*>8}".format("245") #:后为信息,*为用*填充,>为右对齐,8为8个字符
'*****245'
>>> "我是{0},我喜欢数字{1:*^8}".format("高淇","666")
'我是高淇,我喜欢数字**666***' #:后为信息,*为用*填充,^为居中,8为8个字符
Ⅲ.数字格式化
浮点数通过f,整数通过d 进行需要的格式化。
>>> a = "我是{0},我的存款有{1:.2f}" #.2f表示2位有效数字
>>> a.format("高淇",3888.234342)
'我是高淇,我的存款有3888.23'
17.可变字符串
需要原地修改字符串,可以使用io.StringIO 对象或array 模块。
>>> import io
>>> s = "hello, sxt"
>>> sio = io.StringIO(s) #可变字符串
>>> sio
<_io.StringIO object at 0x02F462B0>
>>> sio.getvalue() #获取字符串的值
'hello, sxt'
>>> sio.seek(7) #指针移动到修改的位置(0开始)
7
>>> sio.write("g") #改为g
1
>>> sio.getvalue()
'hello, gxt'