内置序列类型    

  Python 标准库用 C 实现了丰富的序列类型,列举如下。
  容器序列
    list、tuple 和 collections.deque 这些序列能存放不同类型的数据
  扁平序列
    str、bytes 和 array.array,这类序列只能容纳一种类型
    容器序列存放的是它们所包含的任意类型的对象的引用,而扁平序列里存放的是值而不是引用。
换句话说,扁平序列其实是一段连续的内存空间。
由此可见扁平序列其实更加紧凑,但是它里面只能存放诸如字符、字节和数值这种基础类型。
序列类型还能按照能否被修改来分类。
可变序列
  list、bytearray、array.array、collections.deque 和 memoryview。 不可变序列
  tuple、str 和 bytes

  

     列表推导和生成器表达式     

列表推导是构建列表(list)的快捷方式,
而生成器表达式则可以用来创建其他*任何类型*的序列
res = [
(i, j, k)
for i in range(10) # 也可以只有一层循环, 对应好参数
for j in range(10, 20)
for k in range(20, 30)
] res = (
(i, j, k)
for i in range(10) # 也可以只有一层循环, 对应好参数
for j in range(10, 20)
for k in range(20, 30)
)

e.g.

filter 和 map 合起来能做的事情,列表推导也可以做,而且还不需要借助难以理解和阅 读的 lambda 表达式。

symbols = '$¢£¥€¤'
beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]
# beyond_ascii # == [162, 163, 165, 8364, 164] beyond_ascii_ = list(filter(lambda c: c > 127, map(ord, symbols)))
# beyond_ascii_ # == [162, 163, 165, 8364, 164]

用列表推导和 map/filter 组合来创建同样的表单

虽然也可以用列表推导来初始化元组、数组或其他序列类型,但是生成器表达式是更好的选择。
这是因为生成器表达式背后遵守了迭代器协议,可以逐个地产出元素,而不是先建立一个完整的
列表,然后再把这个列表传递到某个构造函数里。前面那种方式显然能够节省内存。
# 如果生成器表达式是一个函数调用过程中的唯一参数,那么不需要额外再用括号把它围起来。
def xxx(x):
for i in x:
print(i) xxx(i for i in range(10))

     元组     

有名元组:
collections.namedtuple 是一个工厂函数,它可以用来构建一个带字段名的元组和
一个有名字的类——这个带名字的类对调试程序有很大帮助
from collections import namedtuple

City = namedtuple("City", "name position aaa bbb xxx")
city = City("tokyo", 1, 2, 3, 4)
print(city)
print(city.name)

元组拆包:

元组其实是对数据的记录:元组中的每个元素都存放了记录中一个字段的数据,
外加这个字段的位置。正是这个位置信息给数据赋予了意义。
traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]

for i in traveler_ids:
print('%s-%s' % i)
用*接收不定长元素
a, *b = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]
print(a)
print(b)

切片:

  在 Python 里,像列表(list)、元组(tuple)和字符串(str)这类序列类型都支持切 片操作,但是实际上切片操作比人们所想象的要强大很多。

  在切片和区间操作里不包含区间范围的最后一个元素是 Python 的风格,这个习惯符合 Python、C 和其他语言里以 0 作为起始下标的传统。

当只有最后一个位置信息时,我们也可以快速看出切片和区间里有几个元 素:range(3) 和 my_list[:3] 都返回 3 个元素。
当起止位置信息都可见时,我们可以快速计算出切片和区间的长度,用后一个数减去 第一个下标(stop - start)即可。
这样做也让我们可以利用任意一个下标来把序列分割成不重叠的两部分,只要写成 my_list[:x] 和 my_list[x:] 就可以了。

切片和区间忽略最后一个元素

>>> lst = list(range(10))
>>> lst
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
SyntaxError: invalid syntax
>>> lst[1:3] = [11, 33]
>>> lst
[0, 11, 33, 3, 4, 5, 6, 7, 8, 9]
>>> lst[3:5] = [3355]
>>> lst
[0, 11, 33, 3355, 5, 6, 7, 8, 9]
>>> del lst[5:]
>>> lst
[0, 11, 33, 3355, 5]

给切片赋值

    数组    

如果我们需要一个只包含数字的列表,那么 array.array 比 list 更高效。数组支持所 有跟可变序列有关的操作,
包括 .pop、.insert 和 .extend。另外,数组还提供从文件读取和存入文件的更快的方法,如 .frombytes 和 .tofile。
from array import array
from random import random
floats = array('d', (random() for i in range(10**7))) # 利用一个可迭代对象来建立一个双精度浮点数组(类型码是 'd'),这里我们用的可 迭代对象是一个生成器表达式
floats[-1]
0.5749946228902657
fp = open('floats.bin', 'wb')
floats.tofile(fp)
fp.close()
floats2 = array('d') # 新建一个双精度浮点空数组
fp = open('floats.bin', 'rb')
floats2.fromfile(fp, 10**7)
fp.close()
floats2[-1]
0.5749946228902657

另外一个快速序列化数字类型的方法是使用pickle,pickle.dump 处理浮点 数组的速度几乎跟 array.tofile 一样快。不过前者可以处理几乎所有的内置数字 类型,包含复数、嵌套集合,甚至用户自定义的类。前提是这些类没有什么特别复杂 的实现。

