文档章节

python学习手册:学习笔记2--Introducing Python Object Types

fzyz_sb
 fzyz_sb
发布于 2015/02/10 21:20
字数 2434
阅读 114
收藏 0
点赞 0
评论 0

1. Why Use Built-in Types?

内建类型对象使程序易于编写

    对于简单的任务来说,内建类型可代表其数据结构.例如使用lists来表示列表,用dictionaries表示查询表格等.

内建类型对象可用于扩展

    复杂的数据结构可以使用内建类型对象来进行扩展.比如堆栈可以使用list进行扩展.

内建类型对象比传统的对象更加有效

    因为python的内建类型对象是使用C来实现的.

内建类型对象是python标准的一部分

    不像STL一样作为C++的扩展库,也不想LISP一样完全是内建类型,python的内建类型对象则是python语言本身的一部分.

    总体来说,内建类型对象不仅仅让编程更加的容易,而且更加的强大和有效.

2. Python's Core Data Types

    以下表格是python的数据类型:

Object type
例子
Numbers
1234,3.456
String
'spam',"hello world"
Lists
[1, [2, 'three'], 4]
Dictionaries
{'food' : 'spam', 'taste' : 'yum'}
Tuples
(1, 'spam', 4, 'U')
Files
myfile = open('eggs', 'r')
Sets
set('abc'),{'a', 'b', 'c'}
Other core types
Booleans, types, None
Program unit types
Functions, modules, classes
Implementation-related types
Compiled code, stack tracebacks

3. Numbers

    数值包括整型,浮点型和其他复合类型(如复数类型).

>>> 123 + 222
345
>>> 1.5 * 4
6.0
>>> 2 ** 100
1267650600228229401496703205376
>>> len(str(2 ** 1000000))
301030

       最大整数值可达到2的1000000次方.

    有两种显示数值的方式,一种是repr:全精度显示.一种是str:用户友好的方式显示.以下例子为书上的,但是在我的python3.4版本中,它们显示的却是一样:

>>> 3.1415 * 2          #repr:as code
6.28300000000000004
>>> print(3.1415 * 2)   #str:use-friendly
6.283
    在某些情况下,使用模块math很是方便
>>> import math
>>> math.pi
3.141592653589793
>>> math.sqrt(85)
9.219544457292887
    而使用random模块可以操作随机数的一些基本操作
>>> import random
>>> random.random()
0.46429998196669087
>>> random.choice([1, 2, 3, 4])
1
>>> random.choice([1, 2, 3, 4])
2

4. Strings

    序列是操作其从左到右排列的项的一种数据结构:它们的项是基于其索引的相对位置.

序列操作

    序列是通过其索引来读取项的:

>>> S = 'Spam'
>>> len(S)
4
>>> S[0]
'S'
    而我们也可以使用负数作为索引,则-1代表最后一个字符,-2代表倒数第二个,依此类推:
>>> S[-1]
'm'
>>> S[-2]
'a'
    切片是有效读取序列范围元素的一个操作,基本语法:[Start:End:Step],代表从索引Start开始,到End的前一个项结束,其步长为Step.切片操作是新建一个对象,而非改变原对象:
>>> S = "hello world"
>>> S[1:]
'ello world'
>>> S[:5]
'hello'
>>> S[1:5]
'ello'
>>> S[::2]
'hlowrd'
>>> S[:-1]
'hello worl'
    我们可以使用'+'来连接字符串,通过'*'来重复字符串:
>>> S = 'Spam'
>>> S + 'xyz'
'Spamxyz'
>>> S * 3
'SpamSpamSpam'
不可改变性

    字符串本身是不可改变的,我们通常的操作都是新建一个字符串:

>>> S
'Spam'
>>> id(S)
60272344
>>> S[0] = 'z'
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    S[0] = 'z'
TypeError: 'str' object does not support item assignment
>>> S = 'z' + S[1:]
>>> id(S)
60272008
    通过赋值操作,字符串S本身已经被改变(id已经变化了).

字符串特有方法

    相对于其他的序列,如列表,元组,字符串有自己本身特殊的方法.

    find方法用于查找字符串,返回其子字符串的索引(-1代表没有找到),而replace方法用于替换子字符串的操作,它返回一个新建的字符串:

>>> S.find("pa")
1
>>> S
'zpam'
>>> S.replace('pa', 'XYZ')
'zXYZm'
    而我们可以通过split来分割字符串成列表,通过一些基本的方法(upper,isalpha)来判断字符串:
>>> line = 'aaa,bbb,ccccc,dd'
>>> line.split(',')
['aaa', 'bbb', 'ccccc', 'dd']
>>> S = 'spam'
>>> S.upper()
'SPAM'
>>> S.isalpha()
True
>>> line = 'aaa,bbb,ccccc,dd\n'
>>> line = line.rstrip()
>>> line
'aaa,bbb,ccccc,dd'
    通过%来格式化字符串,而在2.6和3.0中可以通过format来格式化:
