在上一篇文章中,我们介绍了 Python 的异常和文件,现在我们介绍 Python 中的数据类型。

查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9979931.html

数据类型
None 类型
None 类型是 Python 的特殊类型,它是 NoneType 的对象类型,表示无值。该对象只有一个值 None。其它语言使用 null 来表示这个对象。
它不支持任何运算也没有任何内建方法。作为一个对象其布尔值为 False。除了和自己比较,None 和任何其他的数据类型比较永远返回 False

  1. >>> None == True
  2. False
  3. >>> None
  4. >>> print(None)
  5. None
  6. >>> None == None
  7. True
  8. >>>

如果函数没有清楚地声明返回值,则返回 None 对象。

  1. def func():
  2. print("I like Python!")
  3. temp = func()
  4. print(temp)

运行结果:

  1. >>>
  2. I like Python
  3. None
  4. >>>

字典
字典(Dictionaries)是 Python 中一个非常有用的内置数据类型。它不像列表一样通过数字索引来访问,字典当中的元素是通过键来存取。
字典是一个映射类型,在其它语言中被称为 map。字典用 {} 来标识,使用键 : 值 (key : value) 存储,具有极快的查找速度,使用 [] 语法来访问。

  1. sex = {"John":"F","Amy":"M","Echo":"F"}
  2. print(sex["Amy"])
  3. print(sex["John"])

运行结果:

  1. >>>
  2. M
  3. F
  4. >>>

访问不存在字典里的键值会导致 KeyError 异常。

  1. msg = {
  2. "name":"John",
  3. "sex":"M",
  4. "age":10,
  5. }
  6. print(msg["name"])
  7. print(msg["age"])
  8. print(msg["son"])

运行结果:

  1. >>>
  2. John
  3. 10

  4. KeyError: 'son'
  5. >>>

实际上字典能够存储任何类型的数据。

  1. 字典为空时的表现形式为 {}

只有不可变的对象可以用作字典的 key,不可变的对象是指那些不能更改的对象。到目前为止,我们遇到的唯一可变对象是列表和字典。可变对象做键值会触发 TypeError 异常。

  1. msg = {
  2. ['a','b','c']:"a to c"
  3. }

运行结果:

  1. >>>
    TypeError: unhashable type: 'list'
    >>>
  1. 正确使用字典非常重要,需要牢记字典的 key 必须是不可变对象。

字典方法

我们知道字典是可变对象,可以像列表一样,字典的键值存储的数值可以重新指派另外的值。

不同于列表的是,我们可以通过字典的键值存储数据,不管这个键存不存在字典里。

  1. msg = {
  2. "name":"John",
  3. "sex":"M",
  4. "age":10,
  5. }
  6. msg[2] = "Home"
  7. msg[8] = "Job"
  8. print(msg)

运行结果:

  1. {'name': 'John', 'sex': 'M', 'age': 10, 2: 'Home', 8: 'Job'}

要在字典里确定一个键是否存在词典里,你可以使用 in 语法。

  1. msg = {
  2. "name":"John",
  3. "sex":"M",
  4. "age":10,
  5. }
  6. print("name" in msg)
  7. print("job" in msg)
  8. print("age" in msg)

运行结果:

  1. >>>
  2. True
  3. False
  4. True
  5. >>>

我们还可以通过 get 的方法从字典里取数据,就像前面用 msg["name"] 这样的方法读取数据。与这种方法不同的是,当字典里没有该键值时 get 方法取回的值是 None,而不会触发 KeyError 异常。

  1. msg = {
  2. "name":"John",
  3. "sex":"M",
  4. "age":10,
  5. "Job":False,
  6. }
  7. print(msg.get("name"))
  8. print(msg.get(6))
  9. print(msg.get(123,"Not in dictionary!"))

运行结果:

  1. >>>
  2. John
  3. None
  4. Not in dictionary!
  5. >>>
  1. 我们还可以指定 get 方法的第二个参数,当键值在字典里不存在是会返回我们所指定的值。

下面代码运行结果是什么?

  1. msg = {
  2. 1:1,2:1,3:2,4:3,
  3. }
  4. print(msg.get(2,0) + msg.get(8,3))

运行结果:

  1. >>>
  2. 4
  3. >>>

元组

元组 (Tuples) 跟列表很像,但是元组不能提供列表类能够提供给你的很多功能。元组的一大特征就是不可变。

元组使用圆括号来创建。

  1. msg = ("Hello","World","!",)

