【JulyEdu-Python基础】第 3 课:容器以及容器的访问使用
大纲
- 容器切片
list/tuple
dict
set
- 切片
- 列表推导
- 生成器
- 迭代器
容器
list 列表
序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
列表的数据项不需要具有相同的类型
tuple 元组(只读列表)
像C++的const
dict 字典
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中。
set 集合
是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算。
容器 - list/tuple基本操作
li = [1, 2, 3, '', [1, 2, 3], {1: 'one', 2: 'two'}]
print(type(list))
print(type(li))
<class 'type'>
<class 'list'>
# 元素访问
print(li[0])
print(li[-1]) # li[len(li) - 1]
print(li[-2]) # li[len(li) - 2]
# 查找元素位置
print(li.index(''))
print(li.index([1, 2, 3]))
#print(li.index(-1))
创建
添加元素(list only):append, extend
# 添加元素
l_a= [1, 2, 3]
l_a.append(4)
l_a.append(5)
l_b = [6, 7, 8]
l_a.extend(l_b) # 试用下append什么结果
print(l_a) def my_extend(li, n_li):
for i in n_li:
li.append(li)
# 其实就是把要添加的数组展开了
删除元素(list only):del, pop
根据索引读写(tuple只读)
判断容器是否为空
# 判断容器是否为空
l_a = []
if not l_a:
print('Empty')
if l_a is None:
print('Empty')# 没有分配内存,不显示
# None和not 不是一回事
if len(l_a) == 0:
print('Empty')
字符串转换
容器元素数量
遍历
# 遍历
for i in li:
print(i)# 直接遍历
for i in range(len(li)):
print(li[i])# 根据索引去访问每个元素
容器 - dict基本操作
初始化
访问
添加元素
修改元素
删除元素
判断key是否存在
判断容器是否为空
容器元素数量
遍历
# 无序的key:value数据结构
d = {'a': 1, 'b': 2, 1: 'one', 2: 'two', 3:[1, 2, 3]}
print(type(dict))
print(type(d))
print(d)
# 访问元素
print(d['a'])
print(d[1])
print(d[3])
# 判断元素是否存在
print('c' in d)
print(3 in d)
del(d['a'])# del(dict[key])
print(len(d))
#遍历
d = {'a': 1, 'b': 2, 1: 'one', 2: 'two', 3:[1, 2, 3]}
for key in d:
print(d[key])
print('.....')
for key, value in d.items():
print(key, value) keys = d.keys()
print(type(keys))
print(keys)
容器 - set基本操作
并/交/差集:|/union, &/intersection, -/difference
对称差集:^/symmetric_difference(不同时出现在2个集合中的项)
包含关系:>=/issuperset
添加元素
更新元素
删除元素
元素是否存在
容器元素数量
遍历
print(s_a.difference(s_b)) # 对称差(A | B) - (A & B)
print(s_a ^ s_b)
print(s_a.symmetric_difference(s_b)) # 修改元素
s_a.add('x')
s_a.update([4, 5, 60, 70])
print(s_a) # 删除元素 必须知道元素的值
s_a.remove(70)
print(s_a)
# s_a.remove(100) # 遍历
print(len(s_a))
for i in s_a:
print(i)
切片
存取序列(列表,元组,字符串)的任意一部分
格式:seq[开始索引:结束索引:步长]
默认值
负数索引
负数步长
# python的大杀器,怎么高效的切一个子数组,切片最大的用处
li = list(range(10))
print(li) # 切片 [start:end:steps] >= start & < end开区间
print(li[2:5]) # [2,3,4]
print(li[:4]) # [0,1,2,3]
print(li[5:]) # [5,6,7,8,9]
print(li[0:10:3]) # [0,3,6,9] # 负数怎么处理?
print(li[5:-2]) # [5,6,7]
print(li[9:0:-1]) # [9,8,7,6,5,4,3,2,1]
print(li[9::-1]) # [9,8,7,6,5,4,3,2,1,0]
print(li[::-2]) # [9,7,5,3,1] #切片生成一个新的对象
print(li) # 还是保持原样 # 切片做快速反转
re_li = li[::-1]
print(re_li)
列表推导
问题的提出
快速简单的生成一个列表
对原有的列表进行简单的转换
一维列表推导
二维列表推导以及注意事项
#生成数组对象的方法
li = list(range(10))
print(li) li = []
for i in range(20):
if(i % 2) == 0:
li.append(i) print(li) li = [0] * 10
print(li) # 列表推导
li = [i * 2 for i in range(10)]
print(li) # 浅拷贝
li_2d = [[0] * 3] * 3# ×3代表把[[0]*3]引用了3次,每一列都是同一个对象
print(li_2d)
li_2d[0][0] = 100 # 同时对这个3个都起了效果
print(li_2d) # [[100,0,0],[100,0,0],[100,0,0]] # 深拷贝
li_2d = [[0] * 3 for i in range(3)]
li_2d[0][0] = 100 # 同时对这个3个都起了效果
print(li_2d) # [[100,0,0],[100,0,0],[100,0,0]]
# 1维情况下做复制操作,多维使用的是引用 # python3字典和集合也支持列表推导操作,python2不支持
set = { x for x in range(10) if x % 2 == 0}
print(set) dict = {x: x % 2 == 0 for x in range(10)}
print(dict)
生成器
问题的提出
- 创建一个巨大的列表而仅仅需要访问其中少量几个元素
- 如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。
生成生成器:列表推导时用()替换[](关于yield的使用后面再讲)
遍历:next或者for循环
# 平方表
square_table = []
for i in range(10000):
square_table.append(i * i) for i in range(10):
print(square_table[i]) # 生成器,没有任何初始化开销的时间,把真正的计算推迟到你使用的时候
square_generator = (x * x for x in range(50000))
print(type(square_generator))
for i in range(10):
print(next(square_generator)) # 在python3里range它返回一个新的对象,不是一个list,
# 是一个<class 'range'>,定义了一个生成器
print(type(range(10))) # 协程,可控多线程
def fib(limit):
n, a, b = 0, 0, 1
while n < limit:
yield b
a, b = b, a + b
n += 1
return 'done' import traceback
f = fib(5)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
try:
print(next(f))
except StopIteration:
traceback.print_exc() for i in fib(5):
print(i)
迭代器
问题的提出
- 可以直接作用于for循环的对象统称为可迭代对象:Iterable
- 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator(表示一个惰性计算的序列)
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
from collections import Iterable
from collections import Iterator print(isinstance([1, 2, 3], Iterable))# 数组是可迭代的
print(isinstance([1, 2, 3], Iterator))# 但不是一个迭代器 print(isinstance({}, Iterable)) # True
print(isinstance({}, Iterator)) # False print(isinstance(123, Iterable)) # False print(isinstance('abc', Iterable)) # True
print(isinstance('abc', Iterator)) # False g = (x * x for x in range(3))
print(type(g))
print(isinstance(g, Iterable)) # True
print(isinstance(g, Iterator)) # True
for i in g:
print(i) def fib(limit):
n, a, b = 0, 0,1
while n < limit:
yield b
a, b = b, a+b
n += 1
return 'done'
f = fib(6)
print(type(f))
print(isinstance(f, Iterable)) # True
print(isinstance(f, Iterator)) # True
for i in f:
print(i)
【JulyEdu-Python基础】第 3 课:容器以及容器的访问使用的更多相关文章
- Python基础笔记系列七:字符串定义和访问
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 字符串定义和访问 1.字符串基础 a.字符串可以用单引号.双引号.三引号( ...
- Python基础之魔术方法(控制属性的访问和设置)
# 魔术方法--常规方法# 1. __int__ 构造函数# 2. __new__ 在类实例之前就创建了# 3. __iter__ 迭代器# 4. __del__ 析构方法,用来清除释放的对象内存# ...
- Python基础第一课
Python基础 安装软件并配置环境变量 1.第一句python --初学后缀名可以是任何数 --后期学习需要导入模块时不是py后缀名会报错 2.两种执行方式 Python解释器 py文件路径 Pyt ...
- 第一课、python基础学习笔记
自动化非自动化的区别 自动化测试就是让机器按照人的想法把功能全部跑一遍 自动化测试的过程,让我们写一段程序去测试另一段程序是否正常的过程 Java 编译型语言, 编码-->编译-->解 ...
- Python 基础 一
Python 基础 一 一.关于Python的介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum),这一两年在国内很流行,应用很广泛. 二.Python的基础知识(1) 1 ...
- Python基础知识总结笔记(四)函数
Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...
- python基础全部知识点整理,超级全(20万字+)
目录 Python编程语言简介 https://www.cnblogs.com/hany-postq473111315/p/12256134.html Python环境搭建及中文编码 https:// ...
- 进击的Python【第二章】:Python基础(二)
Python基础(二) 本章内容 数据类型 数据运算 列表与元组的基本操作 字典的基本操作 字符编码与转码 模块初探 练习:购物车程序 一.数据类型 Python有五个标准的数据类型: Numbers ...
- Python之路【第二篇】:Python基础
参考链接:老师 BLOG : http://www.cnblogs.com/wupeiqi/articles/4906230.html 入门拾遗 一.作用域 只要变量在内存中就能被调用!但是(函数的栈 ...
随机推荐
- WPF界面开发技巧大放送!DevExpress WPF在TreeListView中扩展N级
DevExpress广泛应用于ECM企业内容管理. 成本管控.进程监督.生产调度,在企业/政务信息化管理中占据一席重要之地.通过DevExpress WPF Controls,您能创建有着强大互动功能 ...
- JAVA8之日期操作详解
package org.date; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Month; im ...
- Codeforces 871C 872E Points, Lines and Ready-made Titles
题 OvO http://codeforces.com/contest/871/problem/C ( Codeforces Round #440 (Div. 1, based on Technocu ...
- CSS3 box-sizing:content-box | border-box
box-sizing:content-box | border-box 默认值:content-box 适用于:所有接受width和height的元素 继承性:无 content-box: paddi ...
- python播放音乐
最近一直想实现使用Python播放音乐的功能,找了百度上的好多博客,要不就只能播放wav格式的,要不播放mp3格式的但无法在Linux系统下使用的,或者只能在Python2的情况下播放的,写的都不符合 ...
- webpack官方文档分析(一):安装
一:安装 1.首先要安装Node.js->node.js下载 2.本地安装 要安装最新版本或特定版本,运行如下: npm install --save-dev webpack npm insta ...
- Harmonic Number (LightOJ 1234)(调和级数 或者 区块储存答案)
题解:隔一段数字存一个答案,在查询时,只要找到距离n最近而且小于n的存答案值,再把剩余的暴力跑一遍就可以. #include <bits/stdc++.h> using namespace ...
- mysql5.7提示密码过期的解决方法
首先把MySQL关闭 打开一个终端,输入 sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables 执行完命令后,再打开一个新的终端 sudo ...
- IT公司技术博客地址
IT公司技术博客 美团点评技术团队今日头条技术博客Tencent ISUX DesignTGideas-腾讯互动娱乐创意设计团队>AlloyTeam | 腾讯全端 AlloyTeam 团队 Bl ...
- HDU 5115 Dire Wolf ——(区间DP)
比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: #inc ...