python (第二章)数据结构

文章目录

    • 2.5 对序列使用 +和 ×
      • 建立由列表组成的列表
    • 2.6序列的增量赋值(+=和×=)
      • 关于 +=的谜题
        • 补充:extend()方法和+有什么区别呢?
    • 2.7 list.sort方法和内置函数sorted(排序)
    • 2.8 用bisect来管理已排序的序列
      • 2.8.2用bisect.insort插入元素
    • 2.9 当列表不是首选时
      • 2.9.1 数组
      • 2.9.2内存视图
      • 2.9.3 NumPy和SciPy
      • 2.9.4 双向队列和其他的形式的队列

2.5 对序列使用 +和 ×

l = [1,2,3]
print(id(l))
t= l*5
print(id(t))

结果如图:

在这里插入图片描述

  • 总结:+ 和 * 都遵循这个规律,不修改原有的操作对象,而是构建一个全新的序列。
  • 注意:如果a*n 这个语句中,序列a里面的元素是对其他可变对象的引用的话,这个结果可能会出乎意料。比如,你想用my_list = [[]]*3 来初始化一个由列表组成的列表,但是你得到的列表里面包含的3个元素其实是3个引用,而且这3个引用指向同一个列表。这显然不是想要的。

建立由列表组成的列表

正确的方式1:

board = [['_'] * 3 for i in range(3)]
print(board)
board[1][2] = 'X'
print(board)

结果如图:
在这里插入图片描述

错误的方式1:含有3个指向同一对象的引用的列表是毫无用处的。

weird_board = [['_']*3] *3
print(weird_board)
weird_board[1][2] = '0'
print(weird_board)

结果如图:
在这里插入图片描述

错误的方式2:
这个和上一个错误的本质是一样的

row = [' _ ']*3
board = []
for i in range(3):board.append(row)
print(board)
board[1][2] ='0'
print(board)

结果如图:
在这里插入图片描述
正确的方式2:
这里的等同于正确的方式1

board = []
for i in range(3):row = ['_']*3 # 每次迭代中都新建了一个列表,作为新的一行添加到boardboard.append(row)
print(board)
board[1][2] ='0'
print(board)

结果如图:
在这里插入图片描述

2.6序列的增量赋值(+=和×=)

增量赋值运算符+=和*=的表现取决于它们的第一个操作对象,本次的就集中讨论(+=)。对其他的增量运算符也同样适用。
+=背后的特殊方法是__iadd__(用于‘就地加法’),所谓的‘就地’理解为:不创建新的对象,而是将原来的对象重新赋值。如果一个类没有实现这个方法的话,python会退一步调用__add__.
我们考虑下面这个简单的表达式:

  • a+=b

  • 讨论:
    (1).若a实现了__iadd__方法,就会调用这个方法。同时对于可变序列(list,bytearray和array.array)来说,a会就地变动了,就像调用了a.extend(b)一样
    (2).若a没有实现__iadd__方法,a+=b这个表达式的效果就会根a=a+b一样了;首先计算a+b,得到一个新的对象,然后赋值给a。

  • 总结:
    在这个表达式中,变量名会不会被关联到新的可变对象,完全取决于这个类型有没有实现__iadd__这个方法。总的来说,可变序列一般都实现了__iadd__这个方法,因此+=是就地加法。而不可变序列没有实现这个方法,就会像步骤(2)那样操作。后者相对应的是__imul__.

例子:

l = [1, 2, 3]
print('before id(l):',id(l))
l *=2
print(l)
print('after id(l):',id(l))
t = (1, 2, 3)
print('before id(t):',id(t))
t *= 2
print('after id(t):',id(t)) # 运用增量惩罚后,新的元组被创建

结果如图:
在这里插入图片描述

关于 +=的谜题

t = (1, 2, [30,40])
t[2] += [50, 60]
print(t)

在这里插入图片描述
结果:t[2]被改动了,但是也有异常出现。但是我们可以写成t[2].extend([50,60])来避免这个异常。