>>> '%s, eggs, and %s' % ('spam', 'SPAM!')
'spam, eggs, and SPAM!'
>>> '{0}, eggs, and {1}'.format('spam', 'SPAM!')
'spam, eggs, and SPAM!'
得到帮助

    我们可以使用dir函数:返回一个列表,包含此对象的所有属性.

>>> dir(S)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', 
'__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', 
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', 
'__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 
'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
    而help函数非常有用
>>> help(S.replace)
Help on built-in function replace:

replace(...) method of builtins.str instance
    S.replace(old, new[, count]) -> str
    
    Return a copy of S with all occurrences of substring
    old replaced by new.  If the optional argument count is
    given, only the first count occurrences are replaced.
模式匹配

    通过模块re来完成:

>>> import re
>>> math = re.match('hello[ \t]*(.*)world', 'hello    Python world')
>>> math.group(1)
'Python '
>>> math = re.match('/(.*)/(.*)/(.*)', '/usr/home/lumerjack')
>>> math.groups()
('usr', 'home', 'lumerjack')

5. Lists

    列表是可存储任何数据类型,且长度不固定的可修改元素的序列.

序列操作

    适用于String的一切操作,通常也适用于列表:

>>> L = [123, 'spam', 1.23]
>>> len(L)
3
>>> L[0]
123
>>> L + [4, 5, 6]
[123, 'spam', 1.23, 4, 5, 6]
列表特有的操作

    列表类似于其他语言的数组,但是列表的元素可以为任何的数据类型(数值,字符串,列表,元组等).而且列表没有固定的长度,我们可以增加/修改列表:

>>> L
[123, 'spam', 1.23]
>>> L.append('NI')
>>> L
[123, 'spam', 1.23, 'NI']
>>> L.pop(2)
1.23
>>> L
[123, 'spam', 'NI']
    由于列表是可修改的,所以一些方法会直接修改原列表:
>>> M = ['bb', 'aa', 'cc']
>>> M.sort()
>>> M
['aa', 'bb', 'cc']
>>> M.reverse()
>>> M
['cc', 'bb', 'aa']
边界检查

    列表也是不允许越界的:

>>> L
[123, 'spam', 'NI']
>>> L[99]
Traceback (most recent call last):
  File "<pyshell#66>", line 1, in <module>
    L[99]
IndexError: list index out of range
>>> L[99] = 'what'
Traceback (most recent call last):
  File "<pyshell#67>", line 1, in <module>
    L[99] = 'what'
IndexError: list assignment index out of range
推导式

    推导式不仅仅适用于列表,它也适用于集合和字典:

>>> [ord(x) for x in 'spaam']
[115, 112, 97, 97, 109]
>>> {ord(x) for x in 'spaam'}
{112, 97, 115, 109}
>>> {x: ord(x) for x in 'spaam'}
{'s': 115, 'p': 112, 'a': 97, 'm': 109}

6. Dictionaries

    字典是一个关联式容器,内部使用key来排序.

关联操作:

    我们可以通过索引来读取字典的值.但其索引是key,而非数字索引:

>>> D = {'food': 'Spam', 'quantity': 4, 'color': 'pink'}
>>> D['food']
'Spam'
>>> D['quantity'] += 1
>>> D
{'quantity': 5, 'food': 'Spam', 'color': 'pink'}
    但是不同于列表会产生越界,字典的新增会直接创建值:
>>> D = {}
>>> D['name'] = 'Bob'
>>> D['job'] = 'dev'
>>> D
{'name': 'Bob', 'job': 'dev'}
    我们可以使用dict内建函数新增字典,可以传递关键字参数(name=value),或者传递zip函数后的参数:
>>> bob1 = dict(name='Bob', job='dev', age=40)
>>> bob1
{'age': 40, 'name': 'Bob', 'job': 'dev'}
>>> bob2 = dict(zip(['name', 'job', 'age'],['Bob', 'dev', 40]))
>>> bob2
{'age': 40, 'name': 'Bob', 'job': 'dev'}
测试键是否存在

    我们可以使用in来判断key是否存在:

>>> D
{'name': 'Bob', 'job': 'dev'}
>>> "name" in D
True
>>> "error" in D
False
    我们可以使用get函数来读取,并且可以赋默认值:
>>> D.get("error")
>>> D.get("error", 1)
1
排序键值:为了循环

    对字典的操作,实际上是对键值的操作,所以我们可以对字典进行排序,实际上就是对键值进行排序:

>>> D = {"a": 1, "b": 2, "c": 3}
>>> D
{'a': 1, 'c': 3, 'b': 2}
>>> for key in sorted(D):
	print(key, "=>", D[key])

	