你可以像访问列表一样,通过索引来访问元组。

  1. print(msg[1])

给元组的元素重新分配值会触发 TypeError 异常。

  1. msg[0] = "Thank"

运行结果:

  1. >>>
  2. TypeError: 'tuple' object does not support item assignment
  3. >>>
  1. 和列表字典一样,元组也能嵌套存储。

我们也可以不用圆括号就创建元组,通过逗号分割来确定元组的分组。

  1. msg = "Hello","World","!"
  2. print(msg[0])

运行结果:

  1. >>>
  2. Hello
  3. >>>

空元祖必须通过圆括号创建。

  1. empty = ()
  1. 尽管元组不能改变,但是运行速度快于列表。

列表切片

Python 为列表提供了高级特征切片 (Slice) 操作功能,大大弱化了获取一个列表区间的操作。切片操作通过两个索引数字中间用冒号分割来完成,返回从第一个数字索引到第二个数字索引的一个新列表。

  1. msg = [0,1,2,3,4,5,14,28,32]
  2. print(msg[2:5])
  3. print(msg[0:1])

运行结果:

  1. >>>
  2. [2, 3, 4]
  3. [0]
  4. >>>
  1. range 函数操作一样,包含第一个数字索引里的值,不包含第二个数字索引的值。

如果切片的第一个数字忽略,切片操作从 0 开始,如果切片的第二个数字缺失,切片操作直到列表尾部结束。

  1. msg = [0,1,2,3,4,5,14,28,32]
  2. print(msg[:5])
  3. print(msg[5:])

运行结果:

  1. >>>
  2. [0, 1, 2, 3, 4]
  3. [5, 14, 28, 32]
  4. >>>
  1. 切片操作同样可以作用于元组。

列表切片操作同样可以提供第三个参数,这一参数将被视为切片的步长 (Step) ,在默认情况下,步长大小为 1、

  1. msg = [0,1,2,3,4,5,14,28,32]
  2. print(msg[:2])
  3. print(msg[2:8:2])

运行结果:

  1. >>>
  2. [0, 1]
  3. [2, 4, 14]
  4. >>>
  1. [2:8:2] 将会取出列表从索引 2 开始直到索引 8 并且每隔 2 个取一个列表的元素。

索引操作也可以使用负数,在这种情况下,位置计数将从列表的末尾开始。

  1. msg = [0,1,2,3,4,5,14,28,32]
  2. print(msg[1:-1])

运行结果:

  1. >>>
  2. [1, 2, 3, 4, 5, 14, 28]
  3. >>>
  1. 如果步进使用负值,则切片操作将从后向前执行。
  2. 使用 [::-1] 切片是一种常见的方法来反转列表。

列表生成式
列表生成式即 List Comprehensions,是 Python 内置的非常强大却简单的可以用来创建列表的生成式。

  1. # a list comprehension
  2. cubes = [i**2 for i in range(5)]
  3. print(cubes)

运行结果:

  1. >>>
  2. [0, 1, 4, 9, 16]
  3. >>>

列表生成式同样可以包含 if 条件判断,一遍创建一个符合一定条件的列表。

  1. cubes = [i**2 for i in range(5) if i**2 % 2 ==0]
  2. print(cubes)

运行结果:

  1. >>>
  2. [0, 4, 16]
  3. >>>

通过列表生成式生成一个非常大的列表会引发 MemoryError 异常。

  1. even = [2*i for i in range(10**150)]

运行结果:

  1. >>>
  2. MemoryError
  3. >>>
  1. 这个问题我们可以通过 迭代器 来解决这个问题,迭代器将会在下一篇文章中讲到。

字符串格式化

我们经常会输出劣势 '尊敬的客户,您尾号xx的账户向xx公司完成xx交易,余额xx'之类的字符串,而 xxx 的内容都是根据变量变化的。
所以,需要一种简便的格式化字符串的方式。String 对象提供了一个 format 方法。

  1. # string formatting
  2. nums = [1,2,3]
  3. msg = "Numbers:{0} {1} {2}".format(nums[0],nums[1],nums[2])
  4. print(msg)

运行结果:

  1. >>>
  2. Numbers:1 2 3
  3. >>>
  1. 每一个参数对应字符串里相应的占位符 {}。使用数字的方式不仅可以交换参数的位置,甚至可以在字符串里面换位,比如 {5} 在最前面。

字符串格式化也可以用命名参数替换。

  1. msg = "{a},{b}".format(a=5,b=15)
  2. print(msg)

