数字&字符串
内置序列类型
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》
数字&字符串的更多相关文章
- JAVA将数字字符串强制转换成整型变量----求参数之和实验代码(附流程图)
一.设计思想 先将参数个数输出,并利用循环结果将参数逐个输出,再将字符串强制转化成整型,利用循环结构相加求和 二.程序流程图 三.源程序代码 package demo; public class Co ...
- js如何将纯数字字符串转换为long型
1.js如何将纯数字字符串转换为long型? js 中 int的存储位数?最大十进制数表示是多少? 精度http://www.jb51.net/article/59808.htm 整数(不使用小数点或 ...
- double类型字符串转换成一个纯数字字符串和一个小数点位数的c++代码
今天工作中遇到一个要不一个double型的字符串转换成一个纯字数字符串和一个标志这个数字字符串的小数点有几位的int类型 例如:“23.123”--->“23123” + 3 比较简单.就是 ...
- 基于visual Studio2013解决面试题之0503取最大数字字符串
题目
- 在js中做数字字符串加0补位,效率分析
分类: Jquery/YUI/ExtJs 2010-08-30 11:27 2700人阅读 评论(0) 收藏 举报 functiondate算法语言c 通常遇到的一个问题是日期的“1976-02-03 ...
- java数字字符串累加1的解决方案
近期操作项目遇到这样的问题,研究了下搞出了一个解决方案. //num也可以是在数字字符串里面截取的,比如我有14位的数字字符串前六位是市级,7,8位代表县区,后两位代表乡镇,最后四位是累计+1的,这个 ...
- C# 设置Excel中的数字字符串格式
在Excel中,数字字符串用不同格式表示,可代表不同数据意义.例如在财务报表里需要用特定的数字字符串格式来反映金额信息.货币币种.数据精确程度.增减趋势等等.下面分享如何通过C#编程来设置Excel表 ...
- is_numeric — 检测变量是否为数字或数字字符串
is_numeric — 检测变量是否为数字或数字字符串 bool is_numeric ( mixed $var ) 如果 var 是数字和数字字符串则返回 TRUE ,否则返回 FALSE . 参 ...
- C#学习-图解教程(1):格式化数字字符串
学习内容:C#:学习书籍:图解教程(中文第四版). 目录:第二章 C#编程概述 -----> 2.7 从程序中输出文本 -----> 2.7.5格式化数字字符串 using System; ...
- PHP is_numeric 检测变量是否为数字或数字字符串
bool is_numeric ( mixed $var ) 如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE. For example 1: <?php $v = is_ ...
随机推荐
- sublime text3:下载代码格式化插件和汉化插件
1.从官网下载sublime text3 2.下载插件工具 A.使用Ctrl+`(Esc键下方)快捷键或者通过View->Show Console菜单打开命令行 将以下代码复制后粘贴,然后按En ...
- Oracle数据库安装指南
文档使用声明 1.安装指导仅限测试环境(非生产环境)安装使用,生产环境oracle数据库建议按公司要求安装. 安装环境 1.SuSE10/SuSE11(64位) + Oracle11gR2 工具和安装 ...
- monkey压力测试
压力测试: monkey -p com.qihu360.mobilesafe -v -p 后面跟包名 : -v 后面跟次数: 通过观察log日志,查看应用中出现的问题. =============== ...
- MySQL查询提示
MySQL查询提示: 1.LOW_PROPRITY,HIGHT_PRIORITY 作用:指定sql语句的运行优先级,会将加了HIGHT_PROPRITY提示的sql调度到表访问队列的最前面 限制:仅对 ...
- 4.HTTP入门.md
目录 什么是http协议 http协议:对浏览器客户端 和 服务器端 之间数据传输的格式规范 查看http协议的工具* 使用火狐的firebug插件(右键->firebug->网络) Ht ...
- 吴裕雄 python神经网络 水果图片识别(4)
# coding: utf-8 # In[1]:import osimport numpy as npfrom skimage import color, data, transform, io # ...
- 学JS的心路历程-正规表达式Regular Expression
今天我们来看正规表达式,在谈到为什么需要多学这个之前,先来看个示例. 假设需要判断输入字串是否含有“apple”: var text=“A apple a day keeps the doctor a ...
- js基础-数组及数据类型
数组也是引用类型 构造函数创建数组 Object 构造函数类型(所有类型基类) Array 构造函数类型 求幂运算符 ** 2**32-1 数组容量最大 arry.length 如果减小len ...
- FTP 站点及配置
新建FTP站点根据导航步骤一步步来即可. windows server 2008 中ftp的部署以及防火墙的配置 部署环境:Windows Server Enterprise 2008 R2 64b ...
- 03_java基础(六)之CRUD实现
1.简单实现 package com.day01.station.dao; /** * Created by Administrator on 2018/2/1. */ import java.sql ...