[Python][华为云Python编程创造营][学习笔记][03_Python的数据]

举报
John2021 发表于 2021/11/01 23:05:48 2021/11/01
【摘要】 1,Python数据类型    1.1,Python提供了6种内置数据类型        - Number(数值),String(字符串),List(列表),Tuple(元组),Dictionary(字典),Set(集合)。        - 这些数据类型如同容器一般用于存放数据。    1.2,Python中的数据类型可以做以下几种分类        - 有序:可以使用下标(索引)访问元素...

1,Python数据类型

    1.1,Python提供了6种内置数据类型

        - Number(数值),String(字符串),List(列表),Tuple(元组),Dictionary(字典),Set(集合)。
        - 这些数据类型如同容器一般用于存放数据。

    1.2,Python中的数据类型可以做以下几种分类

        - 有序:可以使用下标(索引)访问元素。
        - 无序:不可以使用下标(索引)访问元素。
        - 可变:可以被修改。
        - 不可变:不可以被修改。

    1.3,6种内置类型的结构分类

        img1.jpg

    1.4,Number(数值)

        1.4.1,Python3的数值类型支持:

            img2.jpg

        1.4.2,复数

            - 复数由实数部分和虚数部分构成。
            - 复数不能单独存在,它们总是和一个值为0.0的实数部分一起构成一个复数。
            - 虚数部分必须有后缀j或J。
            - 实数部分和虚数部分都是浮点数。

        1.4.3,数值的计算

            - 数值类型的基本操作:加(+),减(-),乘(*),除(/),取余(%),取整(//),乘方(**)。
            - 如果不同类型的数字(如int,float)进行运算,则结果类型为精度较高的那个类型。

print(1+2)  # 3
print(1-2)  # -1
print(1*2)  # 2
print(1/2)  # 0.5
print(1 % 2)  # 1
print(1//2)  # 0
print(1**2)  # 1

        1.4.4,Python中的计算函数

            - 求绝对值:abs(x)
            - 四舍五入:round(x)
            - 返回两个数值的商和余数:divmod(y,x)
            - 求最大值和最小值:max,min
            - 求和:sum

print(abs(-1))  # 1
print(round(3.14))  # 3
print(divmod(1, 2))  # (0,1)
print(max([1, 2, 3]))  # 3
print(min([1, 2, 3]))  # 1
print(sum([1, 2, 3]))  # 6

        1.4.5,math模块

            - Python的math模块提供了很多对浮点数的数学运算函数,同时还提供了cmath模块,cmath模块的函数跟math模块函数基本一致,区别是cmath模块运算的是复数,math模块运算的是数学运算。
            - math模块常用方法有:三角函数(sin,cos,tanh),获取绝对值(fabs),向上取整(ceil),向下取整(floor),获取阶乘(factorial),x的y次方(pow)

    1.5,字符和字符串

        - 字符指类字形单元或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。
        - 字符串是编程语言中最常见的一种数据类型由字符组成,具有以下特征:有限的字符集合,可以由汉字、数字、字母、符号组成,一般由引号包裹。

        1.5.1,Python中的String(字符串)

            - Python中字符串是一个由多个字符组成的序列。
            - Python中没有字符。
            - 字符的个数即为字符串的长度(可用len函数查看)。
            - 单个字符被认为是长度为1的字符串。
            - Python中的字符串是有序且不可变的。

        1.5.2,在Python中声明一个字符串有三种方式

            - 使用单引号('xxx')创建:'Python'
            - 使用双引号("xxx")创建:"Python"
            - 使用三引号("""xxx""",'''xxx''')创建:'''Python'''
            - 除了三种声明方式之外,还可以通过类型转化的方式str(obj),生成字符串
            - 三种方式的区别在于:使用单引号和双引号的字符串是一样的,不能换行;使用三引号的字符串是长字符串,可以还行。
            **思考一下**
            下列字符串哪个能用?
            A,"这是一个字符串'
            B,"
                这是一个字符串"
            C,"张三说:"这是一个字符串""
            D,'张三说:"这是一个字符串"'
            A选项,由于字符串是成对出现的,不能用。
            B选项,双引号不能换行,不能用。
            C选项,双引号把头尾引起来了,不能识别中间的"这是一个字符串",不能用。
            D选项,可以使用。

        1.5.3,特殊的字符串-转义字符

            - 在字符串中因为有一些字符因为本身具备一些功能,所以没有办法直接使用,如双引号和单引号。此时可以使用转义字符来实现这些符号的使用。
            - 转义字符:\。可以屏蔽符号原有的功能("张三说:\"这是一个字符串\"");加入特殊字母可以使用特殊功能;输出\,可以使用\\。

print("张三说:\"这是一个字符串\"")  # 张三说:"这是一个字符串"
print("Py\nthon")
# Py
# thon
print("\\")  # \

        1.5.4,常见的转义字符


            img3.jpg

            - 原始字符串:在字符串有一些\,但是不希望进行转义可以使用原始字符串。可以在字符串前加r或者R来实现。

print(r"py\nthon")

        1.5.5,字符串的运算

            - +:拼接两个字符串,a="hello";b="world" => a+b="helloworld"。
            - *:字符串乘以一个数字可以得到重复次数的新字符串,"a"*2 => "aa"。

        1.5.6,索引与切片

            - 获取字符串中的字符元素:因为字符串是个有序序列,所以我们在访问字符串中的某些元素时可以根据元素对应的下标(索引)来访问:str[n]。正向访问时下标从0开始,到字符串长度减1。逆向访问从-1开始,每次递减1。
            - 批量获取(切片):str[a:b:c],a是起始元素的位置,b是终止元素的位置,c是步长。
                abc同样可以是负值。当a为0,b为n,c为1时,可以省略不写:str[::](表示取所有);str[::2](每2个取1个)。
            - 注意:切片时一定要根据起始和终止位置设置步长;切片和索引可以用在Python中所有有序序列中。

Str = "Python"
print(Str[-4:-1:1])  # tho
print(Str[::])  # Python
print(Str[::2])  # Pto
print(Str[-5:-2:-1])  # " "
print(Str[-5:-2:1])  # yth

        1.5.7,字符串的常用操作

            img4.jpg

        1.5.8,字符串格式化输出

img5.jpg

        1.5.9,string模块

            - 在Python中,字符串本身内置了很多的操作方法和属性,除此之外Python还提供了一个字符串操作模块string。
            - 在Python3中string模块提供的方法,和字符串内置的方法相似度较高。

    1.6,Tuple(元组)

        - 元组是一个有序且不可变序列,其中的元素可以是任意对象。元组可以使用索引和切片的方式取值。
        - 元组中的数据一旦生成就无法更改。

        1.6.1,元组的创建

            - 元组存储的数据更加安全。(因为一旦生成不能更改)
            - 元组由一个小括号包裹,元素用逗号隔开。声明一个元组有三种方式:
                Tuple=tuple((obj1,obj2,...))  # 可以通过此方法将其他序列转为元组
                Tuple=(obj1,obj2,...)
                Tuple=obj1,obj2,obj3

        1.6.2,单元素元组

            - 如果在声明元组时元组只有一个元素,需要在元素后面加上逗号,告诉解释器这不是运算符中的括号。
            - 嵌套元组也是如此。

t = (4)
print(type(t))  # int
t = (4,)
print(type(t))  # tuple
print(type(((4))))  # int
print(type(((4,))))  # tuple

        1.6.3,元组的运算

            - +:拼接两个元组:

t = (1, 2, 3)
t1 = (3, 2, 1)
print(t+t1)  # (1, 2, 3, 3, 2, 1)

            - *:元组乘以一个数字可以得到重复次数的新的元组:

t = (1, 2, 3)
print(t*2)  # (1, 2, 3, 1, 2, 3)

    1.7,列表(List)

        - 列表是一个有序可变的序列,其中的元素可以是任意对象。
        - 列表可以使用索引和切片的方式取值。
        - 列表可以随意的修改,删除和增加元素。
        - 相较于元组而言,列表的安全性差,但是灵活性高。
        - 列表支持的运算符同元组一样。

        1.7.1,列表的创建方式

            - 列表由一个中括号包裹住元素,元素用逗号隔开。创建列表的方式有:
                List=list((obj1,obj2,...))  # 可以通过此方法将其他序列转为列表
                List=[obj1,obj2,...]
                列表推导式

        1.7.2,列表推导式

            - 推导式是可以从一个数据序列构建另一个新的数据序列的结构体,可以快速生成序列。
            - 列表推导式:
                [i for i in range(5)]  # [0,1,2,3,4]
                [i for i in range(5) i i%2]  # [1,3]
                [(x,y) for x in range(5) if x%2==0 for y in range(5) if y%2==1]  # [(0,1),(0,3),(2,1),(2,3),(4,1),(4,3)]

        1.7.3,列表常用操作

       img6.jpg

        1.7.4,列表与数组

            - Python中的列表在外观上和数组有些相似,但两者并不是一种结构:
                Python的内置数据结构中并没有数组。需要借助于工具包Numpy实现。
                列表可以和数组相互转化,但是本质是不一样的。

    1.8,Dictionary(字典)

        - 字典的每个元素由两部分组成 - 键和值,所以字典的元素也被称为键值对。
        - 其中键是不可变且唯一的。
        - 如果字典有相同的键,则后面的键对应的值会将前面的值覆盖。
        - 数据量大时,字典数据的访问速度比列表快。
        - 字典是无序可变的序列。

        1.8.1,创建字典

            - 字典由一对花括号包裹,元素由逗号隔开。常见的字典创建方式:
                Dict = {key:value,}
                Dict = dict(key=value,)
                Dict = dict([(key,value),])
                字典推导式

        1.8.2,字典的取值

            - 根据字典的键进行取值。

        1.8.3,字典常用操作


            img7.jpg


           img8.jpg

    1.9,Set(集合)

        - 集合中的元素是唯一的,重复的元素会被删除。
        - 集合是由一个花括号包裹,内部元素以逗号隔开。声明一个集合的方式有:
            Set = set()
            Set = {obj1,obj2,...}

        1.9.1,集合的运算:

            - 逻辑运算:
                交集 set1 & set2:两个集合中相同的元素。
                对称差集 set1 ^ set2:两个集合中不同的元素。
                并集 set1 | set2:两个集合内总共的元素(重复的删除)。
                差集 set1 - set2:集合一中包含而集合二中不包含的元素。

        1.9.2,集合的常用操作

            img9.jpg

        1.9.3,集合的小妙招


            - 当前有一个列表([1,2,3,1,2,1,4,5,2,5]),如何对列表中的数据进行去重操作?
                可以利用集合的元素唯一性特征,将列表转为集合完成去重,然后再转为列表。

2,Python数据的常用操作

    2.1,数据引用

        2.2.1,数据引用会产生的问题?下面的代码会发生什么情况?

L1 = [1, 2, [3, 4, 5]]
print(id(L1))  # 打印L1指向的内存地址为:37605120
L2 = L1
print(id(L2))  # 打印L2指向的内存地址为:37605120
L2[0] = 6
print("L1: ", L1)  # L1:  [6, 2, [3, 4, 5]]
print("L2: ", L2)  # L2:  [6, 2, [3, 4, 5]]

            - 运行后发现L1和L2的值都为[6,2,[3,4,5]]

        2.2.2,为什么为这样呢?

            - 因为Python中变量名是对于数据的引用。代码中L2=L1只是将L2指向了L1所指向的地址。
            - 通过id(L1)和id(L2)可以知道L1和L2指向的内存地址是一样的。

    2.2,数据拷贝

        2.2.1,Python中为了防止上述问题出现,可以使用拷贝的生成一份新的数据。

L1 = [1, 2, [3, 4, 5]]
print(id(L1))  # 打印L1指向的内存地址为:31248128
L2 = L1.copy()
print(id(L2))  # 打印L2指向的内存地址为:37982144
L2[0] = 6
print("L1: ", L1)  # L1:  [1, 2, [3, 4, 5]]
print("L2: ", L2)  # L2:  [6, 2, [3, 4, 5]]

            - 通过id(L1)和id(L2)可以知道L1和L2指向的内存地址是不一样的。

        2.2.2,但是在进行嵌套后,拷贝时发现问题依然存在。

L1 = [1, 2, [3, 4, 5]]
print(id(L1))  # 打印L1指向的内存地址为:31444736
L2 = L1.copy()
print(id(L2))  # 打印L2指向的内存地址为:31690688
L2[2][0] = 6
print("L1: ", L1)  # L1:  [1, 2, [6, 4, 5]]
print("L2: ", L2)  # L2:  [1, 2, [6, 4, 5]]

            - 通过id(L1)和id(L2)可以知道L1和L2指向的内存地址是不一样的,为什么数据还是会一样呢?

    2.3,深拷贝和浅拷贝

        2.3.1,在Python中对于数据的拷贝可以根据拷贝形式的不同分为深拷贝和浅拷贝。

        2.3.2,浅拷贝(copy()),即对数据的表面结构进行拷贝,如果数据为嵌套的结构,则嵌套结构里面的元素是对之前数据的引用。修改之前的数据会影响拷贝得到的数据。
        2.3.3,深拷贝(deepcopy()),解决了嵌套结构中深层结构只是引用的问题,它会对所有的数据进行一次复制,修改之前的数据则不会改变拷贝得到的数据。
        2.3.4,实现深拷贝:导入Python中的copy模块,使用模块中的deepcopy()方法。

import copy
L1 = [1, 2, [3, 4, 5]]
print(id(L1))  # 打印L1指向的内存地址为:38085952
L2 = copy.deepcopy(L1)
print(id(L2))  # 打印L2指向的内存地址为:39604160
L2[2][0] = 6
print("L1: ", L1)  # L1:  [1, 2, [3, 4, 5]]
print("L2: ", L2)  # L2:  [1, 2, [6, 4, 5]]

    2.4,运算符

        Python运算符大致可分为7种,即算术运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、成员运算符以及身份运算符。

        2.4.1,比较运算符

            - Python提供了6种比较运算符:>(大于);<(小于);==(等于);!=(不等于);>=(大于等于);<=(小于等于)。
            - 比较运算的结果是一个布尔值,True或者False。

b = 2
c = 3
print(b > c)  # False
print(b < c)  # True
print(b != c)  # True
print(b == c)  # False
print(b >= c)  # False
print(b <= c)  # True

        2.4.2,赋值运算符

            - Python形成了丰富的赋值运算符:=,+=,-=,/=,%=,*=,//=。

b = 2
c = 3
b = c
print(b)  # 3
b += c
print(b)  # 5
b -= c
print(b)  # -1
b /= c
print(b)  # 0.6666
b %= c
print(b)  # 2
b *= c
print(b)  # 6
b //= c
print(b)  # 0

            - 还可以多变量赋值:a,b,c=1,2,3  ;  A=B=C=1

        2.4.3,逻辑运算符

            - Python中3种逻辑运算符分别为:and(与),or(或),not(非),逻辑运算的结果是布尔值,True或者False。
                A and B:当A为False时,运算结果为False,否则返回B的值。
                A or B:当A为True时,运算结果为A的值,否则返回B的值。
                not A:当A为True时,返回False,否则返回True。

        2.4.4,位运算符

            Python中有6种位运算符:
                - (&):按位与运算符,参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。
                - (|):按位或运算符,只要对应的两个二进位有一个为1时,结果位就为1。
                - (^):按位异或运算符,当两对应的二进位相异时,结果为1。
                - (~):按位取反运算符,对数据的每个二进制位取反,即把1变为0,把0变为1。
                - (>>):右移动运算符,把>>左边的运算数的各二进位全部右移若干位,>>右边的数指定移动的位数。
                - (<<):左移动运算符,运算数的各二进位全部左移若干位,由<<右边的数指定移动的位数,高位丢弃,低位补0。

        2.4.5,成员运算符

            Python中有如下数据结构:字符串、列表、元组、字典。字符串、列表、字典,它们就像一个集合,其中包含若干元素,这些元素就是集合的成员,
            对于一个给定的元素,它有可能在一个给定的集合中,也可能不在,Python中采用成员运算符来判断元素是否属于成员,成员运算的结果为布尔值,
            True或者False。

temp1 = "ABCDEFG"
temp2 = [4, 2, 3, 5, 8, 9]
a = "CDE"
b = 5
c = "CDF"
print("a in temp1?", a in temp1)  # True
print("b in temp2?", b in temp2)  # True
print("c in temp1?", c in temp1)  # False

        2.4.6,身份运算符

            身份运算符用于比较两个标识符所引用对象的存储单元,计算结果为布尔值,包含两个运算符:is和is not,分别用于判断两个标识符是否引用自
            同一个对象。
            is与==区别:is用于判断两个变量引用对象是否为同一个,==用于判断引用变量的值是否相等。




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。