运行结果:

  1. >>>
  2. 5,15
  3. >>>

Python 还提供了另一种格式化的方法。这种格式化方式和 C 语言一致用 % 实现,举例如下:

  1. s = 'Hello,%s' % 'Python'
  2. print(s)
  3. s = 'Hi,%s,you have $%d' % ('man',100)
  4. print(s)

运行结果:

  1. >>>
  2. Hello,Python
  3. Hi,man,you have $100
  4. >>>

% 运算符就是用来格式化字符串的,下图是常见的占位符。

在字符串内部,%s 表示用字符串替换,%d表示用整数替换,有几个 %? 占位符,后面就跟几个变量或者值,顺序需要对应好。如果只有一个 %?,括号可以省略。

常用方法

字符串方法

Python 标准库内建一些常用的方法。
join - 用一个字符串作为分隔符连接字符串列表。
replace - 对字符串进行替换操作。
startswith - 字符串是否以另一个字符串开头。
endswith - 字符串是否以另一个字符串结束。
upperlower - 返回字符串以大写或小写的形式。
split - 切割字符串为列表。

  1. print(",".join(["man","and","boy"]))
  2. print("Hello me".replace("me","world"))
  3. print("This is a man".startswith("This"))
  4. print("This is a woman".endswith("woman"))
  5. print("this is a boy".upper())
  6. print("THIS IS A GIRL".lower())
  7. print("man,and,boy".split(","))

运行结果:

  1. >>>
    man,and,boy
  2. Hello world
  3. True
  4. True
  5. THIS IS A BOY
  6. this is a girl
  7. ['man', 'and', 'boy']
    >>>

数学方式
maxmin - 查找一组数里最大和最小的值。
abs - 绝对值。
round - 四舍五入
sum - 数字列表里数字的总和。

  1. print(max(9,8,7,4,5,2,1))
  2. print(min(1,2,3,4,0,-5))
  3. print(abs(-41))
  4. print(abs(32))
  5. print(sum([100,455,78,-584]))

运行结果:

  1. >>>
  2. 9
  3. -5
  4. 41
  5. 32
  6. 49
  7. >>>

列表方法
标准库提供了一些非常有用的函数,allany 函数为我们对列表进行条件判断提供了方便。函数 enumerate 也提供了另一种方式来遍历列表的方法。

  1. nums = [14,51,48,46,11]

  2. if all([i > 6 for i in nums]):
  3. print("All larger than 6")

  4. if any([i % 2 == 0 for i in nums]):
  5. print("At least on is even")

  6. for v in enumerate(nums):
  7. print(v)

运行结果:

  1. >>>
  2. All larger than 6
  3. At least on is even
  4. (0, 14)
  5. (1, 51)
  6. (2, 48)
  7. (3, 46)
  8. (4, 11)
  9. >>>

文本分析
现在我们来做学习一个文本分析的具体例子,我们来分析文本里每个字母出现的百分比。首先我们打开一个文件并读取内容。

  1. filename = input("Enter a filename: ")
  2. with open(filename) as f:
  3. msg= f.read()
  4.  
  5. print(msg)

运行结果:

  1. Enter a filename: test.txt
  2. I like Python!!!!!
  3. I like Python!!!!
  4. I like Python!!!
  5. I like Python!!
  6. I like Python!
  7. I like Python

下面代码用来统计一个字母出现在字符串的次数。

  1. def count_char(test,char):
  2. count = 0
  3. for c in test:
  4. if c == char:
  5. count += 1
  6. return count

这个函数接受两个参数,一个是字符串,一个是字母,返回字母出现在字符串的次数。现在我们可以打开文件调用它。

  1. filename = input("Enter a filename: ")
  2. with open(filename) as f:
  3. msg= f.read()
  4.  
  5. print(count_char(msg,'P'))

运行结果:

  1. >>>
  2. Enter a filename: test.txt
  3. 6
  4. >>>
  1. 字母 "P" 总共出现在文件里 6 次。

接下来就是统计每个字母出现在文件的百分比。

  1. for char in "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz":
  2. percent = 100 * count_char(msg,char) / len(msg)
  3. print("{0} - {1}%".format(char,round(percent,2)))

把所有的代码合并在一起运行。

  1. def count_char(content,char):
  2. count = 0
  3. for c in content:
  4. if c == char:
  5. count += 1
  6. return count
  7.  
  8. filename = input("Enter a filename: ")
  9. with open(filename) as f:
  10. msg= f.read()
  11.  
  12. print(count_char(msg, 'P'))
  13. for char in "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz":
  14. percent = 100 * count_char(msg,char) / len(msg)
  15. print("{0} - {1}%".format(char,round(percent,2)))

