pythonbytes转str_Python学习笔记之基础篇(1)
1.解释器
编译器或者解释器就是负责把符合语法的程序代码转换成CPU能够执⾏的机器码,然后执⾏。Python也不例外。同时Python解释器承担了内存管理的复杂任务,这⼤⼤简化了应⽤程序的编写。
Python的解释器有很多,有CPython,IPython,PyPy,Jython,IronPython等。其中 CPython是使⽤最⼴的Python解释器。教程的所有代码也都在CPython下执⾏。( CPython⽤>>>作为提⽰符,⽽IPython⽤In [序号]:作为提⽰符。)
2.语法特点
以#开头的语句是注释,注释是给⼈看的,可以是任意内容,解释器会忽略掉注释。其他每⼀⾏都是⼀个语句,当语句以冒号:结尾时,缩进的语句视为代码块。
Python程序是⼤⼩写敏感的,如果写错了⼤⼩写,程序会报错。
3. 数据类型
python能够直接处理的数据类型有:
3.1 整数(包括负整数):
数学⽅法表⽰:1,100,-8080,0,等等。
⽤⼗六进制表⽰: ⼗六进制⽤0x前缀和0-9,a-f表⽰,例如:0xff00,0xa5b4c3d2,等等。
3.2 浮点数(⼩数):
数学⽅法表⽰: 如1.23,3.14,-9.01,等等。⽤科学计数法表⽰(很⼤/很⼩的浮点数): 把10⽤e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。注: 整数和浮点数在计算机内部存储的⽅式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!),⽽浮点数运算则可能会有四舍五⼊的误差。
3.3 字符串:
字符串是以单引号'或双引号"括起来的任意⽂本,需要注意的是 ''或""本⾝只是⼀种表⽰⽅式,不是字符串的⼀部分。
(1):如果'本⾝也是⼀个字符,那就可以⽤""括起来
(2):如果字符串内部既包含'⼜包含"则可以⽤转义字符\来标识。⽐如 'I\'m \"OK\"!'
(3):转义字符\可以转义很多字符,⽐如\n表⽰换⾏,\t表⽰制表符,字符\本⾝也要转义,所以\\表⽰的字符就是\。
(4):如果字符串⾥⾯有很多字符都需要转义,就需要加很多\,为了简化,Python还允许⽤r''表⽰''内部的字符串默认不转义。⽐如
>>> print(r'\\\t\\')\\\t\\
(5):字符串内部有很多换⾏,⽤\n写在⼀⾏⾥不好阅读,为了简化,Python允许⽤'''...'''的格式表⽰多⾏内容。⽐如
>>> print(''' line3''')line1line2line3
(6):字符编码: 字符串⽐较特殊的是还有⼀个编码问题
历史:
最早计算机采⽤8bit作为⼀个字节(byte),所以⼀个字节能表⽰的最⼤的整数是255(⼆进制11111111=⼗进制255),如果要表⽰更⼤的整数,就必须⽤更多的字节。⽐如两个字节可以表⽰的最⼤整数是65535,4个字节可以表⽰的最⼤整数是4294967295。
最早出现的是ASCII编码,只有127个字符被编码到计算机⾥,也就是⼤⼩写英⽂字母、数字和⼀些符号。可是这个要处理中⽂的话,就需要两个字节,⽽且还不能和ASCII码冲突。
中国制定了GB2312编码,⽤来把中⽂编进去。⽇本把⽇⽂编到Shift_JIS⾥,韩国把韩⽂编到Euc-kr⾥,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语⾔混合的⽂本中,显⽰出来会有乱码。
之后出现了Unicode把所有语⾔都统⼀到⼀套编码⾥,这样就不会再有乱码问题了。但是,如果你写的⽂本基本上全部是英⽂的话,⽤Unicode编码⽐ASCII编码需要多⼀倍的存储空间,在存储和传输上就⼗分不划算。
所以⼜出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把⼀个Unicode字符根据不同的数字⼤⼩编码成1-6个字节,常⽤的英⽂字母被编码成1个字节,汉字通常是3个字节,只有很⽣僻的字符才会被编码成4-6个字节。如果你要传输的⽂本包含⼤量英⽂字符,⽤UTF-8编码就能节省空间:
计算机内存中的运⽤:
在计算机内存中,统⼀使⽤Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
⽤记事本编辑的时候,从⽂件读取的UTF-8字符被转换为Unicode字符到内存⾥,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到⽂件.
浏览⽹页的时候,服务器会把动态⽣成的Unicode内容转换为UTF-8再传输到浏览器:所以你看到很多⽹页的源码上会有类似的信息,表⽰该⽹页正是⽤的UTF-8编码。
python中字符串编码:
在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串⽀持多语⾔
单个字符的编码:
ord()函数获取字符的整数表⽰chr()函数把编码转换为对应的字符
str和byte的互相转换:
(为了避免乱码问题,应当始终坚持使⽤UTF-8编码对str和bytes进⾏转换。):
python获取数组长度str-> bytes (encode⽅法):
如果要在⽹络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。以Unicode表⽰的str
通过encode()⽅法可以编码为指定的bytes。
ASCII 只能表⽰英⽂ ,UTF-8可以表⽰所有语⾔。 所以 'ABC'.encode('ascii') , '中⽂'.encode('utf-8') 都是对的,可是 '中
⽂'.encode('ascii')就是错的。
bytes -> str (decode⽅法):
如果我们从⽹络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要⽤decode()⽅法:
如果bytes中包含⽆法解码的字节,decode()⽅法会报错:
如果bytes中只有⼀⼩部分⽆效的字节,可以传⼊errors='ignore'忽略错误的字节。⽐如:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')'中'
在python源⽂件⾥指定编码
由于Python源代码也是⼀个⽂本⽂件,所以,当你的源代码中包含中⽂的时候,在保存源代码时,就需
要务必指定保存为UTF-8编码。
通常在⽂件开头写上这两⾏:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第⼀⾏注释是为了告诉Linux/OS X系统,这是⼀个Python可执⾏程序,Windows系统会忽略这个注释;
第⼆⾏注释是为了告诉Py
同时必须并且要确保⽂本编辑器正在使⽤UTF-8 without BOM编码
(7):格式化:
⽤%运算符就是⽤来格式化字符串:
有⼏个%?占位符,后⾯就跟⼏个变量或者值,顺序要对应好如果你不太确定应该⽤什么,%s永远起作⽤,它会把任何数据类型转换为字符串:
>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'有些时候,
字符串⾥⾯的%是⼀个普通字符怎么办?这个时候就需要转义,⽤%%来表⽰⼀个%:
>>> 'growth rate: %d %%' % 7'
growth rate: 7 %'
常见的占位符有:
占位符替换内容
%d整数
%f浮点数
%s字符串
%x⼗六进制整数
使⽤字符串的format()⽅法格式化字符串
它会⽤传⼊的参数依次替换字符串内的占位符{0}、{1}……,不过这种⽅式写起来⽐%要⿇烦得多
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('⼩明', 17.125)'
Hello, ⼩明, 成绩提升了 17.1%'
3.4 布尔值:
⽤True、False表⽰布尔值(请注意⼤⼩写)
布尔值可以⽤and、or和not运算
布尔值经常⽤在条件判断中,⽐如:
if age >= 18:print('adult')else:print('teenager')
3.5 空值:
空值是Python⾥⼀个特殊的值,⽤None表⽰。None不能理解为0,因为0是有意义的,⽽None是⼀个特殊的空值。Python还提供了列表、字典等多种数据类型,还允许创建⾃定义数据类型。
4.数据结构:
4.1列表list:
list是⼀种有序的集合,可以随时添加和删除其中的元素。
list 特征:
(1): list ⾥⾯的元素的数据类型也可以不同
(2): list元素也可以是另⼀个list,此时list可以看成是⼀个⼆维数组,类似的还有三维、四维……数组
s = ['python', 'java', ['asp', 'php'], 'scheme']则s[2][1]就是指php
(3): list中⼀个元素也没有,就是⼀个空的list,它的长度为0
(4): python中数组(list/array)不会复制,⽽是直接引⽤,此时要特别注意,如下图,b = a,此时改变b就会改变a,所以有时候使⽤不当,会导致某个变量莫名其妙就发⽣了变化。
对于单个变量,如:
将数据直接赋值进⾏复制后,变量前后独⽴,是位于两块空间内的。但对于数组(list 或 numpy.array):
相当于引⽤,是位于同⼀块空间内的
(5):列表是python内置的可变序列,是包含若⼲元素的有序连续内存区间,其元素数据类型可以各不相同。当列表增加或删除元素时,列表对象将⾃动进⾏内存的扩展或收缩,从⽽保证元素间没有间隙。python列表内存的⾃动管理可以⼤幅减少程序员负担,但是也可能造成列表内⼤量元素的移动,效率低。所以,除⾮必要,否则应该尽量从列表尾部进⾏元素的增删操作。
因为列表的指针使⽤的是连续内存空间存储-元素不是,所以耗内存。
list可以进⾏的操作有:
(1):⽤len()函数可以获得list元素的个数
(2):⽤索引来访问list中每⼀个位置的元素,记得索引是从0开始的。
⽐如classmates[0].
还可以⽤-1做索引,直接获取最后⼀个元素。⽐如classmates[-1] 以此类推,可以获取倒数第2个、倒数第3个。
当索引超出了范围时,Python会报⼀个IndexError错误,所以,要确保索引不要越界,记得最后⼀个元素的索引是len(classmates) - 1
(3): ⽤append()函数往list中追加元素到末尾
(4):⽤insert()函数把元素插⼊到指定的位置。
⽐如 classmates.insert(1, 'Jack'),是指在索引为1的地⽅插⼊数据。
(5):⽤pop()⽅法删除list末尾的元素
要删除指定位置的元素,⽤pop(i)⽅法,其中i是索引位置
(6): 要把某个元素替换成别的元素,可以直接赋值给对应的索引位置
>>> classmates[1] = 'Sarah'>>> classmates['Michael', 'Sarah', 'Tracy']
4.2 元组tuple:
tuple特征:
tuple和list⾮常类似,但是tuple⼀旦初始化就不能修改. 因为tuple不可变,所以代码更安全。如果可能,能⽤tuple代替list就尽量⽤tuple。
tuple的定义⽤圆括号 (), list的定义⽤⽅括号[]
tuple操作:
(1):⽤len()函数可以获得list元素的个数
(2):⽤索引来访问list中每⼀个位置的元素,记得索引是从0开始的。
tuple不能变,它也没有append(),insert()这样的⽅法。其他获取元素的⽅法和list是⼀样的,你可以正常地使⽤
classmates[0],classmates[-1],但不能赋值成另外的元素。
tuple的陷阱:
(1):定义只有⼀个元素的tuple的时候,记得加上逗号。 因为括号()既可以表⽰tuple,⼜可以表⽰数学公式中的⼩括号,如果没有逗号,则会认为是数学公式的⼩括号,计算结果⾃然是1。 ⽐如:定义只有⼀个元素1的tuple,应该是 t = (1,)
(2):tuple变成“可变”了:
⽐如下⾯的代码,tuple⾥⾯的list的值变了。其实 表⾯上看,tuple的元素确实变了,但其实变的不是tuple的元素,⽽是list的元素。tuple ⼀开始指向的list并没有改成别的list.
所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向⼀个list,就不能改成指向其他对象,但指向的这个list本⾝是可变的!
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t('a', 'b', ['X', 'Y'])
4.3 字典dict:
dict全称dictionary,在其他语⾔中也称为map,使⽤键-值(key-value)存储,具有极快的查速度。
表⽰:d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
dict特征:
(1):为什么dict查速度这么快?因为dict的实现原理和查字典是⼀样的。假设字典包含了1万个汉字,我们要查某⼀个字,⼀个办法是把字典从第⼀页往后翻,直到到我们想要的字为⽌,这种⽅法就是在li
st中查元素的⽅法,list越⼤,查越慢。
第⼆种⽅法是先在字典的索引表⾥(⽐如部⾸表)查这个字对应的页码,然后直接翻到该页,到这个字。⽆论哪个字,这种查速度都⾮常快,不会随着字典⼤⼩的增加⽽变慢。dict就是第⼆种实现⽅式。
(2):由于⼀个key只能对应⼀个value,所以,多次对⼀个key放⼊value,后⾯的值会把前⾯的值冲掉
(3):如果key不存在,dict就会报错。
要避免key不存在的错误,有两种办法,
⼀是通过in判断key是否存在
>>> 'Thomas' in dFalse
⼆是通过dict提供的get()⽅法,如果key不存在,可以返回None,或者⾃⼰指定的value:
>>> d.get('Thomas')
>>> d.get('Thomas', -1)-1
(4): dict内部存放的顺序和key放⼊的顺序是没有关系的
(5):dict的key必须是不可变对象, 这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。 要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放⼼地作为key。⽽list是可变的,就不能作为key。
(6): 和list⽐较,dict有以下⼏个特点:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论