a => 1
b => 2
c => 3
迭代和优化

    一个对象在以下情况下是可迭代的:它在内存中是物理存储的,或者对象的每一项是在可迭代操作的上下文中产生的:一个虚拟的序列.

    通常可以使用iter函数来产生可迭代对象,并且使用next函数来访问.

>>> A = [1, 2, 3, 4]
>>> i = iter(A)
>>> i.__next__()
1
>>> i.__next__()
2
>>> with open("test.txt") as fobj:
	for line in fobj:
		print(line)

		
hello world
i love this world
and i love python too
    这里,文件对象就是可迭代的:文件对象并不是一个列表,它是按需读取的,是在可迭代的情况下一行一行的读取.

    而列表推导式则类似文件一样,是具有迭代作用的:

>>> squares = [x ** 2 for x in [1, 2, 3, 4, 5]]
>>> squares
[1, 4, 9, 16, 25]
    因为列表推导式可内部实现为:
>>> i = iter([1, 2, 3, 4, 5])
>>> squares = []
>>> while True:
	try:
		value = i.__next__()
	except StopIteration:
		break
	squares.append(value ** 2)

	
>>> squares
[1, 4, 9, 16, 25]

7. Tuples

    元组可以理解为:不可改变的列表:

>>> T = (1, 2, 3, 4)
>>> len(T)
4
>>> id(T)
53984696
>>> T += (5, 6)
>>> T
(1, 2, 3, 4, 5, 6)
>>> id(T)
53974888
    而元组的index方法是返回参数的索引,count方法则计算元素出现的次数:
>>> T = (1, 2, 3, 4, 5, 4, 3, 2)
>>> T.index(4)
3
>>> T.count(4)
2
    为什么已经有列表情况下还要元组呢?想想C/C++语言里面非常重要的修饰符const,用于保证传入函数的参数不可被修改.而对于python来说,如果要保证传入的参数不能被修改,则传入元组即可,在函数内部再通过list内建函数转换为列表进行操作.

8. Files

普通文件:

    我们可以使用文件对象来读取/写入文件:

>>> f = open("test.txt")
>>> text = f.read()
>>> text
'hello world\ni love this world\nand i love python too\n\n'
>>> with open("test.txt") as f1:
	with open("output.txt", "w") as f2:
		for line in f1:
			f2.write(line)

	
12
18
21
>>> f = open("output.txt")
>>> f.read()
'hello world\ni love this world\nand i love python too'
    write函数会显示所写入的字符个数.

二进制文件

    我们可以通过模块struct来操作二进制文件:

>>> import struct
>>> packed = struct.pack('>i4sh', 7, b'spam', 8)
>>> packed
b'\x00\x00\x00\x07spam\x00\x08'
>>> file = open("data.bin", "wb")
>>> file.write(packed)
10
>>> file.close()
>>> data = open("data.bin", "rb").read()
>>> data
b'\x00\x00\x00\x07spam\x00\x08'
>>> data[4:8]
b'spam'
>>> list(data)
[0, 0, 0, 7, 115, 112, 97, 109, 0, 8]
>>> type(data)
<class 'bytes'>
>>> struct.unpack('>i4sh', data)
(7, b'spam', 8)

© 著作权归作者所有

共有 人打赏支持
fzyz_sb
粉丝 404
博文 209
码字总数 447144
作品 0
武汉
程序员
荐书丨确认过眼神,这份Python书单一定是你的菜

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 Python 是军刀型的开源工具,被广泛应用于Web 开发、爬虫、数据清洗、自然语言处理、机器学习和人工智能等方...

csdnsevenn ⋅ 05/05 ⋅ 0

她们不一样!python小白刚学会python竟然爬取了网上所有小姐姐的照片

如今想学python的人越来越多,无论是专业的程序员还是业余爱好者,都对python情有独钟。世界上值得学习的技能有很多,但是如果你要问我推荐哪一个,那么我会推荐一门编程语言,比如python。如...

Python学习 ⋅ 06/06 ⋅ 0

利用python函数的输入、输出定义与时序图相结合,让生活更有趣

写在前面 1. 重点是思路交流,利用python函数的输入、输出定义与时序图相结合,让流程更加的简洁、清晰。该方法不局限于工作,同样适用于学习笔记、恋爱心得...等等只要存在个体交互的活动。...

python达人 ⋅ 05/08 ⋅ 0

Python学习笔记二十四( 元类 )

class属性 class属性可以查看对象的类型. Person 类的实例对象person 的类型时Person 类类型, Python 是面向对象的语言, 那么Person 的类对象的类型又是什么? Person / int / str 的类对象的...

DragonFangQy ⋅ 05/27 ⋅ 0

推荐几本对于Python初学者比较好的书籍(内含PDF)