从 Python 3.4 开始,数组类型不再支持诸如 list.sort() 这种就地排序方法。要给 数组排序的话,得用 sorted 函数新建一个数组。

参考《流畅的python》

数字&字符串的更多相关文章

  1. JAVA将数字字符串强制转换成整型变量----求参数之和实验代码(附流程图)

    一.设计思想 先将参数个数输出,并利用循环结果将参数逐个输出,再将字符串强制转化成整型,利用循环结构相加求和 二.程序流程图 三.源程序代码 package demo; public class Co ...

  2. js如何将纯数字字符串转换为long型

    1.js如何将纯数字字符串转换为long型? js 中 int的存储位数?最大十进制数表示是多少? 精度http://www.jb51.net/article/59808.htm 整数(不使用小数点或 ...

  3. double类型字符串转换成一个纯数字字符串和一个小数点位数的c++代码

    今天工作中遇到一个要不一个double型的字符串转换成一个纯字数字符串和一个标志这个数字字符串的小数点有几位的int类型 例如:“23.123”--->“23123” + 3   比较简单.就是 ...

  4. 基于visual Studio2013解决面试题之0503取最大数字字符串

     题目

  5. 在js中做数字字符串加0补位,效率分析

    分类: Jquery/YUI/ExtJs 2010-08-30 11:27 2700人阅读 评论(0) 收藏 举报 functiondate算法语言c 通常遇到的一个问题是日期的“1976-02-03 ...

  6. java数字字符串累加1的解决方案

    近期操作项目遇到这样的问题,研究了下搞出了一个解决方案. //num也可以是在数字字符串里面截取的,比如我有14位的数字字符串前六位是市级,7,8位代表县区,后两位代表乡镇,最后四位是累计+1的,这个 ...

  7. C# 设置Excel中的数字字符串格式

    在Excel中,数字字符串用不同格式表示,可代表不同数据意义.例如在财务报表里需要用特定的数字字符串格式来反映金额信息.货币币种.数据精确程度.增减趋势等等.下面分享如何通过C#编程来设置Excel表 ...

  8. is_numeric — 检测变量是否为数字或数字字符串

    is_numeric — 检测变量是否为数字或数字字符串 bool is_numeric ( mixed $var ) 如果 var 是数字和数字字符串则返回 TRUE ,否则返回 FALSE . 参 ...

  9. C#学习-图解教程(1):格式化数字字符串

    学习内容:C#:学习书籍:图解教程(中文第四版). 目录:第二章 C#编程概述 -----> 2.7 从程序中输出文本 -----> 2.7.5格式化数字字符串 using System; ...

  10. PHP is_numeric 检测变量是否为数字或数字字符串

    bool is_numeric ( mixed $var ) 如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE. For example 1: <?php $v = is_ ...

随机推荐

  1. native.js 判断是否安装某app

    例:是否安装微信 function isWeixin() { var UIApplication = plus.ios.importClass("UIApplication"); ...

  2. CSS3 之转动的风车

    js 可以做动画,但是需要写很多代码:其实css也是可以做动画的,而且比js写的代码还少,理解也相对简单. 这里用到css3 的animation 属性,它配合着 @keyframes 规则来使用,可 ...

  3. HttpURLConnection 添加代理

    //创建代理服务器 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("www.proxyaddress.com& ...

  4. 22.多线程.md

    目录 1.线程的创建和启动 1.1继承Thread类创建线程 1.2继承Runnable接口实现创建线程 1.3使用Callable和Future创建 2.控制线程 2.1 Thread类的join方 ...

  5. 使用__all__限制模块可被导入对象

    经常我们会编写自定义模块,用于被别的脚本调用;有时候为了方便,会使用from module_name import *的方式导入,这样会把模块中全部对象导入进来; 使用__all__结合列表,可以控制 ...

  6. 我理解的BFC(块级格式化上下文)

    BFC(Block formatting context) 直译为"块级格式化上下文". BFC它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Bl ...

  7. C++ : 窗口变化相关消息 OnSize、OnSizing和OnGetMinMaxInfo,onsizeonsizing

    个消息分别是:WM_SIZE.WM_SIZING.WM_GETMINMAXINFO:分别对应相应的处理函数:OnSize.OnSizing.OnGetMinMaxInfo. 当窗口大小发生变化时,响应 ...

  8. 吴裕雄 11-MySQL查询数据

    以下为在MySQL数据库中查询数据通用的 SELECT 语法:SELECT column_name,column_nameFROM table_name[WHERE Clause][LIMIT N][ ...

  9. js高级-浏览器事件循环机制Event Loop

    JavaScript 是队列的形式一个个执行的 同一时间只能执行一段代码,单线程的  (队列的数据结构) 浏览器是多线程的 JavaScript执行线程负责执行js代码 UI线程负责UI展示的 Jav ...

  10. 立个FLAG

    今天再次初步浏览了寒假生活: 三篇阅读笔记(人月神话,梦断代码,程序员修炼之道:从小工到专家),2月24日之前发表开发记账本软件,连续七天以上发表开发进度 学会使用GitHub,录制抖音(父母评价作品 ...