运行结果:

  1. >>>
  2. Enter a filename: test.txt
  3. 6
  4. A - 0.0%
  5. a - 0.0%
  6. B - 0.0%
  7. b - 0.0%
  8. C - 0.0%
  9. c - 0.0%
  10. ...
  11. H - 0.0%
  12. h - 6.0%
  13. I - 6.0%
  14. i - 6.0%
  15. J - 0.0%
  16. ...
  17. >>>

“今年的我们已与去年不同,我们的爱人亦是如此,如果变化中的我们依旧爱着那个变了的另一半,那是幸运所致。”   

                                      -- 毛姆(英国小说家/故事圣手)

Python学习手册之数据类型的更多相关文章

  1. [python学习手册-笔记]002.python核心数据类型

    python核心数据类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明 ...

  2. 《Python学习手册》(二)

    <Python学习手册>(二) --类型和运算 数字 十六进制 八进制 二进制 0x 0o 0b hex() oct() bin() >>>int('10',2) 2 & ...

  3. 《Python学习手册 第五版》 -第10章 Python语句简介

    前面在开始讲解数据类型的时候,有说过Python的知识结构,在此重温一下 Python知识结构: 程序由模块组成 模块包含语句 语句包含表达式 表达式创建并处理对象 关于知识结构,前面已经说过我自己的 ...

  4. 《Python学习手册 第五版》 -第16章 函数基础

    前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函 ...

  5. Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘

    Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...

  6. Python学习手册(第4版)PDF高清完整版免费下载|百度云盘

    Python学习手册(第4版)PDF高清完整版免费下载|百度云盘 提取码:z6il 内容简介 Google和YouTube由于Python的高可适应性.易于维护以及适合于快速开发而采用它.如果你想要编 ...

  7. [python学习手册-笔记]003.数值类型

    003.数值类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...

  8. [python学习手册-笔记]004.动态类型

    004.动态类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...

  9. 《Python学习手册》读书笔记

    之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...

随机推荐

  1. win7+jdk1.6+solr4.7.2在内嵌jetty servelt或外置tocmat服务器的solr服务使用

        solr安装,目前初步接触solr,了解两种启动方式.一种是自带的jetty,另一种是基于tomcat.由于超过4.7.2版本的solr需要java1.7及以上版本的支持,所以我们选择solr ...

  2. MongoDB数据库 备份 还原

    MongoDB数据库 1.备份用        mongodump 2.还原用        mongorestore 1.备份 @echo offecho 正在备份MongoDB数据库SET mon ...

  3. 推荐一个很好用的脚本session snapper

    源网址http://tech.e2sn.com/oracle-scripts-and-tools/session-snapper 内容: If you want to just download Sn ...

  4. May 12th 2017 Week 19th Friday

    Love asks faith, and faith asks firmness. 爱情要求忠诚,而忠诚要求坚贞. Love, as well as many other relations amon ...

  5. websocket常见错误

    当websockt连接是open的时候send()方法传送数据,当连接关闭或获取不到的时候回抛出异常. 一个通常的错误是人们喜欢在连接open之前发送消息.如下所示: // 这将不会工作 var ws ...

  6. Android(java)学习笔记4:线程的控制

    1. 线程休眠: Java中线程休眠指让正在运行的线程暂停执行一段时间,进入阻塞状态,通过调用Thread类的静态方法sleep得以实现. 当线程调用sleep进入阻塞状态后,在其休眠的时间内,该线程 ...

  7. 【HHHOJ】ZJOI2019模拟赛(十六)4.07 解题报告

    点此进入比赛 得分: \(100+100+100=300\) 排名: \(Rank\ 1\) \(Rating\): \(+13\)(\(\frac18Rated\)) 备注: 这场比赛全是做过的原题 ...

  8. Hibernate Validator数据校验框架常用注释

    使用前先配置maven,加入依赖: <dependency> <groupId>org.hibernate</groupId> <artifactId> ...

  9. MVC学习一:MVC简单流程

    MVC学习一:MVC初次接触 1.MVC简单流程 1.1.服务器接收客户端请求后,解析URL(根据 路由表里配置的URL来分析 类名(控制器名)和方法名)根据请求的类名,创建对应的控制器类对象,并调用 ...

  10. 让IIS支持无后缀名访问

    IIS中添加对Mime类型 .   application/octet-stream