太白的学习目录 https://www.cnblogs.com/jin-xin/p/9076242.html

编码 上

计算机要想工作必须通电,也就是说‘电’驱使计算机干活,而‘电’的特性,就是高低电平(高低平即二进制数1,低电平即二进制数0),也就是说计算机只认识数字(010101).如果我们想保存数据,首先得将我们的数据进行一些处理,最终得转换成010101才能让计算机识别。

 所以必须经过一个过程:

  字符(str)--------(编码过程)------->数字(bytes 二进制字符串 类似str)

  这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码。

1、ASCII:最初版本的编码方式:(支持对英文字母、数字、特殊字符等进行编码)

ASCII码是上个世纪最流行的编码体系之一,至少在西方是这样。下图显示了ASCII码中编码单元是怎么映射到字符上的。

最开始:
0000 0001 256种可能。    0000 0001 8位 = 1个字节(bytes)。
s1 = 'hello1' 6个字节  ,一个字节表示一个字符。
h-------->01101000    e-------->01100101   l -------->01101100   l -------->01101100    o -------->01101111  1 --------> 00110001

2、GBK:为了满足中文,中国人定制了GBK

GBK:2Bytes代表一个字符;为了满足其他国家,各个国家纷纷定制了自己的编码。日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr

只包含:本国语言(中文汉字、中文特殊字符等)和对ASCII的映射(支持对英文字母、数字、特殊字符等进行编码)

GBK是GB2313的升级版 支持21000+个汉字

3、unicode:万国码。把全世界所有的文字都记录起来。(2~4个字节,已经收录了136690个字符,还在一直不断扩张中。。。)
起初:一个字符两个字节 (只能表示256*256个)
h: 01101000 01101000  中:01101000 01101000
不够用升级:一个字符四个字节
h: 01101000 01101000 01101000 01101000  中: 01111000 01101000 01101000 01101000
浪费空间,浪费流量

Unicode包含了跟全球所有国家编码的映射关系,解决了字符与二进制(bytes)的对应关系、但是使用Unicode表示一个字符,太浪费空间。例如利用Unicode表示“Python”需要12个字节才能表示,比原来Ascll表示增加了1倍

由于计算机的内存比较大。并且字符串在内容中表示时也不会特别大,所以内容可以使用unicode来处理,但是存储和网络传输时一般数据都会非常多,那么增加1倍将是无法容忍的!!!

4、utf-8: 最少用8位一个字节表示一个字符。

为了解决存储和网络传输的问题,出现了 Unicode Transformation Format,学术名:UTF
h: 01101000   ASCII 英文字符:1个字节表示
Tú.: 01101000 01101000   欧洲语系:一个字符2个字节表示
中: 01101000 01101100 01101000 东亚:一个字符用3个字节表示。
'中国 I LOVE YOU' utf-8的编码方式: 14个字节

单位转化:
8bit == 1bytes (字节) 1024bytes == 1KB 1024KB == 1MB 1024MB == 1GB 1024GB == 1TB

Python3文件存储和传输时默认是UTF-8编码方式的;加载进入内存里时Python3解释器把utf-8文件默认解码(decode)成Unicode ; 编写Python3文件时默认编码是Unicode(内存中),存储的时候编码成(encode)utf-8文件;  只有Python3是这样的!!!

# 例子一:  在python3中有两种字符串类型str和bytes     转换 :str ------编码(Unicode或者utf-8)---->bytes

s1 = '中国' # 当程序执行时,'中国'会被以unicode形式保存新的内存空间中,(加载到内存 默认已经Unicode的编码了 已经变成bytes了)
# unicode ---> utf-8
#s指向的是unicode,因而可以编码成任意格式,都不会报encode错误
b1 = s1.encode('utf-8') # 编码
print(b1,type(b1))
# utf-8 ----> unicode
s2 = b1.decode('utf-8') # 解码
print(s2,type(s2)) #Python2里面的Unicode类型变成str了 

例子二:

s1 = '中国'
b1 = s1.encode('gbk') # gbk编码
print(b1)
# gbk----> unicode
s2 = b1.decode('gbk') # 解码
print(s2)

例子三:

# gbk ---> utf-8
b1 = b'\xd6\xd0\xb9\xfa'
s1 = b1.decode('gbk') # unicode
b2 = s1.encode('utf-8')
print(b2)

 

1, 不同密码本(编码方式 GBK、UTF-8等等)之间不能互相识别。报错,乱码。
2, 数据的存储或者网络传输不能用unicode的密码本进行编码。 python3x 环境:
str类型内部编码方式为Unicode。
所以:str类数据不能直接存储硬盘,或者网络传输。 例子:str: 操作方法 bytes: 拥有和str相同的操作方式 str与bytes是相似的类型 str1 = 'barry'
print(str1.upper())
#bytes
b1 = b'barry'
print(b1.upper()) str类型内部编码方式为Unicode。
bytes类型内部编码方式为非Unicode。 英文:
str:
表现形式:'alex'
内部编码:unicode
bytes:
表现形式:b'alex'
内部编码:非unicode 中:
str:
表现形式:'alex'
内部编码:unicode
bytes:
表现形式:b'\xe4\xb8\xad\xe5\x9b\xbd'
内部编码:非unicode

编码下

四、 数据类型的转换
bool <---> int
str <---> int
s1 = '100' 全部由数字组成的str ---> int
int(s1)
str(100)
str <---> bool 非空即True '' 空即False

五、基础数据类型 str

1、字符串的索引与切片。

索引即下标,就是字符串组成的元素从第一个开始,初始索引为0以此类推。

a = 'ABCDEFGHIJK'
print(a[0])
print(a[3])
print(a[5])
print(a[7])

切片就是通过索引(索引:索引:步长)截取字符串的一段,形成新的字符串(原则就是顾首不顾尾)。

a = 'ABCDEFGHIJK'
print(a[0:3])
print(a[2:5])
print(a[0:]) #默认到最后
print(a[0:-1]) # -1 是列表中最后一个元素的索引,但是要满足顾头不顾腚的原则,所以取不到K元素
print(a[0:5:2]) #加步长
print(a[5:0:-2]) #反向加步长

2、字符串常用方法。对字符串进行的任何操作都会形成一个新字符串,与原字符串无关。

1. 英文字母大小写切换 (upper()全大写 lower() 全小写 )
username = input('请输入用户名')
password = input('请输入密码')
code = 'afREd'.upper()
your_code = input('请输入验证码:').upper()
if code == your_code:
if username == 'barry' and password == '':
print('登录成功')
else:
print('验证码错误') 

验证码的例子

2.  strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符、制表符)或字符序列。 ( lstrip()只去掉左边的、 rstrip()只去掉右边的  )

注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。

strip()方法语法:str.strip([chars]);
chars -- 移除字符串头尾指定的字符序列。
返回移除字符串头尾指定的字符生成的新字符串。

s1 = ' \talex\n'
s2 = 'ewareelexqw'
s3 = '\talex '
s4 = 'alex\talex'
s5 = s1.strip()
s6 = s2.strip('qwe') # 相当于字符串两边 移除列表中的['qwe','qw','we','q','w','e']
s7 = s3.strip()
s8 = s4.strip()
print(s5) #alex
print(s6) #areelex
print(s7) #alex
print(s8) #alex alex
username = input('请输入用户名').strip()
password = input('请输入密码').strip()
if username == 'barry' and password == '':
print('登录成功')
3. find和index方法

find 通过元素找索引,找到用第一个则返回,找不到返回-1
index 通过元素找索引,找到用第一个则返回,找不到则报错

s1 = '周末2期python期'
# i = s1.find('w')
i = s1.find('期',4,) #从索引为4的下标开始找
# i = s1.index('w')
print(i) 

# ret6 = a4.find("fjdk",1,6)
# print(ret6) # 返回的找到的元素的索引,如果找不到返回-1

