1. 序列类型的分类:

  容器类型:list、tuple,deque

  扁平序列:str、bytes、bytearray、array.array

  可变序列:list、dequte、bytearray、array

  不可变序列:str、tuple、bytes

2. 序列的abc继承关系:

  魔法函数构成了协议

3.序列的+ +=和extend的区别:

my_list = []
my_list.append()
my_list.append("a") from collections import abc a = [,]
# a = list()
c = a + [,]
# c = a + (,) # 抛异常
print(c) # 就地加
a += [,]
a += (,) # 可以为任意的序列类型
a.extend((,))
# def __iadd__(self, values):
# self.extend(values)
# return self
a.append((,,))
print(a)

  记住:我们知道类函数的实现是通过魔法函数来实现的。其中+号表示的是同类项的相加。

  记住:+=和extend是一样的,因此+=是通过__iadd__来实现extend的。

  记住:append表示添加的是元素位置。

  记住:不能用变量名去接收这些方法,因为没有返回值(aa = a.extend是错误的)

4. 实现可切片的对象:

# 模式[start:end:step]
r"""
其中,第一个数字start表示切片开始位置,默认是0
第二个数字end表示切片截止(但不包含)位置(默认为列表长度】
第三个数字step表示切片的步长(默认为1)
当start为0时可以省略,当end为列表长度时可以省略。
当start为1时可以生路,并且省略步长时可以同时省略最后一个冒号。
另外,当step为负整数时,表示反向切片,这时start应该比end的值要大才行。
"""
aList = [,,,,,,,,,]
# 取值的操作
print(aList[::]) #返回包含原里列表中所有元素的新列表
print(aList[::-]) #返回包含原列表中所有元素的逆序列表
print(aList[::]) # 隔一个取一个,获取偶数位置的元素
print(aList[::]) #隔一个取一个,获取奇数位置的元素
print(aList[:]) # 指定切片的开始和结束位置
print(aList[:]) # 切片结束位置大于列表长度时,从里诶包尾部截断
print(aList[:]) # 切片开始位置大于列表长度时,返回空列表 # 赋值的操作
aList[len(aList):] = []
print(aList) # 在列表尾部增加元素
aList[:] = [,]
print(aList) # 在列表头部插入元素
aList[:] = []
print(aList) # 在列表中间位置插入元素
aList[:] = [,]
print(aList) #替换元素列表元素,等号两边的里诶包长度相同
aList[:] = [,,]
print(aList) # 等号两边的列表长度也可以不相等
aList[::] = [] * # 将元素赋值三份
print(aList) # 隔一个修改一个
aList[::] = ['a','b','c'] # 隔一个修改一个
print(aList)
# aList[::] = [,] # 左侧切片不连续,等号两边列表长度必须相等
aList[:] = [] #删除列表中前3个元素
del aList[:] # 切片元素连续
del aList[::] # 切片元素不连续,隔一个删一个。
print(aList)
import numbers
class Group:
# 支持切片操作
def __init__(self,group_name,company_name,staffs):
self.group_name = group_name
self.company_name = company_name
self.staffs = staffs def __reversed__(self):
self.staffs.reverse() def __getitem__(self, item):
cls = type(self)
if isinstance(item,slice):
return cls(group_name=self.group_name,company_name=self.company_name,staffs=self.staffs[item])
elif isinstance(item,numbers.Integral):
return cls(group_name=self.group_name,company_name=self.company_name,staffs=[self.staffs[item]]) def __len__(self):
return len(self.staffs) def __iter__(self):
return iter(self.staffs) def __contains__(self, item):
if item in self.staffs:
return True
else:
return False staffs = ["bobby1","imooc","bobby2","bobby3"]
group = Group(company_name="imooc",group_name="user",staffs=staffs)
sub_group = group[:]
print(group.staffs)
# sub_group1 = group[]
# print(group.staffs)
# reversed(group)
# for user in group:
# print(user)

  记住:这是一个比较多的用魔法函数实现切片操作。

  记住:难理解的是cls = type(self),返回值:<class '__main__.Group'>,这是拿到类的对象 ,其实可以改写成下面方式

    def __getitem__(self, item):
