zoukankan      html  css  js  c++  java
  • Python学习week3-python数据结构介绍与列表

    1、python数据结构分类

    (1)常规分类:

      数值型:int、float、bool

      序列对象:list、str、tuple

      键值对:dict

    (2)根据可变与不可变分类:

    # 什么是可变?什么又是不可变?

    一般变量都会有三个属性:id,type,value;

    这里id与type不变,值改变则为可变数据类型;value改变,id就改变为不可变;

      不可变:数字,字符串,tuple

      可变:list,dict

    (3)按照访问顺序区分

      直接访问:数字

      顺序访问:字符串,列表,元组

      key值访问:字典

    2、python之数字处理

    2.1、round()函数

    # 四舍六入,五取最近偶数

    print(round(3.5)) # 4
    print(round(1.5)) # 2
    print(round(4.5)) # 4

    # 只有小数刚刚为:.5的时候是取最近偶数,如果超过5则为6入了,例如 round(2.51) 结果为3;

    2.2、math模块:floor()与ceil()

      floor() ==> 地板(向下取值)

      ceil()  ==>天花板(向上取值)

    import math
    
    print(math.floor(1.5)) # 向下取值为1
    print(math.ceil(1.5))  # 向上取值为2
    
    print(math.ceil(-1.5))  # 向上取值为-1
    print(math.floor(-1.5)) # 向下取值为-2

    2.3、int()与//

    # int取整,//整除并且向下取整

    1 print(10//3)         ==》3
    2 print(int(3.33))     ==》3

    2.4、min()、max()函数

    def max(*args, key=None): # known special case of max
        """
        max(iterable, *[, default=obj, key=func]) -> value
        max(arg1, arg2, *args, *[, key=func]) -> value
    ==================================================>
    # max(1,3,5) ==>5
    # max([1,3,4]) ==>4

    2.5、pow()与math.sqrt()

    1 # pow(x,y) ==>x**y
    2 pow(2,3)  ==>8
    3 
    4 # math.sqrt(x)  ==>return float  ===> x**0,5
    5 math.sqrt(100) ==> 10.0 

    2.6、进制转换函数

    1 print(bin(12)) # 10进制转二进制 0b1100
    2 print(oct(12)) # 10进制转八进制 0o14
    3 print(hex(12)) # 10进制转十六进制 0xc

    2.7、类型判断函数

    #  type(object) -> the object's type
    print(type(12)) ==》  <class 'int'>
    
    # isinstance(obj, class_or_tuple, /) A tuple, as in ``isinstance(x, (A, B, ...))``
    print(isinstance([123,23],(int,str))) # Fasle

    3、python之列表

    3.1、list列表的特点

    (1)列表在内存空间中表现是一段连续并且有序的地址空间,是一种线性的数据结构;

    (2)列表中的个体被称为元素,由若干个元素组成列表;

    (3)元素可以是任意对象(数字,字符串,列表,字典等)

    (4)列表中的元素根据索引号,顺序排列,可以通过索引号访问元素;

    (5)列表是可变的数据类型;

    3.2、列表,链表,queue,stack的差异

    # 列表和链表在内存中都是一种有序的线性的数据结构;

    # 不同的是列表是必须为连续的一段地址空间,通过索引的偏移量访问;而链表内存可以不连续,前一个空间只向后一个空间;

    (1)链表与列表的优缺点?

    # 列表由于必须是连续有序,所以列表的访问速度比较快,在不改变原来结构的情况下append数据也还可以,总结:列表访问快,修改慢

    # 链表的特点是上一个空间指向下一个空间,即如果要插入一个元素,只需要修改前后2个元素的空间指向即可,如果要访问,则需要遍历元素;总结:链表修改快,访问比较满;

    # 队列(queue)与栈(stack)

    队列特点:先进先出,类似于管道;list.pop(0)可以模拟

    栈特点:后进先出,类似于子弹夹;list.pop()可以模拟

    3.3、列表定义与初始化

    def __init__(self, seq=()): # known special case of list.__init__
         """
         list() -> new empty list
         list(iterable) -> new list initialized from iterable's items
         # (copied from class doc)
         """
    # list() 等于 l=[] 创建一个空列表
    # list(iterable) ==> iterable 为一个可迭代对象, list(range(5)) 等于 l=[0,1,2,3,4]

     3.4、列表索引访问

    # 索引,也称为下标

    # 正索引:从左至右,从0开始;负索引:从右到左,-1开始(最后一个元素);

    # 访问索引不能越界,不然会报错IndexError

     1 l=['a','b','c','d','e']
     2 
     3 '''
     4 # 格式:[start:end:step]
     5 [:]          提取开头(默认位置0)到结尾(默认位置-1)的整个字符串;
     6 [start:]         从start位置提取到结尾
     7 [:end]           从开头提取到end-1
     8 [start:end]      从start到end-1
     9 [start:end:step] 从start到end-1,每step个字符提取一个
    10 '''
    11 # [:]    提取开头(默认位置0)到结尾(默认位置-1)的整个字符串;
    12 print(l[:])  # ==> ['a', 'b', 'c', 'd', 'e']
    13 # [start:]    从start位置提取到结尾
    14 print(l[1:]) # ==> ['b', 'c', 'd', 'e']  l[0]=a 没有打印
    15 # [:end]  开头提取到end-1
    16 print(l[:4]) # ==> ['a', 'b', 'c', 'd']  l[4]=e 没有打印
    17 # [start:end] 从start到end-1
    18 print(l[1:4]) # ==> ['b', 'c', 'd'] l[0],l[4] 没有打印
    19 # [start:end:step] 从start到end-1,每step个字符提取一个
    20 print(l[0:5:2]) # ==>['a', 'c', 'e']

     3.5、列表查询

    # list.index(value,[star,[stop]])

    '''
    index(...)
        L.index(value, [start, [stop]]) -> integer -- r
        Raises ValueError if the value is not present.
    
    # 通过值value,从指定的区间查找列表内的元素是否匹配,匹配到第一个则返回索引号;匹配不到则报错ValueError    
    '''
    print(l.index('a',0,4)) # ==>0  在列表0到4之间匹配字符'a',匹配到则返回index号0;

    # list.count(value) ==>返回列表中匹配value的次数

    # 注意:index和count方法的时间复杂度都是O(n),n为列表的规模,随着规模越来越大,则效率越来越慢;

    3.6、列表元素修改

    # list[index]=value  ==>直接对索引位置元素进行赋值(覆盖原来元素)

    #### 给列表增加元素的方法#####
    #
    append方法 append(self, p_object) """ L.append(object) -> None -- append object to end """ # insert方法 insert(self, index, p_object) """ L.insert(index, object) -- insert object before index """ # extend方法 extend(self, iterable) """ L.extend(iterable) -> None -- extend list by appending elements from the iterable """
    ## 删除元素方法
    pop方法
    pop(self, index=None)
    """
            L.pop([index]) -> item -- remove and return item at index (default last).
            Raises IndexError if list is empty or index is out of range.
    """
    remove方法
    remove(self, value)
    """
            L.remove(value) -> None -- remove first occurrence of value.
            Raises ValueError if the value is not present.
    """

    #  '+'  ==> list

      连接操作,将2个列表连接起来

      产生新的列表,原列表不变,本质上是调用了__add__()方法;

    # ‘*’  ==> list

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

    # 关于*的坑
    # 当列表内的元素为数值类型是,*则为简单的重复
    l1=[1,2,3]
    #
    # print(l1*3) # ==> [1, 2, 3, 1, 2, 3, 1, 2, 3]
    
    # 当列表内有引用数据类型的时候,* 则是复制的引用类型的内存地址;
    l2=[1,2,3,l1]
    l3=l2*3
    print(l2)
    print(l3)
    print('<==================================>')
    
    l2[3][0]=10 print(l3)
    
    '''
    [1, 2, 3, [1, 2, 3]]
    [1, 2, 3, [1, 2, 3], 1, 2, 3, [1, 2, 3], 1, 2, 3, [1, 2, 3]]
    <==================================>
    [1, 2, 3, [10, 2, 3], 1, 2, 3, [10, 2, 3], 1, 2, 3, [10, 2, 3]]
    '''

    3.7、列表的拷贝

    # 深拷贝(deepcopy)与浅拷贝(show copy,默认为浅拷贝)

    # 浅拷贝图解:

    # 深拷贝:实际是把指针的内容也拷贝了一份,拷贝的point和原来的point指向不同的内存空间了;

    # 实现深拷贝需要单独导入copy模块才能使用:copy.deepcopy(object)

     3.8、列表排序,反转

    # reverse()  返回None,将列表元素反转  (返回None,表示直接修改原列表,不会产生新列表)

    # sort(key=None,reverse=False) 返回None,默认为升序排列;

    1 l=[2,354,3,1,78,122]
    2 l.sort()
    3 print(l)
    4 '''
    5 [1, 2, 3, 78, 122, 354]
    6 '''

    3.9、随机数

    # 导入random模块

     1 import random
     2 
     3 # print(random.randint(0,1)) # 返回[a,b]之间的整数
     4 L=[1,2,3,4]
     5 # print(random.choice(l)) # 从非空序列的元素中随机挑选一个元素
     6 print(random.randrange(1,7,2))
     7 random.shuffle(L) # 对列表L进行洗牌操作
     8 print(L) # ==> [3, 2, 4, 1]
     9 
    10 '''
    11 sample(self, population, k)
    12 population:样本空间;
    13 k:取值个数
    14 '''
    15 print(random.sample(L,2)) # 表示从列表L中随机挑选2个数输出 ==> [4, 2]
  • 相关阅读:
    正确显示textarea中输入的回车和空格
    HmacSHA256算法(C# 和 Java)
    Java RSA分段加密
    穿越古代我能做啥?
    DOS常用命令
    C#泛型学习
    一步一步搭建Nuget私服
    深入理解HTTP协议
    PowerDesigner设置code和name不联动的方法
    log4net通过代码控制按分类输出
  • 原文地址:https://www.cnblogs.com/soulgou123/p/9436057.html
Copyright © 2011-2022 走看看