教训:

  • 不要把可变对象放在元组里面
  • 增量赋值不是一个原子操。它虽然会抛出异常,但是还是完成了操作
  • 查看python的字节码并不难,它对我们了解代码背后的运行机制很有帮助。

补充:extend()方法和+有什么区别呢?

a = [1,2,3]
b = [4,5,6]
c = a+bd = [1,2,3]
e = [4,5,6]
d.extend(e)

结果如图:
在这里插入图片描述
结论:
结果是一样的,但是+号生成的是一个新的对象,而extend则是在原地的修改对象。
extend()的运算效率比+更高。但是, d.extend(e) 的返回结果是None,而不是合并后的序列。d序列是合并后的序列。
c返回的是新的序列。

2.7 list.sort方法和内置函数sorted(排序)

list.sort方法会就地排序列表,这也是这个方法返回None的原因,按照python的惯例:如果一个函数或者方法对对象进行的是就地改动,那它就应该返回None.
与list.sort相反的是sorted,它会新建一个列表作为返回值。这个方法可以接受人和形式的可迭代对象作为参数,甚至包括不可变序列或者生成器,但是它总是返回一个列表。
不管list.sort或者sorted函数,都有两个参数,reverse和key

  • reverse:默认为False,就是升序排列,True为降序排列
  • key:对一些字符串进行排序的时候,key=str.lower来实现忽略大小写的排序;key=len来显示根据字符串长度来排序。

例子:

fruits = ['grape', 'raspberry', 'apple', 'banana']
print("未排序:", fruits)
print(sorted(fruits))
print("sorted:", fruits)
print(sorted(fruits,reverse=True))
print(sorted(fruits,key=len))
print(sorted(fruits,key=len,reverse=True))
print(fruits)
fruits.sort()
print(fruits)

结果如下:
在这里插入图片描述
可以发现,直到执行了fruits.sort方法,fruits本身才发生了变化。
排好序的序列可以用来进行快速搜索,而标准库的bisect模块给我们提供了二分查找算法。

2.8 用bisect来管理已排序的序列

bisect模块包含类 两个主要函数,bisect和insert,两个函数都利用二分查找算法在有序序列中查找或者插入元素。
在有序序列中用bisect查找某个元素的插入位置。
例子1:

import bisect
import sys
HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, 30]
NEEDLES = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]
ROW_FMT = '{0:2d} @ {1:2d}   {2}{0:2d}'
def demo(bisect_fn):for needle in reversed(NEEDLES):position = bisect_fn(HAYSTACK, needle) #返回插入的位置offset = position * '  |'print(ROW_FMT.format(needle, position, offset))# return bisect_fnif __name__ == '__main__':if sys.argv[-1] == 'left':bisect_fn = bisect.bisect_left  #当碰到相等的元素的时候,会放在它左边(前边) else:bisect_fn = bisect.bisect #或者是bisect_fn = bisect.bisect_right,当碰到相等的元素的时候,会放在它的右边(后边)print('DEMO:', bisect_fn.__name__)print('haystack ->', ' '.join('%2d' % n for n in HAYSTACK))demo(bisect_fn)

例子2:根据分数找到它对应的成绩

import bisect
def grade(score,breakpoint = [60,70,80,90],grades='FDCBA'):i = bisect.bisect(breakpoint,score) # 返回i,匹配gradesreturn grades[i]
t = [grade(score) for score in [33,99,77,70,89,91,10]]
print(t)

输出:

['F', 'A', 'C', 'C', 'B', 'A', 'F']

2.8.2用bisect.insort插入元素

insort(seq,item) 把变量item插入到序列seq中,并能保持seq的升序顺序。

import bisect
import random
SIZE = 7
random.seed(1729)
my_list = []
for i in range(SIZE):new_item = random.randrange(SIZE*2)bisect.insort(my_list, new_item)print('%2d ->' % new_item, my_list)

结果如图:
在这里插入图片描述

  • 补充: %和format的区别

参考:https://www.cnblogs.com/zhaopanpan/p/8875765.html (%和format的区别)

2.9 当列表不是首选时

2.9.1 数组