# cls = type(self)
# print(type(self))
if isinstance(item,slice):
return Group(group_name=self.group_name,company_name=self.company_name,staffs=self.staffs[item])
elif isinstance(item,numbers.Integral):
return Group(group_name=self.group_name,company_name=self.company_name,staffs=[self.staffs[item]])

  记住:但是这里为什么要用type返回类对象呢?这是一种相对方式,为的是如果更改类名可以不用修改内部的代码。

5. bisect二分迭代类型操作:

import bisect
from collections import deque # 用来处理已排序的序列,始终用来维持已排序的序列,升序。
# 二分查找
inter_list = []
bisect.insort(inter_list,)
bisect.insort(inter_list,)
bisect.insort(inter_list,)
bisect.insort(inter_list,)
bisect.insort(inter_list,) print(inter_list)
# 总结:
# bisect.bisect(data,)
# 作用,查找该数值将会插入的位置并返回,而不会插入,返回是会在那个数字之后插入
# 表示:num > .... 插入
a1 = bisect.bisect(inter_list,)
print(a1) # bisect_left 和 bisect_right 函数
# 该函数用入处理将会插入重复数值的情况,返回将会插入的位置
# 第一:从左边看num>...插入位置
# 第二:从右边看 ... < num 出入位置。
a2 = bisect.bisect_left(inter_list,)
print(a2)
a3 = bisect.bisect_right(inter_list,)
print(a3) # insort 函数 insort_left 和 insort_right
bisect.insort(inter_list,)
print(inter_list)

7.数组:

# array, deque
# 数组:存储连续的内存空间,效率非常高的。
import array
# array 和list的一个重要区别,array只能存放指定的数据类型。
# array的性能比list高。 my_array = array.array("i")
my_array.append()
my_array.append("abc")
print(my_array)

  记住:我们是会用 列表,什么时候用数组

8. 列表推导式、生成器表达式、字典推导式、集合推导式。

# 列表生成式(列表推导式)
# . 提取1-20之间的奇数
odd_list = []
for i in range():
if i % ==:
odd_list.append(i) print(odd_list) # 列表生成式
odd_list = [i for i in range() if i % == ] # .逻辑复杂的情况
def handle_item(item):
return item * item odd_list1 = [handle_item(i) for i in range() if i % == ] # 列表生成式性能高于列表操作。

  记住:列表生成式不能太复杂了。要不就放弃了可读性。另外列表生成式的操作高于列表操作。

# 生成器表达式:
odd_list = (i for i in range() if i % == )
print(type(odd_list))
# <class 'generator'>
for item in odd_list:
print(item)

  记住:生成器通过for循环打印出来。

odd_gen = (i for i in range() if i % ==  )

odd_list = list(odd_gen)
print(odd_list)

  记住:生成器可以转回成list再打印出来也是可以的。

# 字典推导式
my_dict = {"bobby1":,"bobby2":,"imooc":}
reversed_dict = {value:Key for Key,value in my_dict.items()}
print(reversed_dict)
# {: 'bobby1', : 'bobby2', : 'imooc'}
# 集合推导式
# my_set = set(my_dict.keys())
my_set = {Key for Key,value in my_dict.items()}
print(my_set)
print(type(my_set))
# <class 'set'>