# ret61 = a4.index("fjdk",4,6)
# print(ret61) # 返回的找到的元素的索引,找不到报错。

4. split() 默认(可指定分隔符)以空格为分割,返回一个列表。( str ----> list 可以将字符串变为列表)
s1 = 'alex wusir 太白 日天'
l1 = s1.split()
print(l1) #['alex', 'wusir', '太白', '日天']
s12 = 'alex:wusir:太白:日天'
l2 = s12.split(':')
print(l2) #['alex', 'wusir', '太白', '日天'] # 指定分隔次数
s11 = ':alex:wusir:太白:日天'
l3 = s11.split(':', 2)
print(l3) #['', 'alex', 'wusir:太白:日天']
5. splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。

方法语法:str.splitlines([keepends])
参数说明: keepends - - 在输出结果里是否保留换行符('\r', '\r\n', \n'),默认为 False,不包含换行符,如果为 True,则保留换行符。
返回值:返回一个包含各行作为元素的列表。

# !/usr/bin/python
str1 = 'ab c\n\nde fg\rkl\r\n'
print(str1.splitlines()) #['ab c', '', 'de fg', 'kl'] str2 = 'ab c\n\nde fg\rkl\r\n'
print(str2.splitlines(True)) #['ab c\n', '\n', 'de fg\r', 'kl\r\n']
6.   join 合并列表里的字符串成为一个大字符串
l1 = ['alex', 'wusir', '太白', '日天']
# s2 = '_'.join(l1)
s2 = '*'.join(l1)
# 前提条件:此列表必须全部是有字符串元素组成
# s2 = ''.join(l1)
print(s2)
7.  replace 默认全部替换 也可以设置替换次数
s1 = 'python深圳分校 深圳是一个很美丽的城市,我爱深圳'
# s2 = s1.replace('深圳', '北京')
s2 = s1.replace('深圳', '北京', 1) #只替换一次
print(s2)
8. format
# # 第一种
# msg = '我叫{} 今年{} 性别{}'.format('太白', '18', '男')
# print(msg)
# # 第二种
# msg = '我叫{0} 今年{1} 性别{2},我依然叫{0}'.format('太白', '18', '男')
# print(msg)
# # 第三种
msg = '我叫{name} 今年{age} 性别{sex}'.format(name='太白', sex='男',age='',)
print(msg) 
9. count 计算某个元素出现的次数
s1 = 'barryafdfdafdaaa'
i = s1.count('a')
print(i)  

# ret3 = a1.count("a",0,4) # 可切片
# print(ret3)

10.  is 系列
name = 'taibai123'
# print(name.isalnum()) #字符串由字母或数字组成
# print(name.isalpha()) #字符串只由字母组成
# print(name.isdigit()) #字符串只由数字组成 
11. startswith 判断以...为开始 endswith 判断以...为结尾
s1 = '太白barry'
print(s1.startswith("太"))
print(s1.startswith("b",2,5)) #下表为2的元素开始 至 下标为5的元素 为止 顾头不顾尾
print(s1.startswith("ba",2,5))  
12. len 内置函数
# s1 = 'fjdsklfsjafldsfjskladfjsladfjldksa'
# print(len(s1))
s1 = 'python2期'
# while
count = 0
while count < len(s1):
print(s1[count])
count += 1
# for 循环
# for 变量 in iterable:
# pass
for i in s1:
print(i,type(i))
for i in s1:
print(i + 'sb')
13 .其它方法
name = 'abC'
#captalize,swapcase,title
print(name.capitalize()) #首字母大写 Abc
print(name.swapcase()) #大小写翻转 ABc
msg='taibai say hi'
print(msg.title()) #每个单词的首字母大写 Taibai Say Hi # 内同居中,总长度,空白处填充
a1 = 'haha'
ret2 = a1.center(20,"*")
print(ret2) #********haha********

  

六、基础数据类型 list(tuple)

str数据类型这么强大 为什么要引入list?
如:str类型:'alex123'
1,存储少量数据。 2,数据类型单一。

容器类的数据类型:基础数据类型之一:list。
l1 = [1,'alex',True,[1,2,3], ().....]
列表可以存储大量的数据,列表是有顺序的。列表有索引,切片,切片(步长)
当你需要大量数据进行存储,并且是按照一定顺序,考虑到list

# 索引,切片。 顾首不顾尾:首从索引0开始,尾从索引-1开始。

l1 = [100, 'alex', True, [1,2,3]]
print(l1[0],type(l1[0])) #100 <class 'int'>
print(l1[-2]) #True
print(l1[:3]) #[100, 'alex', True]

列表的常用操作方法.增删改查其他操作

l1 = ['alex', 'wusir', '太白金星','日天', '女神']
# 1、append 追加
ret01 = l1.append(666)
print(ret01) #None
print(l1) #['alex', 'wusir', '太白金星', '日天', '女神', 666]
# 2、insert插入 insert(索引,元素)
ret02=l1.insert(1,'日天')
print(ret02)#None
print(l1)#['alex', '日天', 'wusir', '太白金星', '日天', '女神', 666]
# 3、extend 迭代着追加
l1.extend('abc')
ret03=l1.extend([1,2,3])
print(ret03)#None
print(l1) #['alex', '日天', 'wusir', '太白金星', '日天', '女神', 666, 'a', 'b', 'c', 1, 2, 3]

1.增

l1 = ['alex', 'wusir', '太白金星','日天', '女神']
# 1、pop 按照索引删除 有返回值
# ret = l1.pop(-1)
# print(ret) #女神 并返回该索引值 # 2、remove 按照元素删除
# ret1 = l1.remove('alex')
# print(l1,ret1) #['wusir', '太白金星', '日天', '女神'] None # 3、clear
# l1.clear()
# print(l1) #[] # 4、del
del l1[0] # 按照索引删除
print(l1)
del l1[:2] # 按照切片删除
print(l1)
del l1
# print(l1)

2. 删

l1 = ['alex', 'wusir', '太白金星','日天', '女神']
# 按照索引改值
l1[1] = 'sb'
print(l1) #['alex', 'sb', '太白金星', '日天', '女神']
# 按照切片改值
l1[:3] = 'haxi'
print(l1) #['h', 'a', 'x', 'i', '日天', '女神']

3.改

# 四、查:可以索引切片 for循环
l1 = ['alex', 'wusir', '太白金星','日天', '女神']
for i in l1:
print(i)

4.查

其他操作方法

l1 = ['alex', 'wusir', '太白金星','日天', '女神']
1、元素个数
print(len(l1))
2、count 次数
ret = l1.count('太白金星')
print(ret)
3、index 通过元素找索引,找不到报错
# ret = l1.index('日天1')
# print(ret)
4、sort与reverse
l2 = [5, 6, 4, 0, 9, 1, 7, 8]
l2.sort() # 从小到大
l2.sort(reverse=True) # 从大到小
l2.reverse() # 翻转
print(l2)

列表的嵌套

l1 = [1, 2, 'taibai', [1, 'alex', 3, ]]
'''
1, 将l1中的'taibai'变成大写并放回原处。
2,给小列表[1,'alex',3,]追加一个元素,'老男孩教育'。
3,将列表中的'alex'通过字符串拼接的方式在列表中变成'alexsb'。
'''
l1[2] = l1[2].upper()
l1[-1].append('老男孩教育')
l1[3][1] = l1[3][1] + 'sb'
print(l1)
# range 可以视为一个可控的数字范围的列表,多于for循环结合。
# for i in range(1,10): # [1,2,3,4,...9]
#   print(i)
# for i in range(20): # [0,1,2,3,4,...19]
#    print(i)
for i in range(0,10,2):
print(i)
print(range(10))
for i in range(10, 1, -1):
print(i)
# range 打印列表的索引
l1 = ['alex', 'wusir', '太白金星','日天', '女神']
for index in range(len(l1)):
print(index)

range 可以视为一个可控的数字范围的列表,多于for循环结合

元组: 基础数据类型之一:tuple

# 存储数据,重要的数据。元组不可以增删改,可以查询,元组的子集可以修改 。元组也有索引切片。

tu1 = (100, True, [1,2,3])
print(tu1[0])
for i in tu1:
print(i)
tu1[-1].append(666)
print(tu1) #(100, True, [1, 2, 3, 666])

七、基础数据类型 dict

有了列表,why还要使用字典?
1,列表的数据量越大,查询速度越慢。2,列表存储的数据没有什么关联性。

基础数据类型之dict eg:dic = {'name': 'barry'} 字典是以键值对的形式存储的。

字典的键key:必须是不可变得数据类型:int str
字典的值:任意数据类型 变量,对象。
字典可以存储大量的数据,而且字典的查询速度非常快。
字典的key 唯一的不重复的。
字典 3.5之前是无序的,字典在3.5之后是有序的初始化时的顺序。
构建数据类型:大量的关系型数据时,要到字典。

数据类型的划分:
可变的(不可哈希)数据类型:list dict set
不可变(可哈希)的数据类型:tuple str int bool

# 1、增:有则修改,无则增加
dic = {'name': 'alex', 'age': 46, 'sex': 'laddyboy'}
dic['high'] = 175
dic['name'] = '日天'
# 有则不变,无则增加
dic.setdefault('weight',200)
dic.setdefault('age',73)
print(dic) # 2、删除: (pop、clear、del)
dic = {'name': 'alex', 'age': 46, 'sex': 'laddyboy'}
ret = dic.pop('name')#按照key删除键值对,有返回值 返回值为删除键的值
print(ret,dic)#alex {'age': 46, 'sex': 'laddyboy'}
dic.clear()#清空该字典的所有值 不删字典
print(dic) #{}
#del dic #删除整个字典
# del dic['name'] #删除某个值 # 3、改
dic = {"name":"jin","age":18,"sex":"male"}
dic['name'] = '日天' #修改单个值
dic2 = {"name":"alex","weight":75}
dic2.update(dic) # 将dic的键值对覆盖添加到dic2中,dic不变。
print(dic,dic2)#{'name': '日天', 'age': 18, 'sex': 'male'} {'name': '日天', 'weight': 75, 'age': 18, 'sex': 'male'} # 4、查
dic = {'name': 'alex', 'age': 46, 'sex': 'laddyboy'}
print(dic['name'])
# print(dic['name1']) #KeyError: 'name1'
ret01 = dic.get('name1') #None
ret02 = dic.get('name1', '没有此键')
ret03 = dic.get('name')
print(ret01,ret02,ret03) #None 没有此键 alex

字典的增删改查

5、其他方法:

dic = {'name': 'alex', 'age': 46, 'sex': 'laddyboy'}
for key in dic:
print(key,dic[key])
#name alex
#age 46
#sex laddyboy # dic.keys() dic.values() dic.items()
print(dic.keys(),type(dic.keys())) #dict_keys(['name', 'age', 'sex']) <class 'dict_keys'>
for key in dic.keys():
print(key,type(key))
for value in dic.values():
print(value)
print(dic.items()) # dict_items([('name', 'alex'), ('age', 46), ('sex', 'laddyboy')])
for k,v in dic.items():
print(k,v)
print(list(dic.items())) #[('name', 'alex'), ('age', 46), ('sex', 'laddyboy')]

6、嵌套

dic = {
'name_list': ['张三', '李四', 'BARRY'],
1:{'name':'taibai', 'age': 18},
'barry': {}
}
# 1,给列表追加一个值:'王五'
dic['name_list'].append('王五')
print(dic)
# 2,将BARRY 变成全部小写
print(dic['name_list'][-1].lower())
dic['name_list'][-1] = dic['name_list'][-1].lower()
print(dic)
# 3,给{'name':'taibai', 'age': 18} 增加一个键值对 sex: 男。
print(dic[1])
dic[1]['sex'] = '男'
print(dic)

八、基础数据类型的补充(汇总)。
int str bool list tuple dict
# 数据类型的转换。

分别赋值

a, b = 1, 4
print(a,b) #1 4
c, d = (1,4)
print(c,d) #1 4
e, f = [[1,2,3],'alex']
print(e,f)#[1, 2, 3] alex

list 列表的一个坑

l1 = [11, 22, 33, 44, 55]
# 将列表中索引为奇数位的元素删除
# 正常思路(错误示范):
for index in range(len(l1)):
  if index % 2 == 1:
    del l1[index]
print(l1) # 方法一:
del l1[1::2]
print(l1)
# 方法二:
# 倒叙删除
for index in range(len(l1)-1,-1,-1): # index -= 1
  if index % 2 == 1:
    l1.pop(index)
print(l1)
# 总结:对于列表来说,你在循环一个列表时,不要改变列表的大小,会影响你的最终结果

字典的一个坑

dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'name': '太白'}
# 将字典的键中含有k元素的所有键值对删除
for key in dic:
  if 'k' in key:
    dic.pop(key)
