-
目录
python基础
2.1数据类型
在python中可以直接处理的数据类型有以下几种:整数、浮点数、字符串、布尔值、空值、变量、常量。
2.1.1整数
python可以处理任意大小的整数,用16进制表示时用0x前缀和0-9,a-f表示,python当中内置了整数和二进制,八进制以及16进制的转换函数。当在python中将整数转换成二进制,八进制和16进制表示时。
data = 156
print(bin(data))
print(oct(data))
print(hex(data))
从上到下依次是二进制,八进制和十六进制的表示方法
当要将二进制,八进制和十六机制转换成整数时:
num1 = "10011100"
num2 = "234"
num3 = "9c"
print(int(num1,2))
print(int(num2,8))
print(int(num3,16))
从上到下依次是二进制,八进制和十六进制。
2.1.2 浮点数
浮点数就是小数,对于很大或者很小的浮点数,就必须用科学计数法表示,用e替换10,比如1.23*109就是1.23e9.
整数和浮点数在计算机内部的储存方式是不一样的,整数永远是精确的,而浮点数存在四舍五入的误差
2.1.3 字符串
字符串指的是以单引号或者双引号括起来的任意文本,单引号和双引号本身是一种表示方式而不是字符串的一部分。如果单引号本身是一个字符,那么可以用双引号括起来。如果在一个文本中同时包含单引号和双引号就需要用\进行转义。
print("I'm, OK!")
print('I am "OK!"')
print('I\'m, \"OK!\" ')
从上到下依次是文本中含有单引号、双引号以及文本中同时含有单引号和双引号。转义字符\可以转义很多字符,例如\n表示换行,\t表示制表,同时字符\本身也需要转义,也就是说\\表示的是\。
print('\\')
print('learning \npython')
print('learning\tpython')
为了简化操作,python中允许用r’’,此时’’中的字符不表示任何转义。同时对于换行,如果有多个字符需要换行允许使用’’’ ’’’进行表示。如果在’’’ ’’’操作之前加上r,此时换行仍然生效。
print(r'learning\tpython')
print('''learn
python
123''')
print(r'''learn
python
123''')
可以看出,当在单引号前加上r之后,\t的制表效果就取消了。
2.1.4 布尔值
布尔值和布尔代数的表示完全一致,一个布尔值只有True和False两种表示方式,也可以通过布尔运算计算出布尔值。
print(3>5)
输出结果为False
布尔值可以用and,or和not运算,and运算是与运算,只有所有的结果都为True输出结果才是True。
# and运算
print(True and True)
print(True and False)
print(False and False)
print(3>5 and 5>3)
从上到下的输出结果依次是True,False,False,False
布尔值的or运算是或运算,只有有一个结果是True,输出结果就是True
# or运算
print(True or True)
print(True or False)
print(False or False)
print(3>5 or 5>3)
从上到下的输出结果依次是True,True,False,True
布尔值的not运算是非运算,是把True变成False
# not运算
print(not True)
print(not False)
print(not 3>5)
从上到下的输出结果依次是False,True,True
布尔值运算经常运用在条件判断中,
age=50
if age>=18:
print('adult')
else:
print('teenager')
此时输出结果adult。
2.1.5 空值
空值用None表示,空值不是0,0在python中是有意义的,而None是一个特殊的空值。
2.1.6 变量
变量不仅可以是数字,还可以是任意数据类型。变量在程序中是用变量名表示,变量名可以用任意的英文字母以及英文字符和数字表示但是不能用数字开头。在python中=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。
a = 123 # a是整数
print(a)
a = 'ABC' # a变为字符串
print(a)
2.1.7 常量
常量就是不能变的变量,在Python中通常用全部大写的变量名表示常量。全部大写的变量名只是一个习惯上的用法,并没有特殊意义,你可以用任何字母表示常量。
在python中,除法也是精确的,python中存在两种除法,一种是/,另外一种是//。其中/的计算结果是浮点数,即使两个数可以整除,最后的结果也是浮点数。
print(10/3)
print(9/3)
这两个的输出结果都是浮点数。
//的计算结果是整数,即使两个数不能整除,最后的结果也是整数
print(10//3)
print(9//3)
这两个的输出结果都是整数3,而不是3.0。
2.2字符串和编码
2.2.1 字符编码
计算机只能处理数字,不能处理文本,如果要处理文本就需要先把文本转换成数字才能处理,最早的计算机设计时,采用8个bit作为一个字节,一个字节能表示的最大整数就是255,最早只有127个字符被编码到计算中,其中包含大小写英文字母以及数字和一些符号,这个编码被称为ASCII编码。
但是如果要处理中文显然一个字符是不够用的,为了不与ASCII编码产生冲突,中国制定了GB2312编码用来处理中文。然而,全世界的语言有上百种,因此各种不同的编码不可避免的会产生冲突。这种结果就是在有多种语言的文本中会产生乱码。
为了解决这种乱码现象,Unicode字符集产生了,把所有语言都统一到一套编码里,这样就不会产生乱码问题。ASCII编码是1个字节,而Unicode编码通常是两个字节。然而,如果文本中都是英文,那么Unicode编码则比ASCII编码多一倍存储空间。
为了节约空间,出现了把Unicode编码转换为可变长编码的UTF-8编码。UTF-8编码把一个Unicode字符根据不同数字大小编码成1-6个字节,英文字母被编码成一个字节,汉字通常是3个字节,只有很生僻的字符才会编码成4-6个字节。
在计算机内存中,统一使用Unicode编码,当需要保存的时候,转换成UTF-8编码,当需要读取的时候再转换成Unicode编码。
浏览网页时,服务器会把动态生成的Unicode编码内容转换成UTF-8编码再进行传输。
2.2.2 python的字符串
Python中的字符串是以Unicode编码的,python支持多种语言。python中提供了ord函数来获取字符的函数表示,chr函数把编码转换成对应的字符。在Pycharm中的具体表现为
print('今年18岁')
print(ord('A'))
print(ord('中'))
print(chr(65))
print(chr(20013))
python中的字符串类型是str,在内存中以Unicode编码保存,一个字符对应若干个字节。如果字符要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
以Unicode表示的str通过encode()方法可以将编码转换为指定的bytes。纯英文的str可以用ASCII转换为指定的bytes。但是含有中文的str只能用UTF-8编码表示而不能用ASCII,会报错。python中对于bytes类型的数据用带b前缀的单引号或者双引号表示。在pycharm中的体现如下:
# encode函数,str转换成bytes
print('ABC'.encode('ascii'))
print('中文'.encode('utf-8'))
输出结果是以b为前缀的字符串,输出结果如下。
为了将str类型的字符串存入到硬盘或者磁盘中,将字符串转换成bytes类型,如果我们要从硬盘中读取字符串就需要将bytes格式的文件转换成str类型,这个时候就用到了decode函数。
# decode函数,bytes转换成str
print(b'ABC'.decode('utf-8'))
print(b'ABC'.decode('ascii'))
print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
同样的,英文可以使用UTF-8和ASCII,而中文只能使用UTF-8。
如果在bytes编码中混入了一小部分无效的编码,可以使用errors=ignore忽略掉错误的字节。在pycharm中的具体表现如下:
print(b'\xe4\xb8\xad\xe6\x96\x87\xff'.decode('utf-8',errors='ignore'))
最后一段\xff属于无效编码,加入errors之后仍然可以正确输出。
如果需要计算str中的字符数或者bytes类型中的字节数,就需要使用len()函数。
# len函数计算str字符数
print(len('ABC'))
print(len('中文'))
# len函数计算bytes字节数
print(len(b'ABC'))
print(len(b'\xe4\xb8\xad\xe6\x96\x87'))
print(len('中文'.encode('utf-8')))
print(len('ABC'.encode('ascii')))
通常一个英文字符占一个字节,而一个中文字符占三个字节。为了避免str和bytes在转换过程中产生乱码,我们一般统一采用UTF-8编码。
2.2.3 格式化
如果我们输入的内容是根据变量变化的,那么就需要一种简便的格式化字符串的方式,在python中通常用%格式化字符串。
占位符 | 替换内容 |
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
格式化整数和浮点数还可以指定是否补0和整数与小数的位数,pycharm中的体现如下。
print('hello %s' %'world')
# 格式化整数和浮点数
print('%d-%02d' % (3, 1))
print('%.2f' % 3.1415926)
如果不确定用什么,%s永远起作用,可以把任何数据类型转换为字符串。如果%是字符串中的一个字符,那么就需要通过%进行转义,即%%表示字符%。
print('Age: %s. Gender: %s' % (25, True))
print('growth rate: %d %%' % 7)
format()是另外一种格式化字符串的方式。依次传入参数替换字符串中的占位符{0},{1}等等。
# format格式化字符串
print('Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125))
最后一种格式化字符串的方式是f-string。与其他格式化字符串的方式不同,f-string是以变量进行替换。
# f-string格式化字符串
r = 2.5
s = 3.14 * r ** 2
print(f'The area of a circle with radius {r} is {s:.2f}')
2.3 使用list和tuple
2.3.1 list
list是一种有序的集合,可以随时添加和删除其中的元素。在pycharm中的具体体现如下,
math = ['01','02','03']
print(math)
变量math就是一个list,可以使用len函数来获得list中的元素个数。
print(len(math))
可以用索引来访问list中每一个位置的元素,正序的索引是从0开始的,也可以直接访问最后一个元素,用-1表示。
print(math[0],math[1],math[2])
print(math[-1],math[-2],math[-3])
list是一个可变的有序列表,因此可以在列表中的任意位置插入元素,通过append可以直接在列表末尾插入元素,insert操作可以在列表的任意位置插入元素,在pycharm中的具体体现如下:
# 在列表中插入元素
math.append('04')
print(math)
math.insert(0,'00')
print(math)
在列表中可以插入元素,那么也就可以删除元素,通过pop操作可以删除列表中任意一个元素。pop操作可以直接删除列表中最后一个元素,也可以通过pop(i)删除列表中的指定元素。
# 在列表中删除元素
math.pop()
print(math)
math.pop(0)
print(math)
如果需要替换列表中的某个元素,那么可以直接进行赋值替换。
# 替换列表中的元素
math[0] = '00'
print(math)
列表中的元素可以是不同类型的字符,同时,列表中的元素也可以是一个列表
# 不同元素的列表
math2 = ['one',123,True]
print(math2)
# 列表中的元素是列表
s = [1,[2,3],4]
print[s]
同时,可以读取列表中第二个列表中的任意元素。
# 提取列表中第二个列表的第一个元素
print(s[1][0])
2.3.2 tuple
tuple是一个元组,tuple和list非常类似,但是tuple一旦初始化之后就不能对元素进行修改。
math = ('00','01','02')
print(math)
因为tuple不能修改元素,所以不存append和insert操作,也不能通过赋值对tuple中的元素进行修改。
如果要定义一个只含有一个元素的tuple,要在这一个元素之后添加一个逗号,来表示定义的是一个元素,因为()既可以表示tuple也可以表示数学公式,为了防止歧义,需要在元素之后添加一个逗号。
# 定义一个只有一个元素的tuple
math = (1,)
print(math)
tuple中的元素不能改变,但是如果在tuple中存在一个列表,那么这个列表中的元素是可变的,仍然可以通过赋值来修改元素。这个时候list中的操作仍然有效。
# 可变的tuple
t = ('a', 'b', ['A', 'B'])
t[2][0] = 'X'
t[2][1] = 'Y'
print(t)
p = [0,1,2]
t = ('a', 'b', p)
p.append(3)
p.insert(0,4)
print(t)
2.4 条件判断
在python中通过if语句来执行判断操作,这个操作在大部分的语言中应该都是一样的吧。
i = 18
if i>10:
print('i比10大')
else:
print('i比10小')
如果有多个判断条件的时候,通过elif来执行,最后一个条件才用else。
m=10
if 1<m<9:
print('i比9小')
elif 15>m>=10:
print('i比15小')
else:
print('i比15大')
python中的条件判断是从上往下执行,如果满足了第一个if条件,会自动忽略之后的elif和else。
n=10
if n>8:
print(123)
elif n>6:
print(456)
else:
print(789)
此时输出的就是123而不是456。这时候就是只执行了第一个if判断条件,而忽略了elif和else。
if的判断条件可以简写,只要x的输入是非零数值,非空字符串,非空list等就判断为true.
x=123
if x:
print('True')
结合第一章中提到的input函数可以使程序更加完整,但是input函数输入的是str字符串,字符串不能直接与整数进行比较,python中提供了int函数将str字符串转换成整数。
m = input('请输入年龄:')
age = int(m)
if age>18:
print('呵,老男人')
else:
print('呵,细狗')
2.5 循环
2.5.1 for循环
python中提供了两种循环方式,一种是for.... in....循环,把list或者tuple中的元素依次打印出来。
math = [0,1,2,3]
for i in math:
print(i)
如果我们想要通过for循环来实现1-10的整数之和,那么可以通过sum变量进行累加操作。
# 计算1-10的整数之和
sum= 0
for i in [1,2,3,4,5,6,7,8,9,10]:
sum = sum + i
print(sum)
print(sum)
这里注意print的缩进,如果在for之中,那么会输出累加的详细过程,每一个步骤的数据,在for循环之外,那么就会输出最后的结果55。
这种累加的方式比较麻烦,如果要计算1-100的整数和,那我们还需要手动输入1-100所有的整数。python中提供了range函数来解决这个问题。range表示所有小于5的整数,通过list函数转换成列表
# 通过range函数生成小于5的所有整数
print(list(range(5)))
print(tuple(range(5)))
通过range函数可以实现1-100的整数和求解。
# 实现1-100的整数和
sum= 0
for x in range(101):
sum = sum+x
print(sum)
2.5.2 while循环
除了for循环,python中第二种循环方式就是while循环,只要满足条件就一直循环,直到不再满足条件的时候就跳出循环。
# while循环实现一百以内的奇数和
sum = 0
n = 99
while n >0:
sum=sum+n
n= n-2
print(sum)
while同样可以与第一章中提到的input函数结合。
# 实现任意的奇数相加
sum= 0
n = input('请输入数字')
m = int(n)
while m >0:
sum=sum+m
m= m-2
print(sum)
2.5.3 break
在循环过程中,如果需要提前结束循环,可以通过break操作,提前跳出循环。
# break跳出循环
n = 1
while n <= 100:
if n > 10: # 当n = 11时,条件满足,执行break语句
break # break语句会结束当前循环
print(n)
n = n + 1
print('END')
2.5.4 continue
通过continue操作可以跳过当前的循环,直接进行下一次循环。
# continue进行下一次循环
n = 0
while n < 10:
n = n + 1
if n % 2 == 0: # 如果n是偶数,执行continue语句
continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
print(n)
2.6 使用dict和set
2.6.1 dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
如果我们需要实现一个根据名字查找年龄的操作,可以通过dict实现。
# dict实现名字与年龄对应
d = {'li':18,'liu':38,'hu':58}
print(d['li'])
除了初始化的时候将数据放入dict,还可以通过key放入,也就是进行赋值操作。
d['Adam'] = 67
print(d['Adam'])
一个词只能对应一个值,如果多次赋值的话,只会保存最后一次的赋值。如果输入了一个不存在的词,则会报错。要判断在字典里是否存在这个词,有两种验证方式,一种是通过in,另一种是通过d.get()
# 判断Key是否存在
print('cao' in d)
print(d.get('cao'))
print(d.get('cao',-1))
要删除一个key同样可以使用pop操作,对应的value也会被从dict中删除。
# 删除dict中的元素
d.pop('Adam')
print(d)
相较于list,dict要占用更多的空间,但是它的查询速度更快。dict的key必须是不可变对象。
2.6.2 set
set与dict类似,也是一组key的集合,但是set中不包含value。key不能重复,所以在set中没有重复的元素。要创建一个set需要一个list作为输入。
# 创建一个set
s = set([1,2,3])
print(s)
重复的元素将会被自动过滤,不会输出。这个结果仍然是{1,2,3}
# set中重复的元素是无效的
m = set([1,2,2,3,3])
print(m)
可以通过add(key)和remove(key)来增加或者删除set中的元素,当然重复添加的元素是无效的。
# 添加元素
s.add(4)
print(s)
# 删除元素
s.remove(4)
print(s)
set可以看作是一个无序的无重复的数学集合,两个set可以做数学意义上并集和交集操作。&是交集的表示,|表示并集。
# set交并集
s1= set([1,2,3])
s2= set([2,3,4])
print(s1&s2)
print(s1|s2)
p=[1,2,3]
s3=set(p)
print(s3)