Python说文解字_杂谈06的更多相关文章

  1. Python说文解字_杂谈05

    1. isinstance和type: is和==符号,is指的是内存地址,是不是一个对象,ID知否相同 集成链 class A: pass class B(A): pass b = B() prin ...

  2. Python说文解字_杂谈09

    1. 元类编程代码分析: import numbers class Field: pass class IntField(Field): # 数据描述符: # 初始化 def __init__(sel ...

  3. Python说文解字_杂谈08

    1. Python变量到底是什么? Python和Java中的变量本质不一样,python的变量实质是一个指针 int str,便利贴 a = 1 # 1. a贴在1上面 # 2. 它的过程是先生成对 ...

  4. Python说文解字_杂谈07

    1. 深入dict from collections.abc import Mapping,MutableMapping # dict 属于mapping类型 a = {} print(isinsta ...

  5. Python说文解字_杂谈01

    1. Python在Ubuntu下面下载Python 2. 安装依赖包 sudo apt-get update sudo apt-get install build-essential python- ...

  6. Python说文解字_杂谈04

    1. 鸭子类型: 当你看到一只鸟走来像鸭子,游泳起来像鸭子,叫起来也像鸭子,他么他就可以叫做鸭子.任何可迭代的对象.一样的方法,可以用可迭代的话,就可以迭代的组合打印.__getitem__可以塞到任 ...

  7. Python说文解字_杂谈03

    1. 我们从前面的知识得到,所有的类都要继承自object这个基类(超类),另外我们知道“继承”可以继承类的属性和方法.我们起始通过type创建类的时候,自然而然的也会从ojbect继承他的一些属性和 ...

  8. Python说文解字_杂谈02

    1. Py中三个中啊哟的概念type.object和class的关系. type生成了int生成了1 type->class->obj type用来生成类对象的 object是最顶层的基类 ...

  9. Python说文解字_详解元类

    1.深入理解一切接对象: 1.1 什么是类和对象? 首先明白元类之前要明白什么叫做类.类是面向对象object oriented programming的重要概念.在面向对象中类和对象是最基本的两个概 ...

随机推荐

  1. Windows按键消息—虚拟键码(转)

    源地址:http://c.biancheng.net/cpp/html/1253.html 虚拟键码保存在WM_KEYDOWN.WM_KEYUP.WM_SYSKEYDOWN和WM_SYSKEYUP消息 ...

  2. idea中使用maven运行wordcount代码

    1.创建maven项目 pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmln ...

  3. JavaWeb高级编程(下篇)

    Java标准标签库 JSP标签语法中包含一些简写可以帮助轻松编写JSP.这些简写中第一个就是taglib指令. <%@ taglib prefix="c" uri=" ...

  4. 150-PHP nl2br函数(一)

    <?php $str="h t m l"; //定义一个多处换行的字串 echo "未处理前的输出形式:<br />{$str}"; #nl2 ...

  5. T_SQL 将一列多行数据合并为一行

    SQL Server在进行数据迁移和报表处理的时候会遇到将一列多行数据拼接为一个字符串的情况,为了处理这个问题,在网上找了一些相关的资料,提供两种方法,供遇到类似问题的朋友们参考,也借此加深自己的印象 ...

  6. Assignment写作谨慎学术抄袭是关键

    学术写作(Academic Writing)作为留学生涯的“必修课”,总是让闻者叹气,抓耳挠腮.初入课堂的留学生,更是缺乏写作经验不知从何下笔,只想仰天长啸“Essay真的好难啊!!”面对一个Essa ...

  7. JNI操作二维数组

    之前的文章讲解了有关JNI使用方法,这篇文章进阶一点,介绍下JNI操作二维数组的方法.有了之前文章的操作JNI的方法,这里直接上代码了. Java代码部分 package com.testjni; p ...

  8. 两表关联更新数据——oracle

    from testb b where b.id=a.id) ; (where exists(select 1 from testb b where b.id=a.id):如果没有这个条件,不匹配的选项 ...

  9. 【数据库】Function&Procedure&Package

    Function/Procedure都是可独立编译并存储在数据库中的,区别是Function有返回值. Package则是数据和过程.函数的集合体. CREATE PROCEDURE dorepeat ...

  10. EE将于5月30日在英国推出首个5G网络

    英国移动运营商 EE 宣布计划于周三在英国推出 5G,该网络将于 5 月 30 日开通,第一批 5G 手机可从今天开始预订.EE 最初的 5G 网络部署将集中在六个城市(伦敦,加的夫,爱丁堡,贝尔法斯 ...