2.9.2内存视图

2.9.3 NumPy和SciPy

科学计算有关的算法

窥探NumPy二维数组的基本操作

import numpy
a = numpy.arange(12)
print(a)
print(type(a))
print(a.shape)#查看维度
a.shape = 3, 4 #变成二维的
print(a)
print(a[2])
print(a[2, 1])
print(a[:, 1])
t = a.transpose() #行列交换,得到**新的数组**
print(t) 

结果如下:
在这里插入图片描述
可以发现t是一个新的数组。

2.9.4 双向队列和其他的形式的队列

补充:markdown生成目录方式,在开头输出[toc]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Windows Phone] 实作不同的地图显示模式

[Windows Phone] 实作不同的地图显示模式 原文:[Windows Phone] 实作不同的地图显示模式前言 本文章主要示范如何让地图有不同的模式产生,例如平面图、地形图、鸟瞰图、鸟瞰图含街道等。 这部分主要是调整 Map.CartographicMode 属性,其中 MapCartograph…

[STemWin教程入门篇]第一期:emWin介绍

特别说明:原创教程,未经许可禁止转载,教程采用回复可见的形式,谢谢大家的支持。 armfly-x2,x3,v2,v3,v5开发板裸机和带系统的emWin工程已经全部建立,链接如下: http://bbs.armfly.com/read.php?tid1830 SE…

python 栈【测试题】

文章目录1.删除最外层的括号信息要求答案2.棒球比赛信息示例答案3. 用栈实现队列要求说明:答案4.用队列模拟栈描述注意答案5.下一个更大的元素(未解)信息:示例:注意:答案:6.删除字符串中的所有相邻重复项信息示例&…

python进阶(第三章1) 字典

文章目录3.1 泛映射类型什么是可散列的数据类型(键的要求)字典的构造方法3.2 字典推导(dictcomp)3.3 常见的映射方法用setdefault处理找不到的键3.4 映射的弹性键查询3.4.1 defaultdict:处理找不到的键的一个选择注意:defaultdict与dict实例化…

python基础 list和tuple

文章目录一、list1、len()函数可以获得list元素的个数2、索引从0开始3、末尾追加 append(xx)4、也可以把元素插入到指定的位置,比如索引号为1的位置(insert)5、末尾删除pop() ,并且返回该值6、要删除指定位置的元素,用pop(i)方法,…

python基础 dict和set

