python核心编程:杂记2
为什么80%的码农都做不了架构师?>>>
1. Python对象
所有的Python对象都拥有三个特性:身份,类型和值.
身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到.这个值可以被认为是该对象的内存地址.
类型: 对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则.我们可以使用type()查看Python对象的类型.
值: 对象表示的数据项.
1. type在函数中起判断作用
我们定义一个函数,要求传递的参数必须是元组(因为元组不可更改),则我们可以这样判断(可以引申到判断参数为整数,浮点数,字典等等):
>>> def func(aTuple):if type(aTuple) != tuple:print 'not tuple'else:print 'tuple'>>> func([1, 2, 3])
not tuple
>>> func((1, 2, 3))
tuple
2. is/is not, isinstance操作符
A is B: A和B是同一个对象
A is not B: A和B不是同一个对象
isinstance(A, (int, long, float, complex)): A的类型是否为(int, long, float, complex),也适用于类实例的判断
3. 内建类型,引用类型的区别
内建类型: 整型,字符串,元组
引用类型:列表,字典,类对象
对内建类型的赋值,实际上是销毁原对象,新建一个对象:
>>> ss = 'hello world'
>>> id(ss)
46651264L
>>> ss = 'what'
>>> id(ss)
34271280L
而引用类型则保持不变:
>>> arr = [1, 2, 3]
>>> id(arr)
45887240L
>>> arr.append(4)
>>> id(arr)
45887240L
4. 标准类型的分类
以存储模型为标准的类型分类:
标量/原子类型(保持单个字面对象的类型): 数值(所有的数值类型),字符串
容器类型(容纳多个相同/不同对象的类型): 列表,元组,字典
以更新模型为标准的类型分类:
可变类型: 列表,字典
不可变类型: 数字,字符串,元组
以访问模型为标准的类型分类:
直接访问: 数字
顺序访问: 字符串,列表,元组
映射访问: 字典
2. 序列:字符串,列表和元组
1. 通用函数
额外知识:浅拷贝和深拷贝
浅拷贝只是拷贝对象的索引,而不是重新建立了一个对象。如果完全拷贝一个对象,则需要深拷贝:
In [22]: arr
Out[22]: [1, 2, 3, [4, 5]]In [23]: Tuple1 = tuple(arr)In [24]: import copyIn [25]: Tuple2 = copy.deepcopy(tuple(arr))In [26]: [id(x) for x in arr]
Out[26]: [42791256, 42791232, 42791208, 140595426198232]In [27]: [id(x) for x in Tuple1]
Out[27]: [42791256, 42791232, 42791208, 140595426198232]In [28]: [id(x) for x in Tuple2]
Out[28]: [42791256, 42791232, 42791208, 140595427957864]
这里arr和Tuple1的元素id全部一样(由于整形1,2,3是不可改变,所以重新赋值会新建一个对象),而Tuple2的[4, 5]的id不一样,说明进行了深拷贝。
list(iter): 把可迭代对象转换为列表。
str(obj): 把obj对象转换成字符串
tuple(iter): 把一个可迭代对象转换成一个元组对象
enumerate(iter): 接受一个可迭代对象作为参数,返回一个enumerate对象(同时也是一个迭代器),该对象生成由iter每个元素的index值和item值组成的元组。
len(seq): 返回seq的长度
max/min(iter, key = None):返回最大值,指定key则必须是一个可以传给sort()方法的,用于比较的回调函数。
reversed(seq): 接受一个序列作为参数,返回一个以逆序访问的迭代器。
sorted(iter, func = None, key = None, reverse = False): 接受一个可迭代对象作为参数,返回一个有序的列表。
sum(seq, init = 0): 返回seq和可选参数init的总和,其效果等同于reduce(operator.add, seq, init)
zip([it0, it1, it2]):举例说明
In [29]: iter1 = (1, 2, 3)In [30]: iter2 = [11, 12, 13]In [31]: iter3 = [21, 22, 23]In [32]: zip(iter1, iter2, iter3)
Out[32]: [(1, 11, 21), (2, 12, 22), (3, 13, 23)]
3. 映射
1. 哈希表
哈希表是一种数据结构,哈希表中存储的每一条数据,叫做一个值,是根据与它相关的一个被称作键的数据项进行存储的。键和值合在一起被称为“键-值”对。哈希表的算法是活取键,对键执行一个叫做哈希函数的操作,并根据计算的结果,选择在数据结构的某个地址中来存储你的值。任何一个值存储的地址皆取决于它的键。正因为这种随意性,哈希表中的值是没有顺序的。你拥有的是一个无序的数据集。
你所能获得的有序集合只能是字典中的键的集合或者值的集合。方法Keys()或values()返回一个列表,该列表是可排序的。你还可以用item()方法得到包含键,值对的元组的列表来排序。由于字典本身是哈希的,所以是无序的。
哈希表一般有很好的性能,因为用键查询相当快。
2. 字典的键必须是可哈希的
因为我们需要通过键来查找数据,所以键必须保持不变,即键必须是可哈希的(通过hash判断):
In [45]: dst = {}In [46]: dst[[1, 2]] = 3
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-46-70dfcbeb49dc> in <module>()
----> 1 dst[[1, 2]] = 3TypeError: unhashable type: 'list'In [47]: hash([1, 2])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-47-0e7c08465b16> in <module>()
----> 1 hash([1, 2])TypeError: unhashable type: 'list'
3. 映射相关函数
dict(): 工厂函数,用来创建字典,参数为可迭代对象。
len(): 返回字典的长度
hash(): 判断对象是否可哈希,返回其哈希值。
in/ not in: 判断键是否在字典中
映射类型的内建方法:
keys(), values(), items(): 返回字典的键,值,键-值对
clear(): 删除字典中所有元素
copy(): 返回字典的一个副本(浅复制)
fromkeys(seq, val = None): 创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值。
get(key, default = None): 获取键key对应的值,如果不存在则返回默认值default.
pop(key, [, default]): key存在,则删除并返回dict[key],否则返回default。如果key不存在也不提供default,则引发KeyError异常。
setdefault(key, default = None): 如果字典中不存在key键,则用default赋值。
4. 迭代器,列表解析和生成器
1. 迭代器
从根本上说,迭代器就是有一个next()方法的对象,而不是通过索引来计数,全部迭代完会引发一个StopIteration异常。
我们一般可以迭代序列,字典和文件:
In [56]: arr = [1, 2]In [57]: i = iter(arr)In [58]: i.next()
Out[58]: 1In [59]: i.next()
Out[59]: 2In [60]: i.next()
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-60-e590fe0d22f8> in <module>()
----> 1 i.next()StopIteration:
而迭代器实际上等价于for循环:
for i in seq:do_something_to(i)
<==>
fetch = iter(seq)while True:try:i = fetch.next()except StopIteration:breakdo_something_to(i)
2. 列表解析
语法如下:
[expr for iter_var in iterable if cond_expr]
实例如下:
In [61]: [x for x in range(6) if x % 2]
Out[61]: [1, 3, 5]
3. 生成器表达式
语法如下:
(expr for iter_var in iterable if cond_expr)
列表解析的一个不足就是必要生成所有的数据。但是生成器表达式是返回一个生成器,每次计算出一个条目后,把这个条目yield出来,采用了延迟计算。
In [63]: lst = (x for x in range(6) if x % 2)In [64]: lst
Out[64]: <generator object <genexpr> at 0x7fdeec558320>In [65]: for i in lst:....: print i,....:
1 3 5
<==>
In [67]: def fun(arr):....: for i in arr:....: yield i....: In [68]: arr = [1, 2, 3]In [71]: for i in fun(arr):....: print i,....:
1 2 3
转载于:https://my.oschina.net/voler/blog/394856
python核心编程:杂记2相关推荐
- 拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录
目录 目录 关于这本书 必看知识点 最后 关于这本书 <Python 核心编程 (第二版)>是一本 Python 编程的入门书,分为 Python 核心(其实并不核心,应该叫基础) 和 高 ...
- python3.5.0下载-python核心编程最新版下载
python核心编程是一款专门为Python学习者打造的手机学习软件,同时也是老手编程重要的参考书,为用户提供高级的代码编辑.交互测试.调试等功能,十分的便捷好用,快来下载体验吧. 关于Python: ...
- python核心编程第三版_Python之父:自学python,这3本书能节约你一大半时间编程...
今天给大家推荐三本书,有两本是属于一个系列,即<Python核心编程>第二版和第三版,一本讲基础和一本讲进阶,非常适合Python的初学者和有一定基础的学习者.还有一本书适合所有想学Pyt ...
- python核心编程第二版pdf_Python Book电子书pdf版合集 Python核心高级编程第二版
1小时学会Python.doc 51CTO下载-[Python系列].BeginningPythonFromNovicetoProfessionalSecondEdition.pdf 8.Python ...
- 对《Python核心编程》中“第一个Python程序”的改进
概述: 本程序主要是模仿<Python核心编程>中3.6节--第一个Python程序,并在其基础上做了一些小的改进,而改进的要求则是来源于第三章的课后练习题. 本篇博客的一个核心问题就是在 ...
- 《Python核心编程》第二版第36页第二章练习 -Python核心编程答案-自己做的-
<Python核心编程>第二版第36页第二章练习 这里列出的答案不是来自官方资源,是我自己做的练习,可能有误. 2.21 练习 2-1. 变量,print和字符串格式化操作符.启动交互式解 ...
- 《Python核心编程(第二版)》——1.9 练习
本节书摘来自异步社区<Python核心编程(第二版)>一书中的第1章,第1.9节,作者[美]Wesley J. Chun,宋吉广 译,更多章节内容可以访问云栖社区"异步社区&qu ...
- python3 socketserver_《Python核心编程(第3版)》——2.5 *SocketServer模块
本节书摘来自异步社区<Python核心编程(第3版)>一书中的第2章,第2.5节,作者[美] Wesley Chun(卫斯理 春),孙波翔 李斌 李晗 译,更多章节内容可以访问云栖社区&q ...
- python核心编程6-14习题的解题思路
#coding:utf-8 """ python核心编程6-14习题的解题思路 设计一个"石头,剪子,布"游戏,有时又叫"Rochambea ...
最新文章
- python 无头模式 绕过检测_Python chrome 无头模式的问题
- (0058)iOS开发之iOS8新特性IBDesignable的使用
- LintCode: Triangle
- MySQL每秒57万的写入,带你装逼,带你飞 !!
- 微博深度学习平台架构和实践
- Roman to Integer
- java集群解析文件_干货:一文详解Redis集群原理核心内容
- SQL Server 数据库没有有效所有者的三种解决办法
- 人魔比妖都恶的时代...
- dmb显示服务器断开连接,dmb联网信息发布系统操作手册企业加强版.docx
- Airflow 中文文档:教程
- webpack4配置(1)-打包一个js文件
- Hyperledger Fabric chaincode 开发(疑难解答)
- 2021秋季跳槽必备:软件测试面试题(附带答案)备战金九银十!
- Oracle工作中常用函数的总结
- ros学习-中国大学MOOC---《机器人操作系统入门》课程讲义
- 华为云计算HCIE学习笔记-FusionCompute
- 笔记本ThinkPad E430c加装内存和SSD固态硬盘
- PCIe传输速率和有效带宽计算方式
- 东方日升2019年全年营收实现高质量增长
热门文章
- windows-server-2012R2离线中文语言包安装
- linux右键菜单的截图,Linux: 给右键菜单加一个“转换图片为jpg格式”
- linux 端口打不开,在线等!!为什么telnet的23端口就是打不开啊
- or函数 java_Java OptionalInt orElseGet()用法及代码示例
- java forkjoin 简书_浅谈Java的Fork/Join并发框架
- 信号与系统sa函数求积分_瞎扯数学分析微积分(1~4)
- MongoDB简介、在node中使用MongoDB
- ElasticSearch bool过滤查询
- python vars name报错_Python vars()全局名称错误
- pandas读取excel带汉字的列头_Pandas在读取csv时如何设置列名--常用方法集锦