print(dic) # 满足条件的key添加到一个新列表中,循环列表删除相应的键值对。
l1 = []
for key in dic:
  if 'k' in key:
    l1.append(key)
print(l1)
for i in l1:
  dic.pop(i)
print(dic)
1, 不同密码本(编码方式 GBK、UTF-8等等)之间不能互相识别。报错,乱码。
2, 数据的存储或者网络传输不能用unicode的密码本进行编码。 python3x 环境:
str类型内部编码方式为Unicode。
所以:str类数据不能直接存储硬盘,或者网络传输。 例子:str: 操作方法 bytes: 拥有和str相同的操作方式 str与bytes是相似的类型 str1 = 'barry'
print(str1.upper())
#bytes
b1 = b'barry'
print(b1.upper()) str类型内部编码方式为Unicode。
bytes类型内部编码方式为非Unicode。 英文:
str:
表现形式:'alex'
内部编码:unicode
bytes:
表现形式:b'alex'
内部编码:非unicode 中:
str:
表现形式:'alex'
内部编码:unicode
bytes:
表现形式:b'\xe4\xb8\xad\xe5\x9b\xbd'
内部编码:非unicode

编码下

最新文章

  1. airflow 部署
  2. Java 浅析三大特性之一继承
  3. (转)SVN服务器搭建和使用(三)
  4. [AJAX系列]onreadystatechange事件
  5. VB6对象与地址相互转换
  6. 运用Java对微信公众平台二次开发技术——开发者模式接入
  7. 使用Java程序调用MatLab
  8. Servlet课程0425(五) sendRedirect实现不同页面共享数据
  9. cocos2dx android平台事件系统解析
  10. 【转】Linux(ubuntu14.04)上编译Android4.4源码的环境搭建及编译全过程
  11. Magic Pairs - SGU 119(同余)
  12. (原创)android4.4沉浸式标题栏
  13. Swift初探一
  14. JavaScript用二分法查找数据等
  15. 地牢逃脱 (BFS)
  16. Java annotation浅析
  17. 前端面试题目汇总摘录(JS 基础篇)
  18. virtualbox安装android6.0并设置分辨率为1920x1080x32
  19. python date time
  20. Linux应急处理操作手册

热门文章

  1. Firefly-rk3399 开发板环境搭建
  2. Python学习笔记之文件处理
  3. 《黑白团团队》第八次团队作业:Alpha冲刺
  4. Photoshop教程
  5. 如何用PYTHON的CGIHTTPSERVER模块模拟POST请求?
  6. sublime text 插件emmet快捷命令
  7. pt-kill--- MySQL数据库CPU飙升紧急处理方法
  8. LeetCode之RemoveElement
  9. AutoSharedLibrary -- 基于模板元编程技术的跨平台C++动态链接载入库
  10. ASP怎样检測某目录是否存在,不存在则自己主动创建