文章目录dictset4.用集合为列表去重5.集合的增 add,update6.集合的删 discard,remove,pop,clear7 集合运算7.1 子集(<或者issubset()方法)7.2并集(|或者union()方法)7.3 交集(&或者intersection())7.4 差集(-或者difference()方法)7.5 对称集(^或者symmetric_difference…

python进阶(第三章2)字典和集合

文章目录3.8 集合论nee中的元素在haystack中出现的次数&#xff0c;可以在任何可迭代对象上3.8.1集合字面量3.8.2 集合推导3.8.3 集合操作3.9 dict和set的背后3.9.1 一个关于效率的实验3.9.2 字典中的散列表1.散列值和相等性2.散列表算法获取值&#xff1a;添加新的元素更新现有…

Android下实现GPS定位服务

1.申请Google API Key&#xff0c;参考前面文章 2.实现GPS的功能需要使用模拟器进行经纬度的模拟设置&#xff0c;请参考前一篇文章进行设置 3.创建一个Build Target为Google APIs的项目 4.修改Androidmanifest文件&#xff1a; view plain<uses-library android:name"…

DEDECMS全版本gotopage变量XSS ROOTKIT 0DAY

影响版本&#xff1a; DEDECMS全版本 漏洞描叙&#xff1a; DEDECMS后台登陆模板中的gotopage变量未效验传入数据&#xff0c;导致XSS漏洞。 \dede\templets\login.htm 65行左右 <input type"hidden" name"gotopage" value"<?php if(!empty($g…

Android开源库loopj的android-async-http的 JsonHttpResponseHandler 存在死循环GC_CONCURRENT

我现在用的是 AndroidAsyncHttp 1.4.4 版本&#xff0c;之前遇到一个很奇怪的问题&#xff0c; 当使用 JsonHttpResponseHandler 解析请求的页面出现服务器错误或其他情况返回的内容不是 JSON 字符串时不会调用自己复写实现的 onSuccess 或者 onFailure 方法&#xff0c;将会出…

进程状态转换(了解)

进程三个基本状态&#xff1a;就绪、阻塞、运行 这个比较简单&#xff0c;进程创建后进入就绪状态、然后若CPU空闲或能打断CPU正在执行的进程&#xff08;优先级低的&#xff09;&#xff0c;那么就绪状态转换成运行态&#xff0c;运行时&#xff0c;进程需要用到其他资源&…

2014阿里巴巴校园招聘笔试题 - 中南站

转载于:https://www.cnblogs.com/gotodsp/articles/3530329.html

Spring的IOC原理[通俗解释一下]

1. IoC理论的背景 我们都知道&#xff0c;在采用面向对象方法设计的软件系统中&#xff0c;它的底层实现都是由N个对象组成的&#xff0c;所有的对象通过彼此的合作&#xff0c;最终实现系统的业务逻辑。 图1&#xff1a;软件系统中耦合的对象 如果我们打开机械式手表的后盖&am…

以嵌入式系统设计师考试成绩,开始嵌入式博客之旅

http://www.rkb.gov.cn/jsj/cms/s_contents/download/s_dt201003110106.html 转载于:https://www.cnblogs.com/yueqian-scut/p/3952268.html

SSH框架配置及Maven使用

1.SSH框架配置 1.1. SSH框架介绍 1.2. SSH框架配置 所需资源下载&#xff1a; l jdk; 从Oracle官方网站&#xff1a;http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html下载jdk&#xff0c;win7是默认安装在C:\Program Files (x86)\Java\jdk1.6.0_25路径下…

Flask 从入门到熟悉(不敢称为精通)

文章目录2.1 Flask介绍及其安装2.2 Virtualenv3.1 一个最小的应用3.2 外部课件服务器3.3 调试模式4.1 路由介绍4.2 变量规则4.3 构建URL4.4 HTTP 方法4 总结5.1 静态文件5.2 渲染模板5.3 练习66.1 接收请求数据6.2 请求对象6.3 文件上传6.4 Cookies6 总结77.1 重定向和错误7.2 …

Ext JS 5 beta版发布

原文&#xff1a;Announcing Public Beta of Ext JS 5我们非常高兴的宣布&#xff0c;Sencha Ext JS 5 beta版本开始进行公测了。这个beta版本可以让你、我们Sencha社区来对我们的Ext JS 5的工作进度进行评测。对于所以Ext JS开发人员&#xff0c;这事一个很好的机会来协助完成…

关于癌症的十大谣言

最近&#xff0c;国外网站总结了西方社会中流行的十个关于癌症的谣言&#xff0c;其中很多谣言在我们周围也有广泛的传播。 谣言1&#xff1a;癌症是人为导致的现代疾病 或许在公众的认知里&#xff0c;癌症在今天要比历史上任何时期都重要。不过实际上&#xff0c;癌症可不是一…

[python 进阶] 第7章 函数装饰器和闭包

文章目录7.1 装饰器基础知识7.2 Python何时执行装饰器7.3 使用装饰器改进“策略”7.4 变量作用域(global)备注 -比较字节码&#xff08;暂略&#xff09;7.5 闭包7.6 nonlocal声明global和nonlocal的区别7.7 实现一个简单的装饰器7.8 标准库中的装饰器7.8.1 使用functools.lru_…

自制“低奢内”CSS3登入表单,包含JS验证,请别嫌弃哦。

要求 必备知识 基本了解CSS语法,初步了解CSS3语法知识。和JS/JQuery基本语法。 开发环境 Adobe Dreamweaver CS6 演示地址 演示地址 预览截图(抬抬你的鼠标就可以看到演示地址哦): 制作步骤: 一, html结构 <div id"home"><form id"login" class…