python是谁_python的内置类型

字符串与字节

python2中用str表示字节字符串,这种类型现在在Python3中用bytes对象来处理,明确区分字符串与字节

python3中只有一种能够保存文本信息的数据类型,就是str,它是不可变序列,保存的是Unicode码位

bytes以及可变的bytearray与str不同,只能用字节作为序列值,即0<=x<=256范围内的整数。例如

>>>print(bytes([102,111,111]))

b'foo'

对于bytes和bytearray,在转换为另一种序列类型(如list或tuple)时可以显示其本来面目:例如:

>>>list(b'foo bar')

[102,111,111,32,98,97,114]

>>>tuple(b'foo bar')

(102,111,111,32,98,97,114)

从python3开始,所有没有前缀的字符串都是Unicode。因此,所有用单引号,双引号或成组的3个引号包围且没有前缀的值都表示str数据类型:

>>>type("some string")

在python2中,Unicode需要有前缀(例如u"some string")。从python3.3开始,为保证向后兼容,仍然支持这个前缀,但它在python3中没有任何语法上的意义。

字节的明确语法:字节也被单引号,双引号或三引号包围,但必须有一个b或B前缀。

字符串拼接

python中字符串是不可变的,拼接任意多个字符串时在内存中会产生一个新的序列对象:比如

s=""

for substring in substrings:

s += substring

字符串s通过多次拼接来创建一个新字符串,但是这中创建方式效率极低。幸好python为我们提供了str.join()方法。它接受一个可迭代字符串为参数。因为它是一个方法,实际调用时利用空字符串来调用,参数为需要拼接的迭代字符串

s="".join(substrings)

join方法还可以在需要合并的多个字符串之间插入分隔符

','.join(['a','b','c','d'])

'a,b,c,d'

虽然join方法速度更快,但并不是所有需要拼接字符串的情况下都使用该方法。在下面几种情况下,join的性能可能还不如利用加法的普通拼接

字符串的数量很少,而且已经存在在某个可迭代对象中时,加法性能会超过join

比较短的字符串,编译时会被转换为更短的形式:如‘a’+'b'+'c' 在编译时被转换为‘abc’

事先知道字符串的数目,可以用字符串格式化str.format()方法或%运算符,此时该format()为最佳方法

集合类型

python内置集合类型有:列表(list),元组(tuple),字典(dictionary),集合(set)

python中组基本的两种集合类型list和tuple,他们都是对象序列,列表时动态的,大小可变更,元组是不可变的,一旦创建就无法修改,因此也是可哈希(hashtable)的,即可作为字典中的key

列表推导

我们都值都,编写这样的代码时痛苦的

681362-20190518175019203-1783118600.png

这种方法可能适用与C语言,但在python中的实际运行速度很慢,有以下原因:

解释器在每次循环中都需要判断序列中的那一部分需要修改

需要用一个计数器来跟踪需要处理的元素

由于append()时一个列表方法,所有每次遍历时都需要额外执行一个查询函数

列表推导就是为了解决这个问题,它使用编排好的功能对上述语句的一部分做了自动化处理:

681362-20190518175457206-229019604.png

这种写法更加高效简短,也意味着更少的错误,更容易阅读和理解

创建列表的其他方法(习语)

python习语的另一个典型例子就是使用enumerate(枚举)。在循环中使用列表时,这个内置函数可以很方便的获取其索引,列如:

681362-20190518180123681-424940475.png

它可以替换为下面这段更短的代码:

681362-20190518180247428-16797775.png

如果需要一个一个合并多个列表(或任意可迭代对象)中的元素,那么可以使用内置的zip()函数。

681362-20190518180844055-770022735.png

注意:对zip函数返回的结果再次调用zip,可以将其恢复原状

681362-20190518181136873-285043891.png

另外一种常见的语法元素是序列解包。这种方法适用与任意序列类型(列表,元组,字符串,字节序列等)。只要赋值运算符左边的变量和右边的元素数目相等,你都可以用这种方法将元素序列解包到另一边的变量中:

681362-20190518181841884-178908900.png

解包还可以利用带*的表达式获取单个变量中的多个元素,只要它的解释没有歧义即可。还可以对嵌套序列进行

loading.gif解包。下面是一些更复杂的解包实例:

带*的表达是可以获取序列剩余部分

681362-20190518182148313-1054509659.png

带*的表达是可以获取序列的中间部分

681362-20190518182320316-1807206098.png

嵌套解包

681362-20190518182437212-365832130.png

字典

字典可以用和前面列表推导类似的推导来创建一个新的字典。如:

681362-20190518211037570-448466918.png

重要的是,使用字典推导具有与列表推导相同的优点,因此字典推导要更加高效,更加简短,更加简洁。

字典的keys(),values()和items()3个方法的返回值类型不再是列表,并且与之对应的iterkeys(),itervluae()和iteritems()本来返回的是迭代器,python3中已经没有这三个方法。python3中keys(),vlaues()和items()返回的是视图对象(view objects)

681362-20190518213552031-1597420023.png

keys():返回dict_keys对象,查看字典的所有键

values():返回dict_values对象,查看字典的所有值

items():返回dict_items对象,查看字典所有的(key,value)二元组

视图对象可以动态查看字典的内容,因此每次字典发生变化时,视图都会相应的变化:

681362-20190518212207162-2050220442.png

获取字典长度使用len(len(words)),测试元素是否包含其中使用in子句

在keys和values方法返回的视图中,键和值的顺序时完全对应的。但在python2中,如果你想要保证获取的键和值顺序完全一致,需要在两次函数调用之前不能修改字典内容

字典的键必须时可哈希(hashable)的(可哈希:一个对象有一个整个生命周期值不变的散列值,并且可以和其他对象进行比较),python所有不变的类型都是可哈希的,可变类型(列表,字典和集合)是不可哈希的

字典是无序的,但是python标准库的collections模块提供了名为OrderedDict的有序字典

集合(Set)

集合是一种很棒的数据结构,它与数学中的集合概念类型,有交集,并集等概念

Python的内置集合类型有两种:

set():可变的,无序的,有限的集合,其元素是唯一的,不可变的对象,集合中的元素必须是可哈希的

frozenset():不可变的,可哈希的,无序的集合,其元素是唯一的,不可变的对象,在一个set()或frozenset()中不能包含另一个普通的可变set(),会抛异常TypeError

681362-20190518214802777-2055707338.png

下面这种集合初始化的方法是完全正确的:

681362-20190518214943888-102768449.png

创建可变集合有三种方法:

调用set(),选择性地接受可迭代对象作为初始化参数,例如set([0,1,2])

使用集合推导,例如:{element for element in range(3)}.

使用集合字面值,例如{1,2,3}

注意:空的集合对象是没有字面值的。空的花括号{}表示的是空的字典字面值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值