第三章 - Python 内置数据结构

分类

  • 数值型

    • int、float、complex、bool
  • 序列对象
    • 字符串 str
    • 列表 list
    • tuple
  • 键值对
    • 集合set
    • 字典dict

数值型

  • 数值型

    • int、float、complex、bool都是class,1、5.0、2+3j都是对象即实例
    • int:python3的int就是长整型,且没有大小限制,受限于内存区域的大小
    • float:有整数部分和小数部分组成。支持十进制和科学计数法表示。只有双精度型。
    • complex:有实数和虚数部分组成,实数和虚数部分都是浮点数,3+4.2J
    • bool:int的子类,仅有2个实例True、False对应1和0,可以和整数直接运算
  • 类型转换(built-in)
    • int(x) 返回一个整数 ,int是与类型名相同的内置转换函数,如果字符串不合法抛出异常
    • float(x) 返回一个浮点数
    • complex(x)、complex(x,y) 返回一个复数
    • bool(x) 返回布尔值,前面讲过False等价的对象

数字的处理函数

  • round(),四舍五入?六入四舍五取偶
  • math模块、floor()地板、天花板ceil()
  • int() 、//
  • 举例:
      import math
      print(math.floor(2.5), math.floor(-2.5))
      print(math.ceil(2.5), math.ceil(-2.5))

  以下打印什么结果?说明什么
  print(int(-3.6), int(-2.5), int(-1.4))
  print(int(3.6), int(2.5), int(1.4))
  print(7//2, 7//-2, -7//2, -(7//2))
  print(2//3, -2//3, -1//3)
  print(round(2.5), round(2.5001), round(2.6))
  print(round(3.5), round(3.5001), round(3.6), round(3.3))
  print(round(-2.5), round(-2.5001), round(-2.6))
  print(round(-3.5), round(-3.5001), round(-3.6), round(-3.3))

  • round(),四舍六入五取偶
  • floor()向下取整、ceil()向上取整
  • int() 取整数部分
  • // 整除且向下取整

  • min()
  • max()
  • pow(x,y) 等于 x**y
  • math.sqrt()

  • 进制函数,返回值是字符串
    • bin()
    • oct()
    • hex()
  • math.pi π
  • math.e 自如常数

类型判断

  • type(obj) ,返回类型,而不是字符串
  • isinstance(obj, class_or_tuple),返回布尔值
  • 举例:
    • type(a)
    • type('abc')
    • type(123)
    • isinstance(6, str)、type(6) == str
    • isinstance(6, (str, bool, int))
  • type(1+True) # bool型是int的子类
  • type(1+True+2.0) # 是什么?隐式转换 # 都是数值类型,往高精度转

列表

  • 一个队列,一个排列整齐的队伍
  • 列表内的个体称作元素,由若干元素组成列表
  • 元素可以是任意对象(数字、字符串、对象、列表等)
  • 列表内元素有顺序,可以使用索引
  • 线性的数据结构
  • 使用 [ ] 表示
  • 列表是可变
  • 列表list、链表、queue、stack的差异

列表list定义 初始化

赋值即定义,这也是静态语言和动态语言的区别。

  • list() -> new empty list
  • list(iterable) -> new list initialized from iterable's items
  • 列表不能一开始就定义大小

   lst = list()
   lst = []
   lst = [2, 6, 9, 'ab']
   lst = list(range(5))

列表索引访问

  • 索引,也叫下标
  • 正索引:从左至右,从0开始,为列表中每一个元素编号
  • 负索引:从右至左,从-1开始
  • 正负索引不可以超界,否则引发异常IndexError
  • 为了理解方便,可以认为列表是从左至右排列的,左边是头部,右边是尾部,左边是下界,右边是上界
  • 列表通过索引访问
    • list[index] ,index就是索引,使用中括号访问

列表查询

  • index(value,[start,[stop]])

    • 通过值value,从指定区间查找列表内的元素是否匹配
    • 匹配第一个就立即返回索引
    • 匹配不到,抛出异常ValueError
  • count(value)
    • 返回列表中匹配value的次数
  • 时间复杂度
    • index和count方法都是O(n)
    • 随着列表数据规模的增大,而效率下降
  • 如何返回列表元素的个数?如何遍历?如何设计高效?
    • len()

如何查帮助

  • 官方帮助文档

    • 搜索关键字
  • IPython中
    • help(keyword)
    • keyword可以是变量、对象、类名、函数名、方法名

列表元素修改

  • 索引访问修改

    • list[index] = value
    • 索引不要超界

列表增加、插入元素

  • append(object) -> None

    • 列表尾部追加元素,返回None
    • 返回None就意味着没有新的列表产生,就地修改
    • 时间复杂度是O(1),因为直接可以索引到结尾添加
  • insert(index, object) -> None
    • 在指定的索引index处插入元素object
    • 返回None就意味着没有新的列表产生,就地修改
    • 时间复杂度是O(n),因为会调整内存布局
    • 索引能超上下界吗?
    • 超越上界,尾部追加
    • 超越下界,头部追加

列表增加、插入元素

  • extend(iteratable) -> None

    • 将可迭代对象的元素追加进来,返回None
    • 就地修改
  • + -> list
    • 连接操作,将两个列表连接起来
    • 产生新的列表,原列表不变
    • 本质上调用的是__add__()方法
  • * -> list
    • 重复操作,将本列表元素重复n次,返回新的列表

列表 *重复的坑

  • * -> list

    • 重复操作,将本列表元素重复n次,返回新的列表

   x = [[1,2,3]]*3
   print(x)
   x[0][1] = 20
   print(x)

   y = [1]*5
   y[0] = 6
   y[1] = 7
   print(y)
   上面代码运行结果是什么?为什么?

列表删除元素

  • remove(value) -> None

    • 从左至右查找第一个匹配value的值,移除该元素,返回None
    • 就地修改
    • 效率?
  • pop([index]) -> item
    • 不指定索引index,就从列表尾部弹出一个元素
    • 指定索引index,就从索引处弹出一个元素,索引超界抛出IndexError错误
    • 效率?指定索引的的时间复杂度?不指定索引呢?
  • clear() -> None
    • 清除列表所有元素,剩下一个空列表(一批元素不要,可能会引起垃圾回收gc)

列表其它操作

  • reverse() -> None

    • 将列表元素反转,返回None
    • 就地修改
  • sort(key=None, reverse=False) -> None
    • 只写一个参数,匹配的是第一个参数,要匹配第二个参数,要指明参数名字,这么写 lst.sort(reverse=True)
    • 对列表元素进行排序,就地修改,默认升序
    • reverse为True,反转,降序
    • key一个函数,指定key如何排序
      • lst.sort(key=functionname)
  • in
    • [3,4] in [1, 2, [3,4]]
    • for x in [1,2,3,4]
  • not in

列表复制

  • 先看一段代码

   lst0 = list(range(4))
   lst2 = list(range(4))
   print(lst0 == lst2)
   lst1 = lst0
   lst1[2] = 10
   print(lst0)

   lst0 == lst2相等吗?为什么?lst0里面存的是什么?
   == 比较的是对象的内容 (True)
   is 比较的是对象的地址 (False) 即 id(lst0) == id(lst2)
   这里虽然都是创建 list(range(4)) 这个对象,解释器并没有优化为只创建一个

   请问lst0的索引为2的元素的值是什么?
   请问lst1 = lst0这个过程中有没有复制过程?

列表复制

  • copy() -> List

    • shadow copy返回一个新的列表

   lst0 = list(range(4))
   lst5 = lst0.copy()
   id(lst0) 和 id(lst5) 是不同的 ,与 lst5=lst0 还是不一样的
   copy是把原列表的item复制到一个片新内存,创建一个新列表
   print(lst5 == lst0)
   lst5[2] = 10
   print(lst5 == lst0)
   lst0和lst5一样吗?

  • 对比前面程序的差别

   lst0 = [1, [2, 3, 4], 5]
   lst5 = lst0.copy()
   lst5 == lst0
   lst5[2] = 10
   lst5 == lst0
   lst5[2] = 5
   lst5[1][1] = 20
   lst5 == lst0
   list中间元素是个复杂元素,所以copy时只拷贝了它的引用,即它的地址。所以在一边修改之后,另一边也一同修改了。

列表复制

  • shadow copy

    • 影子拷贝,也叫浅拷贝,遇到引用类型,只是复制了一个引用而已
  • 深拷贝
    • copy模块提供了deepcopy

     import copy
     lst0 = [1, [2, 3, 4], 5]
     lst5 = copy.deepcopy(lst0)
     lst5[1][1] = 20
     lst5 == lst0

随机数

  • random模块
  • randint(a, b) 返回[a, b]之间的整数
  • choice(seq) 从非空序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。random.choice([1,3,5,7])
  • randrange ([start,] stop [,step]) 从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省值为1。 random.randrange(1,7,2)
  • random.shuffle(list) ->None 就地打乱列表元素
  • sample(population, k) 从样本空间或总体(序列或者集合类型)中随机取出k个不同的元素,返回一个新的列表
    • random.sample(['a', 'b', 'c', 'd'], 2)
    • random.sample(['a', 'a'], 2) 会返回什么结果

最后

本文的另外链接是:https://herodanny.github.io/python-magedu-2018-notes3.html

Python全栈-magedu-2018-笔记3的更多相关文章

  1. 自学Python全栈开发第一次笔记

           我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写 ...

  2. Python全栈之jQuery笔记

    jQuery runnoob网址: http://www.runoob.com/jquery/jquery-tutorial.html jQuery API手册: http://www.runoob. ...

  3. python全栈开发之OS模块的总结

    OS模块 1. os.name()      获取当前的系统 2.os.getcwd      #获取当前的工作目录 import os cwd=os.getcwd() # dir=os.listdi ...

  4. python全栈开发中级班全程笔记(第二模块、第四章(三、re 正则表达式))

    python全栈开发笔记第二模块   第四章 :常用模块(第三部分) 一.正则表达式的作用与方法 正则表达式是什么呢?一个问题带来正则表达式的重要性和作用      有一个需求 : 从文件中读取所有联 ...

  5. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  6. python全栈开发中级班全程笔记(第二模块、第三章)(员工信息增删改查作业讲解)

    python全栈开发中级班全程笔记 第三章:员工信息增删改查作业代码 作业要求: 员工增删改查表用代码实现一个简单的员工信息增删改查表需求: 1.支持模糊查询,(1.find name ,age fo ...

  7. 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】

    点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...

  8. 老男孩最新Python全栈开发视频教程(92天全)重点内容梳理笔记 看完就是全栈开发工程师

    为什么要写这个系列博客呢? 说来讽刺,91年生人的我,同龄人大多有一份事业,或者有一个家庭了.而我,念了次985大学,年少轻狂,在大学期间迷信创业,觉得大学里的许多课程如同吃翔一样学了几乎一辈子都用不 ...

  9. 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂

    Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...

  10. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

随机推荐

  1. LeetCode 第五题 最长的回文字符串 (JAVA)

    Longest Palindromic Substring 简介:字符串中最长的回文字符串 回文字符串:中心对称的字符串 ,如 mom,noon 问题详解: 给定一个字符串s,寻找字符串中最长的回文字 ...

  2. Django-3-Template模板

    模板是html文档+Django逻辑语句的组合. 一.变量和标签 变量通过{{ }}来表示,两个大括号中间是变量名. 标签通过{% %}来表示,就是Python中的函数和方法. 常用标签: {% fo ...

  3. Flask开发微电影网站(八)

    1.后台管理之电影预告管理 1.1 定义电影预告表单 在app的admin目录的forms.py文件中,定义电影预告表单 # 预告表单 class PreviewForm(FlaskForm): ti ...

  4. oc调用swift的打包.a / framework 不成功?!

     https://www.jianshu.com/p/734341f7c242   虽说是Swift和OC混编SDK,但目前只支持项目中使用了Swift调用OC的工程,暂不支持OC调用Swift的工程 ...

  5. C#学习-多态

    由于可以继承基类的所有成员,子类就都有了相同的行为,但是有时子类的某些行为需要相互区别,子类需要覆写父类中的方法来实现子类特有的行为. 多态即相同类型的对象调用相同的方法却表现出不同行为的现象. 只有 ...

  6. spring boot 启动

    启动spring boot java -jar tuia-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod 查找进程 ps aux|grep tuia- ...

  7. 527D.Clique Problem

    题解: 水题 两种做法: 1.我的 我们假设$xi>xj$ 那么拆开绝对值 $$xi-w[i]>x[j]+w[j]$$ 由于$w[i]>0$,所以$x[i]+w[i]>x[j] ...

  8. windows无法安装msi文件

    命令提示符(管理员身份运行): 输入:msiexec /i e:\spark\scala-2.11.12.msi 其中e:\spark\scala-2.11.12.msi:就是安装文件的位置.

  9. JSONP ---------跨域

    什么是跨域 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首 ...

  10. day11.装饰器初识

    1.开放封闭原则 原则: 开放封闭原则,对扩展是开放的,对修改是封闭的. 封版概念:当写好一个功能以后,就不可以再修改此函数,避免下面一系列的调用产生错误. 因此产生了装饰器 2.装饰器形成过程 我们 ...