我们提供一个初学者最好的Python书籍列表。Python是一个初级程序员可以学习编程的最友好语言之一。为了帮助您开始使用Python编程,我们分享此列表。泡一杯茶,选一本书阅读,开始使用Python编...

柯西带你学编程 ⋅ 06/08 ⋅ 0

分享一些关于数据分析的学习资料

时间过得真快,转眼一周又要过去了。这一周里你读了什么书?学到了什么知识?有什么收获? 这周里,我收集到一些关于Python数据分析的学习资料,在这里一并分享给大家: Python数据分析班升级...

爱吃西瓜的番茄酱 ⋅ 05/13 ⋅ 0

程序员必备,快速学习 Python 的全套14张思维导图(附高清版下载)

后台回复关键词 思维导图 可获取本文中的高清思维导图(PDF版) ML & AI∣一个有用的公众号 长按,识别二维码,加关注 获取更多精彩文章

micf435p6d221ssdld2 ⋅ 05/23 ⋅ 0

良心推荐:一份20周学习计算机科学的经验贴(附资源)

雷锋网按:这里是,油管Artificial Intelligence Education专栏,原作者Siraj Raval授权雷锋字幕组编译。 原标题 Computer Science Curriculum 翻译 | 王飞 整理 | 凡江 这是一份五个月(20个...

雷锋字幕组 ⋅ 05/08 ⋅ 0

Python 数据挖掘学习 一 结巴分词

近期,想对古典小说进行索引,和知识挖掘,所以研究了下python数据挖掘方面的知识 Python安装 python学习 一 python语法,及变量类型 python学习 二 爬一个图片网站上 python学习 二 02 爬一...

shuilan0066 ⋅ 01/22 ⋅ 0

学习Python必去的8个网站!

作为一个现时代的程序员初学者,除了看书之外,互联网的学习手段也是断不能少的! 以下这些网站,虽说不上全方位的满足你的需求,但是大部分也都能! 0.国外的大神GitHub : https://github...

W3Cschool ⋅ 06/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CENTOS7防火墙命令记录

安装Firewall命令: yum install firewalld firewalld-config Firewall开启常见端口命令: firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-po......

cavion ⋅ 57分钟前 ⋅ 0

【C++】【STL】利用chromo来测量程序运行时间与日志时间打印精确到微秒

直接上代码吧,没啥好说的。头疼。 #include <iostream>#include <string>#include <ctime>#include <sstream>#include <iomanip>#include <thread>#include <chrono>using ......

muqiusangyang ⋅ 今天 ⋅ 0

Mac环境下svn的使用

在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还需做一下简...

故久呵呵 ⋅ 今天 ⋅ 0

破解公司回应苹果“USB限制模式”:已攻破

本周四,苹果发表声明称 iOS 中加入了一项名为“USB 限制模式”的功能,可以防止 iPhone 在连接其他设备的时候被破解,并且强调这一功能并不是针对 FBI 等执法部门,为的是保护用户数据安全。...

六库科技 ⋅ 今天 ⋅ 0

MyBtais整合Spring Boot整合,TypeHandler对枚举类(enum)处理

概要 问题描述 我想用枚举类来表示用户当前状态,枚举类由 code 和 msg 组成,但我只想把 code 保存到数据库,查询处理,能知道用户当前状态,这应该怎么做呢?在 Spring 整合MyBatis 的时候...

Wenyi_Feng ⋅ 今天 ⋅ 0

synchronized与Lock的区别

# <center>王梦龙的读书笔记第一篇</center> ## <center>-synchronized与Lock的区别</centre> ###一、从使用场景来说 + synchronized 是能够注释代码块、类、方法但是它的加锁是和解锁使用一......

我不想加班 ⋅ 今天 ⋅ 0

VConsole的使用

手机端控制台打印输出,方便bug的排查。 首先需要引入vconsole.min.js 文件,然后在文件中创造实例。就能直接使用了。 var vConsole = new VConsole(); vConsole的文件地址...

大美琴 ⋅ 今天 ⋅ 0

Java NIO之字符集

1 字符集和编解码的概念 首先,解释一下什么是字符集。顾名思义,就是字符的集合。它的初衷是把现实世界的符号映射为计算机可以理解的字节。比如我创造一个字符集,叫做sex字符集,就包含两个...

士别三日 ⋅ 今天 ⋅ 0

Spring Bean基础

1、Bean之间引用 <!--如果Bean配置在同一个XML文件中,使用local引用--><ref bean="someBean"/><!--如果Bean配置在不同的XML文件中,使用ref引用--><ref local="someBean"/> 其实两种......

霍淇滨 ⋅ 今天 ⋅ 0

05、基于Consul+Upsync+Nginx实现动态负载均衡

1、Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/local/srcwget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip 解压consu......

北岩 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部