python 基本数据类型梳理


pyhton 基本数据类型:数值(Numbers),包括整型、浮点型、复数、布尔型

                                         字符串(String)

                                         元组(Tuple)

                                         列表(List)

                                         字典(Dictionaries)

                                         集合(set)

前三个是不可变数据类型,后三个是可变数据类型


数值(Numbers)

     361   -65                         #整型 int()

     3.64  62.1e-4 0.0          #浮点型  float()

     3+8j  3.0+6.0j               # 复数  complex([real],[,imag])

     0b101010                     # 二进制  bin()

     0o173                            #八进制   oct()

     0x9ff                               # 十六进制 hex()  

   其他进制转十进制使用int(),   十进制转二进制、八进制、十六进制使用bin() oct() hex()

>>> int(0b101010)
42
>>> bin(42)
'0b101010'
>>> int(0o173)
123
>>> oct(123)
'0o173'
>>> int(0x9ff)
2559

>>> hex(2559)
'0x9ff'

  常见操作有: +  -  *  /   //   %  **        #  /结果是浮点数  //结果取整数部分   %取余数    **指数运算     

>>> 3/2
1.5
>>> 3//2
1

>>> 5%2
1
>>> 6%4
2
>>> 9%3
0
>>> 2**3
8
>>> 3**2
9

布尔型:调用bool()可以检查变量的为True或False

>>> bool(0)
False
>>> bool("")
False
>>> bool(" ")
True
>>> bool(0.00)
False
>>> bool(None)
False
>>> bool(set())
False
>>> bool(bool())
False

if语句通过判断布尔类型来控制程序的执行路径,在python中数据有隐式的真假值,如下



  字符串(String)

      在python中定义一个字符串s="python",它在计算机中的执行顺序是先在内存中创建一个字符串python,然后在程序栈寄存器中创建一个变量s,最后把python的地址赋给s,根据这个过程,我们知道对s的操作只会影响s的引用,不会改变原来的字符串,所以说字符串是不可变数据类型

 字符串的切片  [start:end:step]  结果包含start,而不包含end

>>> s="优雅的python"
>>> s[0]
'优'
>>> s[-1]
'n'
>>> s[3:]
'python'
>>> s[::-1]
'nohtyp的雅优'

>>> s[1:2:1]
'雅'

 字符串的替换           

>>> s.replace("python","javascript")
'优雅的javascript'
>>> s
'优雅的python'            #s.replace   得到的结果可以赋给另个变量,它指向结果,而原来的字符串没有改变       


   还有 find  index upper  startwith  count  isalnum等方法

s.find('P')			# 3, 返回第一次出现的子串的下标
s.find('h', 2)			# 6, 设定下标2开始查找
s.find('23333')			# -1, 查找不到返回-1
s.index('y')			# 4, 返回第一次出现的子串的下标
s.index('23333')		# 不同与find(), 查找不到会抛出异常
# 转大小写, upper()、lower()、swapcase()、capitalize()、istitle()、isupper()、islower()
s.upper()			# '优雅的PYTHON'
s.swapcase()			# '优雅的pYTHON', 大小写互换
s.istitle()			# True
s.islower()			# False
# 去空格,strip()、lstrip()、rstrip()
# 格式化
s1 = '%s %s' % ('Windrivder', 21)	# 'Windrivder 21' 
s2 = '{}, {}'.format(21, 'Windridver')	# 推荐使用format格式化字符串
s3 = '{0}, {1}, {0}'.format('Windrivder', 21)  #Windrivder, 21, Windrivder
s4 = '{name}: {age}'.format(age=21, name='Windrivder')
# 连接与分割,使用 + 连接字符串,每次操作会重新计算、开辟、释放内存,效率很低,所以推荐使用join
l = ['2017', '03', '29', '22:00']
s5 = '-'.join(l)			# '2017-03-29-22:00'
s6 = s5.split('-')			# ['2017', '03', '29', '22:00']
# 还有一些常用的,这里只列出来
S.endswith() 			# 字符串是否以给定字符串结尾
S.startswith() 			# 字符串是否以给定字符串开始
S.isalnum() 			# 是否全是字母和数字
S.isalpha() 			# 是否全是字母
S.isspace()   			# 是否全是空白字符
S.center(width, [fillchar]) 	# 中间对齐
S.ljust(width,[fillchar]) 	# 左对齐,默认是空格补全
S.rjust(width,[fillchar]) 	# 右对齐
S.count(substr, [start, [end]])# 计算substr在S中出现的次数
S.splitlines([keepends]) 	# 按行分割成list,keepends是一个bool值,如果为真每行后而会保留行分割符。
        字符串编码问题:

  1. ASCII 编码出现最早,只有大小写英文字母、数字和一些符号等127个字符,为了实现多语言表示,如中文的GB2312编码,日文的Shift_JIS编码等,Unicode 孕育而生,它将所有语言都统一到一套编码中;

  2. 在 Python3 中所有字符串在内存中均是 Unicode 保存;

  3. 当需要将文件保存到外设或进行网络传输时,就要进行编码转换,将字符转换为字节,以提高效率

# encode 将字符转换为字节
>>> str = '优雅的Python'                                                   
>>> str.encode()			# 默认编码是 UTF-8
b'\xe4\xbc\x98\xe9\x9b\x85\xe7\x9a\x84Python'
>>> str.encode('gbk')                                                      
b'\xd3\xc5\xd1\xc5\xb5\xc4Python'
# decode 将字节转换为字符
>>> b'\xe4\xbc\x98\xe9\x9b\x85\xe7\x9a\x84Python'.decode()
'优雅的Python'
>>> b'\xd3\xc5\xd1\xc5\xb5\xc4Python'.decode('gbk')
'优雅的Python'

在 Python3 中,内存中的 Unicode 字符用 str 对象表示,对应于的,Python3 使用了一种全新的数据类型来表示字节,就是 bytes,所以 encode 转换后的字节流就不是 str 对象,而是 bytes 字节对象,它当然支持分片、索引、基本数值运算等操作,但 str 与 bytes 类型的数据不能进行+操作。

来看看 bytes 数据类型的定义:

>>> byt = b'优雅的Python'
  File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.
>>> byt = b'Python'
>>> type(byt)
<class 'bytes'>

从上述例子中可以看出 bytes 对象不能由超出 ASCII 码范围的字符组成,只接受 ASCII 码这个范围的字符。

>>> u'a'
'a'
>>> '\u0061'
'a'
>>> '中'.encode('unicode-escape')
b'\\u4e2d'
>>> b'@Aa'
b'@Aa'
>>> b'\x40\x41\x61'
b'@Aa'
>>> #-*- coding:utf-8 -*-
... 
>>> 

同样,从上面的例子我们还可以总结出一些坑爹的东西:

  1. Unicode 码在 Python3 中有两种表示方式,u'字符串'和\u四位十六进制数;

  2. 将字符直接以 Unicode 码保存使用unicode-escape

  3. 在 Python 的交互式环境中,输出 bytes 对象时,可按 ASCII 码表示,或按十六进制\x表示

  4. 在 Python 头声明#-*- coding:utf-8 -*-,是告诉 Python 编译器按utf-8的方式读取,这个声明并不能将 Python 文件本身保存成utf-8,这时候需要借助文本编辑器保存文件编码。   


元组(Tuple)

元组与列表不同的是,元组是不可变类型(immutable),不能对元素进行修改,但内存可以明确知道需要分配多少空间给元组

# 定义
t = ()
t = tuple()
t = (1,)          # 定义一个元素时,需要与(1)-->int区分开 
t = ('Windrivder', 21, {'name': 'xiaoming'})

# 没有列出更多的方法,可以使用 tuple.__dir__() 查看
t.index(21)		  # 1


列表(List)

Python 可使用语法糖[]表示列表,其中的元素可以是任何类型,以顺序存储的方式动态储存数据:

# 定义
L = []		# 推荐方式
L = list()
L = ['Windrivder', 21, {'name': 'xiaoming'}]
# 多重赋值技巧
name, age, other = L
# 列表切片参考str
# 常用方法
L.append('a')			# ['Windrivder', 21, {'name': 'xiaoming'}, 'a']
L.pop()					# ['Windrivder', 21, {'name': 'xiaoming'}],还可以指定下标删除元素
L.extend(L1)			# 合并列表 L1
L.insert(1, 'a')		# 在下标为1的位置插入'a'
L.index('a')			# 同字符串的index()
L.remove('a')			# 删除操作
L.count('a')			# 求某个值的个数
L.reverse()			# 反转
L = [2, 4, -1, 9, -5, 6]
L.sort()			# sort()排序,使用非常灵活
L.sort(reverse=True)	        # 反序
L.sort(key=abs)			# 传入函数关键字作为排序规则
for l1, l2 in zip(['windrivder', 21], ['jack', 22]):	# zip 同时遍历两个列表
    print('{} --> {}'.format(l1, l2))
for index, value in enumerate(L):						# enumerate 带索引遍历列表
    print('{} --> {}'.format(index, value))

# 列表生成式
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
r = [sum(L) for l in L]							# [6, 15, 24]
L = [a for a in range(0, 10) if a % 2 == 0]	# [0, 2, 4, 6, 8]

字典(Dictionaries)

字典是通过键值对的方式进行存储,占用大量的内存而获得极快的查找和插入速度,而列表刚好相反,查找和插入速度随着元素的增加而变慢,但占用的内存较小。字典虽然是可变类型,但因为它的 value 的位置是根据 key 计算出来的,因此 key 必须是不可变对象,这样才能确保字典的正确使用。

# 定义
d = {}
d = {'windrivder': 21, 'other': {'jack': 22}}   # 嵌套字典
d = dict(name='windrivder', age=21)
d = dict([('name', 'windrivder'), ('age', 21)]) # {'name': 'windrivder', 'age': 21}
d = dict(zip(['name', 'age'], ['windrivder', 21]))

# 常用方法
d.keys(), d.values(), d.items()	# 分别遍历键、值、键值对
d.setdefault(key[, value])		# 为字典的某一项设置默认值
d.get(key, default)			# 获取字典中的某个值
d.update(newd)				# 合并字典,此方式效率较高
d.pop(key, [d])                        # 删除字典中键值为key的项,返回键值为key的值,如果不存在,返回默认值d,否则抛出异常
d.popitem()				# 随机删除某一项键值对,还可以使用关键字 del

d = {k: v for (k, v) in zip(['name', 'age'], ['windrivder', 21])}

集合(Set)

集合与list类似,但集合中不允许有重复的元素,普通集合是可变的,Frozenset是不可变的,我们可以利用集合的特性消除重复元素或做并、交、差等数学操作

a = set()
b = set([1, 2, 3])
# 平时使用到的时候不多,所以没有列出
a.add(frozenset(b))

自定义数据类型

Python 允许通过继承去自定义数据类型,很多第三方库或框架都有类似的应用,这里简单实现了一个供参考:

class CustomDict(dict):
    '''Simple dict but support access as x.y style.'''

    def __init__(self, names=(), values=(), **kw):
        super(CustomDict, self).__init__(**kw)
        for k, v in zip(names, values):
            self[k] = v

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(
                r"'CustomDict' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值