zoukankan      html  css  js  c++  java
  • 03-python基础语法_2.数据类型

    4-1-2 Python基础数据类型 - 7种

    (一).Outline

    1.整型(int)

    1.1py2 & py3的区别
    • 1.整数类型
    • 2.除法
    1.2强制转换2种类型可转。
    • int('str中的可渡之人')【重要】
    • int(bool)
    1.3进制
    • 4种进制介绍
    • 进制转换

    2.布尔类型(bool)

    强制转换

    • 1.其他6种数据类型均可转成bool。bool(int/str/list/tuple/dict/set)

    • 2.强制转换中bool为False的情况:7种0,'',[],(),{},set(),None

    3.字符串(str) -不可变。有序。

    3.0字符串定义

    (一).公共功能 -即,其他数据类型也可能会有的功能。

    3.1加 - str + str
    3.2乘数字 -str * int
    3.3索引/下标
    3.4切片
    • list -若取不到值,则打印空列表
    • str -若取不到值,则什么都不打印(计算机内部自动将str两边的引号去掉了)。
    3.5步长
    3.6for循环
    • for循环 -遍历str中的各元素
    • for循环+range:遍历str中各元素的索引
    3.7len
    3.8in 判断某字符是否在str中

    (二).str的方法

    写在前面:因为str是不可变数据类型,故对其进行操作,并不会对原来的值产生影响。而是生成一个新的字符串。这是由str本身是不可变数据类型所决定的。

    3.8字符串方法 :
    (1).常用方法 -11个。

    ps其他操作方法可去pycharm里查看源码操作:写上str,按住ctrl点进去。即可查看源码。

    • 1.全部大写 .upper() 返回值:新str

      • .upper() 全部变大写
      • .isupper() 判断是否全部是大写 返回值:bool
    • 2.全部小写 .lower() 返回值:新str

      • .lower() 全部变小写
      • .islower() 判断是否全部是小写 返回值:bool
      • .casefold() 将所有字符(拉丁文)全部变为小写 返回值:新str # py3中才有此功能。
      • 应用场景:字符串大小写做验证码
    • 3.判断是否以什么开头 .startswith('某字符/某序列') 返回值:bool

    • 4.判断是否以什么结尾 .endswith('某字符/某序列') 返回值:bool

    • 5.字符串替换 .replace('被替换的字符/子序列','要替换为的内容') 返回值:新str

      .replace('被替换的字符/子序列','要替换为的内容',1/其他数字) -从左到右数,替换掉str里的几个字符/子序列.

      • 格式
      • ps:
      • 应用场景:敏感字符替换
    • 6.去除头尾左边/右边/两边的空格/换行符(/n)/制表符(/t)/特定字符 返回值:新str

      • 去除str两边的空格/换行符/n/制表符/t/特定字符
      • rstrip .rstrip() -去除str右边的空格 返回值:新str
      • lstrip .lstrip() -去除str左边的空格 返回值:新str
      • strip .strip() -去除str两边的空格 返回值:新str
      • str.rstrip/lstrip/strip('要去除的字符') 返回值:新str
      • 去除str里边的空格/换行符/n/制表符/t
        • str.replace('空格/换行符/n/制表符/t', '')
    • 7.拼接 -用某符号(连接符) 将str的各字符连接起来。 '连接符'.join(序列)返回值:新str

      ps: 序列里的元素必须全部是str才能用join拼接!!

    • 8.分割 .split('根据str里的某字符进行分割') 返回值:list。list里的元素均是str片段。

      .split('根据str里的某元素进行分割',1/其他数字) -从左向右数,分割前几个。 返回值:list。

      .rsplit('根据str里的某元素进行分割',1/其他数字) -从右向左数,分割前几个。 返回值:list。

      • ps:is系列的返回值是bool
      • split -从左到右切
      • rsplit -从右向左切

      拓展(了解):.partition/rpartition('str中的某字符-->分割符') # 总共分成3份:前 分割符 后。

    • 9.字符串格式化 -3种 %,.format,f

    • 10.is系列 .isdecimal() 返回值:bool。

      • ps
      • 判断str中是否是十进制数字 .isdecimal()
        • .isdecimal() -好! # '1'-->True; '二'-->False; '②'-->False
        • .isdigit() # '1'-->True; '二'-->False; '②'-->True
        • .isnumeric() # '1'-->True; '二'-->True; '②'-->True
      • 判断str中是否是数字/字母/数字+字母 .isalnum()
      • 判断str中是否是汉字/字母/汉字+字母 .isalpha()
    • 11.str的编码(把str-->二进制) *******

    • 12.练习题

    • 13.写在最后strip、split分左右。lstrip/rstrip/strip -3种,split/rsplit -2种

    (2).不常用方法
    • 1.首字母大写 .capitalize() 返回值:新str
    • 2.大小写转换 .swapcase() 返回值:新str
    • 3.统计某字符/子序列出现的次数 .count('某字符') 返回值:int
    • 4.查找某字符的索引位置
      • .find('某字符') 若字符不存在,则返回-1
        • .find('某字符') # 从左边开始找
        • .rfind('某字符') # 从右边开始找
      • .index('某字符') 若字符不存在,则报错
        • .index('某字符') # 从左边开始找
        • .rindex('某字符') # 从右边开始找
    • 5.居中 .center(总长度, '两边的填充物') # 不写填充物,则默认用空格填充。
    • 将str居中 .center(总长度, '两边的填充物')
      • 将str居左 .l just(总长度, '右边的填充物')
      • 将str居右 .r just(总长度, '左边的填充物')
    • 6.将str中每一个单词的首字母变成大写 .title()
    • 7.判断str是否是空白 .isspace() # 空str,判定为False。返回值:bool。

    (三).强制转换

    写在前面-1:int和bool2种可直接转list/tuple/dict/set此4种容器类要想转成str,要通过str的join方法

    写在前面-2:用join时,序列里的元素必须全部都是str类型才可以转。

    写在前面-3:当要拼接的序列是dict时,转换的只是dict的key

    • str(999) # '999'
    • str(true) # 'True'
    • list-->str ,s1 = ''.join(li) # li里的元素必须是str
    • tuple-->str,s2 = ''.join(tu1) # tuple里的元素必须是str
    • dict-->str, s3 = ''.join(dict1) # 转换的只是dict的key
    • set-->str,s4 = ''.join(set1) # set里的元素必须是str

    4.列表(list) -可变数据类型。有序。

    4.0列表定义

    (一).公共功能 -10个全都具备。

    4.1列表相加

    4.2列表*int

    (1). -索引,切片,步长。for循环。4种公共方法查。

    4.3索引

    4.4切片

    • list -若取不到值,则打印空列表
    • str -若取不到值,则什么都不打印(计算机内部自动将str两边的引号去掉了)。

    4.5步长

    4.6for循环 只适用于可迭代的数据类型str/list/dict/set/tuple

    • for循环 -遍历list中的各元素
    • for循环+range:遍历list中各元素的索引
    • for循环的嵌套。-拆了再拆,适用于list元素中的可迭代类型。

    4.7len

    (2). -公共1种。(独有3种) # 仅仅是删除,没有返回值,也不报错。

    4.8删除 list中的某个/某些元素 。

    写在前面只适用于可变数据类型中的:list/dict(set虽可变,但无序,故不能索引)。

    • del li[索引] 按索引
    • del li[起:终] 按切片
    • del li[起:终:步长] 按步长,跳着删

    (3). -只有公共这1种。

    4.9修改list中的某元素 li[索引] = '新元素'

    • 最外层元素:对于本层元素,不管可变不可变都可修改

    • 深层元素:不可变数据类型的元素(str/int/bool),不能修改

      可变数据类型元素(list/dict/tuplr/set),可以修改

    4.10练习题

    4.11in

    (二).list的方法 -增&删&反转/排序/统计/通过元素 获取索引。

    写在前面:list和str不一样。list是可变数据类型.。故,对其进行操作,会直接在原来的对象上产生变化。

    (4).增 -3种。

    4.9列表的增
    • append 追加
    • insert 插入
    • extend 迭代着添加

    (5).删 -3种。

    4.10列表的删
    • pop 根据索引删。a.不写索引,默认删最后一个;b.可以设置返回值
    • remove 根据元素删。没有则报错
    • clear 清空
    4.11列表的其他操作
    • 反转
    • 排序
    • 统计
    • 通过元素 获取下标/索引

    (三).list的嵌套

    • 取值 -根据索引一层一层取值。
    • 改值 -先找到要修改的元素,根据li[索引] [索引]...[索引] = 新值的格式去做改值操作。

    (四).list的强制转换

    写在前面-1:只能将容器类的数据类型转换为list。

    写在前面-2:str-->list,是将str的每个字符作为list的元素。

    (五).list的坑 -2个。

    • 1.循环添加
    • 2.列表循环删除

    5.元组(tuple) -不可变。有序。

    • 5.0定义

    (一).公共功能 -共7个。tuple不能删和改。

    5.1元组相加
    5.2元组*int
    5.3索引
    5.4切片
    5.5步长
    5.6for循环
    5.7len
    5.8in

    (二).tuple的方法(无)

    (三).tuple的强制转换 -同list。

    6.字典(dict) -可变。3.5版本后开始有序。

    6.0字典定义
    6.0‘字典的创建方式 -3种

    (一).公共功能 -

    6.1索引
    6.2for循环
    6.3len
    6.4修改 dict['键'] = '值' #键存在,则改值;键不存在,则添加键值对。
    6.5删除 del dict[键] #通过键删除键值对。
    6.6in -判断字典中的键/值/键值对是否在dict中。

    (二).字典的方法 -keys,values,items。

    1.keys,values,items 3种。**
    • 获取字典的键
    • 获取字典的值
    • 获取字典的键值对
    • 解构
    • 循环字典获取键/值/键和值。
    2.查 dict.git('键',返回值) ** # 键不存在,不报错,可以自定义返回的结果。
    3.删 dict.pop('键') 可以看到删除的值(不常用)
    4.增 dict.update({'键':值,'键':值}) 键不存在,增加键值对;键存在,则更新(覆盖)(不常用)

    (三).字典的嵌套

    (四).字典的坑 -fromkeys。

    7.集合(set) -可变。无序。

    7.0定义

    (一).公共功能 -

    7.1for循环
    7.2len
    7.3in -判断字典中的键/值/键值对是否在dict中。

    (二).集合的方法 -增&删&求交/并/差/对称差集。

    • add 追加 **
    • set.update({要增加的集合}) 批量增加 *
    • discard 删除 ** # 元素不存在,不会报错
    • 交集:set.intersection(集合/列表/元组) 或 set1 & set2。
    • 并集:set.union(集合/列表/元组) 或 set1 | set2。
    • 差集:set.difference(集合/列表/元组) 或 set1 - set2。# 谁在前面就是求谁的差集
    • 对称差集(反交集):set.symmetric_difference(集合/列表/元组) 或 set1 ^ set2。

    8.None -一种特殊的数据类型。

    • None是种特殊的数据类型,该类型表示空(无任何功能,专门用于提供空值)。

    9.常用的类型转换_小结

    10.七种数据类型_小结

    • 7种数据类型对比
    • 公共功能小结

    11.for循环

    12.len -获取长度(仅适用于7种数据类型中的:str/list/tuple/dict/set,int和bool不行)

    • 使用while循环 -打印str/list/tuple/dict/set中的每个元素
    • 使用for循环 -打印str/list/tuple/dict/set中的每个元素

    13.内置函数: range() -用在for循环中。

    14.内置函数: type()

    (二).Content

    一.整型 int

    def:int数字/整型(整数类型):eg:666,7and so on,被称为数字/整型。
    

    01

    ps:int可进行+-*/ 等运算

    1.在py2 & py3中的区别:2个

    (1). 整数类型不同

    • 在python2x(2.7.16版本之前的版本)中:对int的长度有限制

      在32位机器上,整数的位数为32位,取值范围为-2 * * 31~2 * * 31-1,即-2147483648~2147483647;

      在64位系统上,整数的位数为64位,取值范围为-2 * * 63~2 * * 63-1,即-9223372036854775808~9223372036854775807;

      超出长度之后就会变为long类型(长整型)。

    • 在python3x中:

      只有int没有long,所有数字都是int类型。

    • 小结:

      在py2x中,有int和long类型,如果用户输入的数字特别大,py2会自动将int转换成long类型;

      在py3x中,只有int,没有long。所有的整形全部用int来代指。

    • try一下:
      02
      03

    (2).python2中做整型除法时,只能保留整数位,如果想要保留小数位,必须先导入一个模块

    # from __future__ import division  # division 除法;  # 2个_.
    value = 9/2
    print(value)  #4.5
    

    2.强制转换2种类型可转。

    • int('str中的可渡之人')【重要】
    # str -->int  只渡可渡之人。
    s = '18'  # str里必须是数字才可转int。
    value = int(s)
    print(value)  # 18
    
    • int(bool)
    # bool -->int
    v1 = int(True)
    v2 = int(False)
    print(v1, v2)  # 1 0
    

    3.进制

    (1). 四种进制

    • 二进制计算机只认识二进制。计算机底层使用的是二进制语言(机器语言)。一般是0b开头。

      对于计算机而言无论是文件存储/网络传输输入本质上都是:二进制(010101010101)。
      如:电脑上存储视频/图片/文件都是二进制;QQ/微信聊天发送的表情/文字/语言/视频也全部都是二进制。

      ps: 对于计算机而言

    • 八进制:计算机内部使用。

    • 十进制:通常人脑使用的就是十进制。一般情况下计算机可以获取十进制,然后在内部会自动转换成二进制并操作。

    • 十六进制一般用于表示二进制(用更短的内容表示更多的数据)。经常用来表示大数据。因为相比其他3种进制而言,十六进制的10-15只用一位表示,简洁。一般是x开头。

    (2). 进制转换
    • 十进制 -->二进制

      • 采用"除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

      img

     42  -----> 0010 1010  # 逆序排列,自右向左写,不够8位用0补齐
    
    • 二进制 -->十进制

      • 采用二进制上的数字乘以2的位数次方,再相加.(自右向左8位依次是2**0,...2的7次方)
      0001 1010     ------> ?  26
      b = 1*2**1 + 1*2**3 + 1*2**4   # 幂次:自右向左8位依次是2**0,...2的7次方。
      # print(b)  # 26
      
    • bit_length() 十进制转化成二进制的有效长度(有效位数)

      # bit_length 有效的二进制的长度
      a = 4
      print(a.bit_length())  # 3
      

    二.布尔值 bool

    2.1布尔值

    def:布尔值(bool):True/False,判断真假。
    
    1.python语法     人类语言      计算语言
    2.  True           真            1
    3.  False          假            0
    

    举例:

    2.2强制转换:

    • 1.其他6种数据类型均可转成bool。bool(int/str/list/tuple/dict/set)
    • 2.强制转换中bool为False的情况:7种0,'',[],(),{},set(),None

    三.字符串 str/string -不可变。有序。

    3.0 字符串的定义

    def:字符串(str):被英文单/双/三引号引起来的(凡是被引号引起来的),一般称为字符串。可以保存少量数据并进行相应的操作。         
    eg:'xiaohei' or "吕布" or """小吕布真可爱"""/'''吕布是暖男'''。
    

    **ps-1: ** 单双引号可以配合使用,以作区分。但同一个str的首尾引号要一致。

    ps:单双引号切换英文模式下,不按shift是单引号,按shift是双引号。

    eg:打印 吕'布 and 吕"布。

    代码运行结果如下:

    ps-2:三引号引起来的内容,是支持换行的字符串。它仍是str,只不过可换行而已。

    或:

    :在代码文件中,三引号可用于多行注释'''注释内容'''/"""注释内容""",它依然是个str,只不过没有被引用而已。

    ps:前面有变量接收,那它就是个str,前面若没有变量接收,那它就是个多行注释。

    (一).公共功能 -即,其他数据类型也可能会有的功能。

    3.1字符串加 - str + str

    运算规则:字符串+字符串,即字符串的拼接

    s1 = "5"
    new_s = s1 + "20"
    print(new_s)   # 520     
    

    ps:字符串的拼接是将引号里的内容直接拼接到一起,而不是进行运算。若遇到str中的可渡之人,要与整型的相加区分开,看好是str相加还是int相加。

    注:字符串不能和int相加,否则报错。因为2者数据类型不同,故不能相加。要转换后再进行运算。

    3.2字符串乘 - str * int

    运算规则:字符串×int !!!

    ps:乘的只能是int。

    运行结果是:int个这样的str拼接到一起

    3.3 索引/下标

    写在前面:str里的每一个字符均有其对应的索引。根据索引我们可以找到str中的某个字符。

    defval = str[索引],val就是根据索引取到的str中的某字符。

    str的索引有两种排序方式:

    1.从左向右排序,第一个索引(str左边第一个字符的索引)是0

    2.从右向左排序,第一个索引(str右边第一个字符/str倒数第一个字符的索引)是-1

    ps-1:根据索引取值 -取到的某个字符仍是str类型。

    ps-2:根据索引取值时,2种索引排序方式,要取的元素离哪边近就从哪边开始数(怎么方便怎么取)。

    ps-3:根据索引取值 -超出索引范围,会报错。

    3.4 切片

    写在前面(坑)

    • 1.list -若取不到值,则打印空列表
    • 2.str -若取不到值,则什么都不打印(计算机内部自动将str两边的引号去掉了)。
    # 看代码写结果:
    l1 = [1, 2, 3, 4, 5]
    print(li[10:])  # []
    
    s = '1,2,3,4,5'
    print(s[10:])  # 什么都不打印。
    # 诠释:按理说结果应该是空str,但最后却什么都不打印。这是因为计算机内部自动将str两边的引号去掉了。
    

    def:[起始位置的元素索引 : 终止位置的元素索引+1],中间必须使用分号

    ps-1:切片 -右边是开区间,取不到。 (-终止位置索引对应的字符取不到,取到的是它前面的哪个字符)

    即,想取到谁,就顺着x轴往右顺延一个(无论索引是正序/倒序都是向右顺延,因为步长默认1->正序,故向右顺延)

    终止索引算数+1

    ps-2从头开始取,规定头写成空。eg: value = name[:3] ;

    ps-3取到尾,规定尾写成空。eg:value = name[2:] -代表从索引2的字符一直取到最后1个字符。

    ps-4从头取到尾 -全切:[:]

    ps-5:切片/步长取值时,务必保证索引的方向和步长的方向一致!

    ps-6:切片取值,不写步长,则步长默认是1 -正序。 —故索引方向必须也是正序!

    ps-7:你写的0,计算机会默认它是正序起始的0而不是倒序起始的-1往右顺延1得到的0!!!

    故,在写切片的首尾时,一定要书写规范,if是从头切/取到尾,则一定要写成空!可以避免出错!

    示例1:注意切片取值中什么都不打印的例子。

    示例2步长取值中结果什么都不打印的例子:

    原因:也是索引方向和步长方向反向了导致2者无交集,故结果什么都取不到。)

    练习题

    # 需求:让用户输入任意一个str,取这个str的最后2个字符。
    方法一:
    data = input('请输入:')
    value = data[-2:]
    print(value)
    
    方法二:len -更严谨,因为可加个if判断这个str够不够2个字符再取切片。
    data = input('请输入:')
    total_len = len(data)
    value2 = data[total_len - 2:total_len]
    print(value2)
    
    # 完整版:
    value = input('请输入内容:')
    total_len = len(value)
    if total_len >= 2:
        val = value[total_len - 2:total_len]
        print(val)
    else:
        print('输入有误')
    

    3.5 步长

    def:[起始位置的字符索引 : 终止位置的字符索引 : 步长],中间必须使用分号

    ps:前面的切片部分依然沿用切片取值的规则和ps。

    (1).切片的ps:

    ps-1:切片 -右边依然是开区间,取不到。-要想取到某个字符,要将该字符对应的索引沿步长方向往后顺延1

    ps-2:3种书写规则

    a.从头开始取规定头写成

    b.取到尾规定尾写成。-切记不要写成0!!计算机会默认这个0是正序起始位置的0。如此一来,就会导致索引方向与步长方向反向,最后啥都取不到!

    c.全取是str[:]

    (2).步长的ps:

    ps-1:步长是几就从起始位置开始沿着步长方向查几个字符之间的间隔。-步长是几就查几个间隔,即就走几步。

    ps-2步长是正数,则是正序取;步长是负数,则按倒序取。

    ps-3:步长取值时,要保证索引的方向和步长的方向一致! -如果反向了,则什么都取不到。什么都不打印。

    ps-4步长为负时倒序取值,取出来的str也是倒着的!!!

    ps-5步长为负时,倒序取值,此时切片的尾是向左顺延1。

    示例:

    (3).interview

    # 需求:将str进行翻转。 # 8种方法。
    # 写在前面:str的方法里没有revers功能,revers是list的功能。数据类型的方法不要混淆!
    # 法一(推荐):步长 -最简单。
    name = '吕布睡着了'
    new_value = name[::-1]
    print(new_value)
    
    # 法二:while 循环 + str相加。
    name = '吕布睡着了'
    result = ''
    index = len(name) - 1
    while index >= 0:
        result = result + name[index]
        index -= 1
    print(result)
    
    # 法三(变态-不推荐):for循环 + str相加。 -把for当成while来用。只不过不用手动自加让其转起来。
    result = ''
    index = len(name) - 1
    for item in name:
        result = result + name[index]
        index -= 1
    print(result)
    
    # 法四:for循环 + str相加 + range倒序。
    result = ''
    max_index = len(name) - 1
    for item in range(max_index, -1, -1):
        result = result + name[item]
    print(result)
    
    # 法五(推荐):str转为list,用list的独有方法-reverse。再将列表用join转回str。
    s = '吕布睡着了'
    l = list(s)
    l.reverse()
    reversed_s = "".join(l)  # 用join将序列str/列表/元组/字典中元素用某连接符连起来。
    print(reversed_s)        # 返回值:新str。
    # 结果:了着睡布吕
    
    # 法六:while循环 + 列表 + join。
    s = '吕布睡着了'
    li = []
    index = len(s) - 1
    while index >= 0:
        li.append(s[index])
        index -= 1
    result_s = ''.join(li)
    print(result_s)
    
    # 法七:for循环 + 列表 + range + join。
    s = '吕布睡着了'
    li = []
    for item in range(len(s) - 1, -1, -1):
        li.append(s[item])
    result_s = ''.join(li)
    print(result_s)
    
    # 法八:for循环 + 列表 + reversed(字符串/列表/元组) + join。
    # 写在前面:补充一个知识点。
    # 1.reversed()是个序列,一般和for循环一起使用。不能单独使用。
    # 2.它的应用对象只能是有序的数据类型:str/list/tuple。dict和set均无此方法(因为2者内部是利用hash算法存储和查询的,无序)。
    # 3.reversed(字符串/列表/元组)内部代表将str/list/tuple进行反转。但表现不出来。只能和for一起使用。
    # 示例1:
    s = 'abc'
    for i in reversed(s):
        print(i)
    结果:
    c
    b
    a
    # 示例2:
    li = [1, 2]
    for i in reversed(li):
        print(i)
    结果:
    2
    1
    # 示例3:
    tu = (1, 2)
    for i in reversed(tu):
        print(i)
    结果:
    2
    1
    # 本题:
    s = '吕布睡着了'
    li = []
    for item in reversed(s):
        li.append(item)
    result_s = ''.join(li)
    print(result_s)
    # 结果:了着睡布吕
    

    3.6 for循环

    • 写在前面-1:for循环内部自加,不需要我们再去自加让其转起来。

    • 写在前面-2for循环的对象必须可迭代。eg:字符串/列表/字典/元组/集合这5种可迭代的类型and其他可迭代的序列(eg:range())。)

    • 写在前面-3:for循环可嵌套

    • 写在前面-4breakcontinue在for循环中依然适用

    • 格式

      for 变量 in 序列:
      	循环体内容
      

      示例:

      # 需求:遍历字符串中的每一个元素。
      value = '吕布666'
      for item in value:
          print(item) 
      结果:
      吕
      布
      6
      6
      6
      
    • ps

      # ps-1:与for平齐的行,只打印for循环的序列中的最后一个元素。
      value = '吕布'
      for item in value:
          print(item) 
      print(item)  # 只打印最后一个元素。
      # 结果:
      吕
      布
      布
      
      # ps-2:break和continue在for循环中依然适用。
      value = '吕布666'
      for i in value:
          print(i)
          break
      # 结果:吕
      value = '吕布666'
      for i in value:
          print(i)
          break
          print('啊哈')  # 不打印。
      # 结果:吕
      value = '吕布666'
      for i in value:
          print(i)
          continue
          print('啊哈')  #不打印。
      # 结果:
      吕
      布
      6
      6
      6
      
    • for和while的应用场景:

      # 有穷尽优先使用for,无穷尽用while。
      
    • 练习题

      1.遍历str中的各元素

      content = 'MrLin_儒雅先生'
      for item in content:
          print(item)
      

      2.遍历str各元素的索引

      content = 'MrLin_儒雅先生'
      max_index = len(content) -1
      for item in range(0,max_index + 1):
          print(item)
      

    3.7 len -获取长度

    (1).definition

    ps-1:仅适用于7种数据类型中的可迭代类型(容器类):str/list/tuple/dict/set,int和bool不行。

    ps-2:len(5种数据类型)的返回值判断依据。

    对于str,返回值是:str中的字符个数;

    对于list,返回值是:list中的元素个数;

    对于tuple,返回值是:tuple中的元素个数;

    对于dict,返回值是:dict中的键值对的个数;

    对于set,返回值是:set中的元素个数。

    示例

    (2).应用

    1.使用while循环 -打印str/list/tuple/dict/set中的每一个元素

    • 使用while循环遍历str中的每一个元素:
    value = '吕布666'
    index = 0
    while index <= len(value) - 1:
        val = value[index]  # 根据索引取值。
        print(val)
        index += 1
    

    2.使用for循环 -打印str/list/tuple/dict/set中的每一个元素

    写在前面:for循环时可以循环的数据结构必须是可迭代的:str/list/tuple/dict/set,int和bool不行。

    • 使用for循环遍历str中的每一个元素:
    value = '吕布666'
    for i in value:
        print(i) 
    # 结果:
    吕
    布
    6
    6
    6
    

    (3).练习题

    1.需求:让用户输入任意字符串,获取字符串之后计算其中有多少个数字。
    (1).while循环:
    content = input('请输入内容:')
    index = 0
    count = 0
    while index <= len(content) - 1:
        val = content[index]
        if val.isdigit():
            count += 1
        index += 1
    print(count)
    (2).for循环:
    content = input('请输入内容:')
    count = 0
    for i in content:
        if i.isdigit():  # i.isdigit()的返回值就是True/False,如果是True(即if的条件是True),
            count += 1   # 则满足if的条件,就会执行if里面的内容。
    print(count)
    2.需求:让用户输入任意一个str,取这个str的最后2个字符。
    方法一:
    data = input('请输入:')
    value = data[-2:]
    print(value)
    
    方法二:len -更严谨,因为可加个if判断这个str够不够2个字符再取切片。
    data = input('请输入:')
    total_len = len(data)
    value2 = data[total_len - 2:total_len]
    print(value2)
    
    # 完整版:
    value = input('请输入内容:')
    total_len = len(value)
    if total_len >= 2:
        val = value[total_len - 2:total_len]
        print(val)
    else:
        print('输入有误')
    

    3.8 in -判断某字符是否在str中

    • 写在前面:判断某元素是否在序列中,对str/list/tuple/dict/set/range/dic.keys()/dic.values()/dic.items()均适用(只要是序列就适用)。其中,dict只是判断的键。
    # 需求:让用户输入内容,判断用户输入的内容中是否含有敏感字符'你胖了',若含有,则用***替换。
    content = input('请输入内容:')
    if '你胖了' in content:
        content = content.replace('你胖了','***')
    print(content)
    # 结果:
    请输入内容:你胖了好多
    ***好多
    

    (二).str的方法

    写在前面:因为str是不可变数据类型,故对其进行操作,并不会对原来的值产生影响。而是生成一个新的字符串。这是由str本事是不可变数据类型所决定的。

    3.8 字符串方法

    (1).常用方法 -11个。

    ps其他操作方法去pycharm里查看源码操作:写上str,按住ctrl点进去。即可查看源码。

    1.全部变大写

    # 全部变大写:
    # 格式:str.upper()  # 变身 -固定格式
    s = 'MrLIn'
    new_s = str.upper()  # 返回值:新str。
    print(new_s)  # 必须打印新str才能看到修改效果。
    # 结果:MRLIN
    
    # 判断是否全部是大写:
    # 格式:str.isupper()
    s1 = 'LVBU'
    print(str.isupper())  # 返回值:bool。
    # 结果:True
    

    2.全部变小写

    # 1.全部变小写:
    value = '吕布STRONG'
    new_value = value.lower()  # 返回值:新str。
    print(value,new_value)
    # 结果:吕布STRONG 吕布strong
    
    # 2.判断是否全部是小写:
    value1 = 'handsome'
    print(value1.islower())  # 返回值:bool。
    # 结果:True
    
    # 3(了解).将所有字符变为小写(eg:拉丁文等)   # 只有py3版本才有的功能。
    格式:new_s = s.casefold()  # 返回值:新str。
    print(new_s)
    

    ps-1:字符串的方法均不会影响原来的str而是生成一个新的str。要打印新str才能看到变身后的结果。

    ps-2:此方法变身后的结果是个新str

    应用场景字符串大小写做验证码

    # 比较用户输入的验证码(全部大写后)是否和已给验证码大写后一致.
    check_code = 'iCbC'
    code = input('请输入验证码 %s :' % (check_code,))
    if code.upper() == check_code.upper(): 
        print('登录成功')
    
    或:
    # 比较用户输入的验证码(全部小写后)是否和已给验证码小写后一致.
    check_code = 'iCbC'
    code = input('请输入验证码 %s :' % (check_code,))
    if code.lower() == check_code.lower(): 
        print('登录成功')
        
    # 完整版:
    username = input('输入用户名:')
    password = input('输入密码:')
    check_code = 'AcBc'
    code = input('输入验证码:')
    if code.upper() == check_code.upper():
        if username == '吕布' and password == '123456':
            print('登录成功')
        else:
            print('用户名或密码错误')
    else:
        print('验证码错误')
    

    3.判断是否以什么开头

    flag = str.startswith('某字符'/'某序列')
    print(flag)  # 返回值:bool
    

    示例:

    # 需求:判断字符串data是否以吕布开头
    # 方法一:
    data = '吕布so handsome'
    val = data[:2]
    if val == '吕布':
        print('Y')
    else:
        print('N')
    
    # 方法二:
    data = '吕布so handsome'
    flag = data.startswith('吕布')
    if flag:
        print('Y')
    else:
        print('N')
        
    # 简写:
    data = '吕布so handsome'
    if data.startswith('吕布'):
        print('Y')
    else:
        print('N')
    

    4.判断是否以什么结尾

    .endswith('某字符/某序列')  # 返回值:bool
    

    示例:

    # 需求:判断字符串data是否以狗粮结尾
    # 方法一:
    data = '吕布so handsome,真想多喂它点狗粮'
    total_len = len(data)
    val = data[total_len - 2:]
    if val == '狗粮':
        print('Y')
    else:
        print('N')
    
    # 方法二:
    data = '吕布so handsome,真想多喂它点狗粮'
    flag = data.endswith('狗粮')
    if flag:
        print('Y')
    else:
        print('N')
    
    # 简写:
    data = '吕布so handsome,真想多喂它点狗粮'
    if data.endswith('狗粮'):
        print('Y')
    else:
        print('N')
    

    5.字符串的替换

    格式:

    str.replace('大爷','**')   # 将str中的大爷用**来替换 -全部替换掉。
    
    str.replace('大爷','**',1)  # 从左到右数,只替换str里的第一个‘大爷’。
    
    str.replace('大爷','**',2)  # 从左到右数,替换str里的前两个‘大爷’。
    

    ps-1:字符串的此操作方法不会影响原来的str而是生成一个新的str

    打印新str才能看到变身后的结果。

    ps-2变身后的结果仍是str

    ps-3:只能从左到右替换,没有从右向左替换这种操作方法。

    示例:

    msg = '吕布真可爱,还真舍不得送给你大爷。舍不得送给你大爷!舍不得送给你大爷!'
    new_msg = msg.replace('大爷','**')
    print(new_msg)
    # 结果:吕布真可爱,还真舍不得送给你**。舍不得送给你**!舍不得送给你**!
    msg = '吕布真可爱,还真舍不得送给你大爷。舍不得送给你大爷!舍不得送给你大爷!'
    new_msg = msg.replace('大爷','**',1)
    print(new_msg)
    # 结果:吕布真可爱,还真舍不得送给你**。舍不得送给你大爷!舍不得送给你大爷!
    msg = '吕布真可爱,还真舍不得送给你大爷。舍不得送给你大爷!舍不得送给你大爷!'
    new_msg = msg.replace('大爷','**',3)
    print(new_msg)
    结果:吕布真可爱,还真舍不得送给你**。舍不得送给你**!舍不得送给你**!
    

    应用场景敏感字符替换

    练习题:

    # 需求:让用户输入内容,判断用户输入的内容中是否含有敏感字符'你胖了',若含有,则用***替换。
    content = input('请输入内容:')
    if '你胖了' in content:
        content = content.replace('你胖了','***')
    print(content)
    # 结果:
    请输入内容:你胖了好多
    ***好多
    

    拓展:关于成员运算符in的使用

    
    

    6.去除str头尾两边的空格/换行符( )/制表符( )/特定字符 返回值:新str

    ps-1:字符串的此操作方法不会影响原来的str而是生成一个新的str

    打印新str才能看到变身后的结果。

    ps-2变身后的结果仍是str

    ps:the meaning of strip is 去除

    • 去除str两边的空格/换行符( )/制表符( )/特定字符

    • rstrip .rstrip() -去除str右边的空格/换行符( )/制表符( )/特定字符 返回值:新str

    • lstrip .lstrip() -去除str左边的空格/换行符( )/制表符( )/特定字符 返回值:新str

    • strip .strip() -去除str两边的空格/换行符( )/制表符( )/特定字符 返回值:新str

    • 去除str两边某个/某些字符 str.rstrip/lstrip/strip('要去除的字符') 返回值:新str

    ps:制表符 相当于1个tab键(2个空格)

    # 制表符:	
    s1 = 'a	MrLin'
    print(s1)  
    # 结果:a	 MrLin
    
    # 换行符:
    
    s1 = 'a
    MrLin'
    print(s1)
    # 结果:
    a
    MrLin
    
    • 去除str里边的空格/换行符( )/制表符( )

      • str.replace('空格/换行符( )/制表符( )', '')
    • 示例:

    7.连接

    写在前面:join是str的独有操作方法。join前面的连接符是以str形式存在的,但join后面可以是任意序列,只要可迭代即可。

    ps序列里的元素必须全部是str,才能用join去拼接!!

    what:将某序列的各元素之间用某连接符连起来。

    格式'连接符'.join(序列)

    原理在join内部会循环该序列的每个元素,并在元素和元素之间加入连接符。

    ps返回值:新str !!(不管要连接的序列是str/list/dict/tuple/set/其他,拼接后都是str形式。)

    示例:

    # '连接符'.join(字符串)
    data = '123'
    new_data = '+'.join(data)
    print(new_data)
    结果:'1_2_3'
    
    # '连接符'.join(列表)
    练习一:有列表user = ['吕布', '妥妥', '大黄'],用逗号将list中的元素拼接成字符串'吕布,妥妥,大黄'。
    users = ['吕布', '妥妥', '大黄']
    new_str = ','.join(users)
    print(new_str)
    
    # '连接符'.join(元组)
    练习二:有元组tuple1 = ('吕布', '妥妥', '大黄'),用逗号将tuple中的元素拼接成字符串'吕布,妥妥,大黄'。
    tuple1 = ('吕布', '妥妥', '大黄')
    new_str = ','.join(tuple1)
    print(new_str)
    
    # '连接符'.join(字典)   # 只是拼接的键。
    dict1 = {'name': '吕布', 'age': 18}
    new_str = '_'.join(dict1)
    print(new_str)
    # 结果:name_age
    

    练习题:

    # 需求:用_将str中的每个字符连接起来。ps:用2种循环 + str方法去实现。
    # 法一:for循环
    name = '123'
    value = name[0]
    for i in name[1:]:
        value = value + '_' + i  # value += '_' + i
    print(value)
    # 法二:while循环
    name = '123'
    index = 1
    value = name[0]
    while index <= 2:
        value = value + '_' + name[index]
        index += 1
    print(value)
    # 法三:
    name = '123'
    new_name = '_'.join(name)
    print(new_name)
    # 结果:1_2_3
    

    8.分割 .split('字符串中的某字符->分割符')

    ps-1:字符串的此操作方法不会影响原来的str返回值:列表

    ps-2:是按str已有的元素,进行str的切割。

    ps-3切割后的每小段,依然是str

    ps-4:分割后的结果是将每段str放进list里!!

    a.split -从左到右str中的某元素,对str进行切割。

    b.rsplit -从右向左按str中的某元素,对str进行切割。

    示例:

    拓展:了解。

    # str的partition方法:
    # 返回值:元组。元组里是3个str。
    # 1.str.partition('str中的某字符-->分割符')   # 从左边开始分割。
    s = '123+456+789'
    new_s = s.partition('+')
    print(new_s)
    # 结果:('123', '+', '456+789')   # 将指定字符串分为三份(从左边开始分割):前面,分割符,后面。
    
    # 2.str.rpartition('str中的某字符-->分割符')  # 从右边开始分割。
    s = '123+456+789'
    new_s = s.rpartition('+')
    print(new_s)
    # 结果:('123+456', '+', '789')   # 将指定字符串分为三份(从右边开始分割):前面,分割符,后面。
    

    9.字符串的格式化 -3种

    (1).引入

    示例:

    现在有个需要我们录入我们身边好友的信息,格式如下:

    ------------ info of 吕布 -------------
                 Name  : 吕布
                 Age   : 18
                 job   : 宠物
                 Hobby: run
    ----------------- end --------------------
    

    我们现在能想到的办法就是用以下方法: 字符串的拼接。用10个变量拼成如上格式。

    name = input('请输入姓名:')
    age = input('请输入年龄:')
    job = input('请输入职业:')
    hobby = input('请输入爱好:')
    a = '------------ info of 吕布 ----------'
    b = 'Name:'
    c = 'Age:'
    d = 'Job:'
    e = 'Hobby:'
    f = '------------- end ----------------'
    print(a+'
    '+b+name+'
    '+c+age+'
    '+d+job+'
    '+e+hobby+'
    '+f)    # 
    是换行符。
    # 运行结果
    ------------ info of 吕布 ----------
    Name:吕布
    Age:18
    Job:宠物
    Hobby:run
    ------------- end ----------------
    

    ps: 这样写完全没有问题,但是比较繁琐,不建议这么写。

    (2)%占位符 -%s %d %%

    写在前面:

    ps-1:用%去进行str的格式化, 必须使%前面占位符的数量和位置 与 %后的填充物的数量和位置一一对应。(一个萝卜一个坑.)
    ps-2:%后的最后1个填充物后面一定要写上英文的逗号。因为这是个元组,若元组里只有1个元素的话,不加逗号则这就是该元素本身的数据类型,而不是元组。(即,元组记得加逗号。)
    • %s - 字符串的占位符
    a.字符串格式化存在的意义:将str自动进行拼接。
    name = input('姓名:')
    do = input('在干什么:')
    template = '%s在教室,%s。' %(name,do,)        # %s叫str占位符,%后是填充物,最后写上逗号。
    print(template)
    
    结果:
    姓名:吕布
    在干什么:吃狗粮
    吕布在教室,吃狗粮。
    

    b.%后直接跟具体变量 - 写死。
    template = '我是%s,年龄%s,爱好%s。' %('xzw',18,'宅',)    #最后有逗号
    print(template)
    

    • %d或%i - 数字占位符
    template = '我是%s,年龄%s,爱好%s。' %('xzw',18,'宅',)
    print(template)
    
    template = '我是%s,年龄%d,爱好%s。' %('xzw',18,'宅',)
    print(template)
    
    #2者都对。
    

    • %% - 在前面的格式里代表单纯的百分号
    name = input('请输入姓名:')
    template = '%s现在的手机电量是100%%' %(name,)
    print(template)
    
    结果:
    请输入姓名:xiaohei
    xiaohei现在的手机电量是100%
    
    综上,引入示例重写:

    个人名片的例子:

    # name = input("请输入姓名: ")
    # age = input("请输入年龄: ")
    # hobby = input("请输入爱好: ")
    # template = """--------------------info of %s--------------------
    # Name : %s
    # Age : %s
    # Hobby : %s
    # -----------------------end-----------------------""" % (name,name,age,hobby,)
    print(template)
    
    结果:
    请输入姓名:吕布
    请输入年龄:18
    请输入职业:宠物
    请输入爱好:run
    --------------------info of 吕布--------------------
    Name : 吕布
    Age : 18
    Hobby : run
    -----------------------end-----------------------
    

    (3).format

    写在前面: 用format进行str的格式化 ,也要一一对应

    ps:最后一个填充物后记得加逗号。因为format后是个元组

    第一种用法:{}相当于%s  
    msg = '我叫{}今年{}性别{}'.format('大壮',25,'男',)   # 要一一对应
    print(msg)
    
    # 个人名片的例子:
    name = input('请输入姓名:')
    age = input('请输入年龄:')
    hobby = input('请输入爱好:')
    template = '''
    ------------ info of {} -------------
                 Name  : {}
                 Age   : {}
                 Hobby: {}
    ----------------- end --------------------
    '''
    template = template.format(name,name, age, hobby)
    print(template)
    
    第二种用法:按索引格式化
    msg = '我叫{0}今年{1}性别{2}我依然叫{0}'.format('大壮', 25,'男')    # 要一一对应,但最后一个不用写
    print(msg)
    
    # 个人名片的例子:
    name = input('请输入姓名:')
    age = input('请输入年龄:')
    hobby = input('请输入爱好:')
    template = '''
    ------------ info of {0} -------------
                 Name  : {0}
                 Age   : {1}
                 Hobby: {2}
    ----------------- end --------------------
    '''
    template = template.format(name, age, hobby)
    print(template)
    
    第三种用法:关键字格式化   #指名道姓去填充
    注: .format()的括号里给每对关键字的顺序可以打乱
    a = 100
    msg = '我叫{name}今年{age}性别{sex}'.format(age=a, sex='男', name='大壮')   # 可乱序
    print(msg)
    
    # 个人名片的例子:
    template = '''
    ------------ info of {name} -------------
                 Name  : {name}
                 Age   : {age}
                 Hobby: {hobby}
    ----------------- end --------------------
    '''
    template = template.format(name=input('请输入姓名:'), age=input('请输入年龄:'), hobby='eat')
    print(template)
    

    (4)f

    写在前面-3点注意: 用f 进行str的格式化,{}里只能是变量名一一对应; python3.6版本以上才能使用

    name = "小黑"
    hobbie = "游泳"
    dishobby = "落后"
    msg = f"我叫{name},我喜欢{hobbie},讨厌{dishobby}"
    print(msg)
    
    #错误示例:{}里不能是具体的数据,只能是变量。
    msg = f"我叫{"小黑"},我喜欢{"游泳"},讨厌{"落后"}"   #会报错
    print(msg)
    

    个人名片的例子

    name = input("请输入姓名: ")
    age = input("请输入年龄: ")
    hobbie = input("请输入爱好: ")
    msg = f"""--------------------info of name--------------------
    Name : {name}  #花括号里是变量名
    Age : {age}
    Hobby : {hobbie}
    -----------------------end-----------------------"""
    print(msg)
    
    msg = f"""--------------------info of {input("请输入姓名: ")}-------------------
    Name : {input("请输入姓名: ")}#大括号里直接是要格式化的内容,此处可如此,是因为input是Python的内置函数
    Age : {input("请输入年龄: ")}
    Hobby : {input("请输入爱好: ")}
    --------------------end-------------------"""
    print(msg)
    
    小结:3种格式对比如下:

    10.is系列

    ps:is系列变身后的结果是bool

    • 判断str中是否是十进制数字 str.isdecimal() # 返回值:bool
      • .isdecimal() -好! # '1'-->True; '二'-->False; '②'-->False
      • .isdigit() # '1'-->True; '二'-->False; '②'-->True
      • .isnumeric() # '1'-->True; '二'-->True; '②'-->True

    注意

    str.isdecimal() 判断的是str是否是十进制数字。其他情况一律为False。 # 推荐使用!

    str.isdigit()/str.isnumeric() 不仅仅判断十进制数字,其他形式的也会判定为True。但'②'/'二'并不能转换为int,故此两种方法不好(有漏网之鱼)。

    应用场景:欢迎致电10086。

    # 致电10086 -判断用户输入的str是否是数字(即判断str是否可渡)
    print('''欢迎致电10086
    1.话费查询
    2.业务办理
    3.宽带业务
    4.人工服务''')
    num = input('请选择要办理的业务:')
    # 判断用户输入的str是否是十进制数字 -即判断输入的str是否可渡。
    flag = num.isdecimal()
    # print(flag) # 返回结果是布尔值。 # '1' -> True;'吕布' -> False
    if flag:  # if flag:等价于 if flag == True:;因为只有当if的条件是True时,计算机才会执行if里的
        num = int(num)   # 代码。故此时可如此简写。
        print(num)
    else:  # else:  等价于 if flag == False:
        print('请输入数字')
        
    # 完整版:
    print('''欢迎致电10086  #换行的字符串,三引号。
    1.话费查询;
    2.流量查询;
    3.业务办理;
    4.人工服务。''')  # 要先显示内容,才能让用户选择。
    index = input('请输入你要选择的服务:')
    flag = index.isdecimal()
    if flag:
        index = int(index)
        if index == 1:
            print('话费查询')
        elif index == 2:
            print('流量查询')
        elif index == 3:
            print("""业务办理:
            1.修改密码;
            2.更改套餐;
            3.宽带业务""")
            num = input('请输入要办理的业务:')
            if num.isdecimal():
                num = int(num)
                if num == 1:
                    print('修改密码')
                elif num == 2:
                    print('更改套餐')
                elif num == 3:
                    print('宽带业务')
                else:
                    print('输入错误,请重新输入')
            else:
                print('请输入数字')
        elif index == 4:
            print('人工服务')
        else:
            print('输入错误,请重新输入')  # 逻辑要严谨。
    else:
        print('请输入数字')
    
    • isalnum -判断某个str里是否是字母/数字/字母+数字

      ps:the meaning of alnum is 字母+数字

    • isalpha -判断某个str里是否只有字母/汉字/字母+汉字

      ps:**the meaning of alpha is **希腊字母的第一个字母/开端。

    11.字符串的编码 -常用。

    (1).Python解释器是如何承上启下,将python代码执行起来的:

    ps在程序运行阶段,使用的是unicode编码(因为便于计算机进行计算);

    在程序进行数据传输和存储时,使用的是utf-8/gbk编码(因为utf-8/gbk在数据传输/存储过程中,占用的空间和资源少)。

    在python中可以把文字信息进行编码. 编码之后的内容就可以进行传输or存储了。

    (2).如何对文字信息(eg:str)进行编码呢?: 用encode!!

    即如何将(内存中)str的Unicode编码 -->(传输/存储中)utf-8/gbk编码,以进行文字信息的传输和存储

    # 当str是中文时,编码之后的结果根据编码方式的不同,编码结果也不同.utf-8:1中文占3字节;gbk:1中文占2字节
    # 写在前面:str的二进制是bytes类型的数据。
    name = '吕布'
    value1 = name.encode('utf-8')  # 将str根据UTF-8编码转换成bytes类型(二进制)
    print(value1)
    val2 = name.encode('gbk')  # 将str根据gbk编码转换成bytes类型(二进制)
    print(val2)
    结果:b'xe5x90x95xe5xb8x83'  # 这是用十六进制表示的二进制。
    结果:b'xc2xc0xb2xbc'
    # 当str是英文时,编码之后的结果和源字符串一致。
    name = 'xiaokeai'
    value1 = name.encode('utf-8')  # 将str根据UTF-8编码转换成bytes类型(二进制)
    print(value1)
    val2 = name.encode('gbk')  # 将str根据gbk编码转换成bytes类型(二进制)
    print(val2)
    结果:b'xiaokeai'
    结果:b'xiaokeai'
    

    ps-1:编码之后的数据是bytes类型的数据,这是str的二进制表现形式。

    其实,还是原来的数据。只是经过编码之后表现形式发生了改变而已。

    bytes的表现形式:

    1. 英文:b’xiaokeai’ 英文的表现形式和字符串没什么两样;
    2. 中文:b'xe5x90x95 这是一个汉字的UTF-8的bytes表现形式。
    3. 中文:b'xc2xc0 这是一个汉字的gbk的bytes表现形式。

    ps-2encode的作用:对str进行utf-8/gbk编码,将用Unicode编码的字符串转换utf-8/gbk编码的字符串,以用来进行str的数据传输/将其保存至硬盘。(即encode的作用是用来进行str编码方式的转换的。)

    ps-3何时用encode:在将str保存至硬盘/进行str的数据传输时,会用到encode。因为需要转换str的编码方式。

    ps-4编码格式:str.encode('utf-8/gbk')

    ps-5encode转换编码方式后,数据类型变成了bytes类型即在str进行数据传输/存储时是以bytes的形式存在的。

    (3).如何对bytes类型的数据进行解码:

    即如何将bytes的utf-8/gbk编码 -->str的Unicode编码,以进行解码还原

    ps:在网络传输和硬盘存储的时候我们python是保存和存储的bytes 类型

    那么在对方接收的时候,也是接收的bytes类型的数据。我们可以使⽤decode()来进行解码操作,
    把bytes类型的数据还原回我们熟悉的字符串:

    name = '吕布'
    value = name.encode('utf-8')  # 将字符串编码成UTF-8
    print(value)
    # 结果:b'xe5x90x95xe5xb8x83'
    
    value2 = b'xe5x90x95xe5xb8x83'.decode('utf-8')  # 将bytes类型解码(还原)成我们认识的str
    print(value2)
    # 结果:吕布
    

    注意:1.见到认识(str)的就编码,见到不认识(bytes类型)的就解码还原成我们认识的。

    2.用哪种编码方式编码的,就再用哪种编码方式解码

    (4).二次编码 -编码和解码

    示例:文字信息的GBK(bytes类型) -->UTF-8(bytes类型),中间需要一个桥梁:Unicode(还原为str)。

    见到1个str,先用gbk编码,获得bytes类型数据;再用gbk对bytes解码,还原为原str;再对此str进行utf-8编码。

    # 需求:在py3中,将s = "我是文字"转换成gbk的bytes类型;转换成功后再将得到的bytes类型数据转换成utf-8的bytes类型。
    s = "我是文字"
    # 1th: 我们这样可以获取到GBK的文字
    bs = s.encode("GBK")
    print(bs)  # 结果:b'xcexd2xcaxc7xcexc4xd7xd6'
    
    # 2th: 把GBK转换成UTF-8
    # 首先要把GBK转换成unicode. 也就是需要解码
    former = bs.decode("GBK")  # 将gbk的bytes类型进行解码还原 -ps:用什么编码的,就再用什么解码。
    print(former)  # 结果:我是文字
    # 然后需要将解码后的str重新编码成UTF-8
    bss = s.encode("UTF-8")  # 重新编码
    print(bss)  # 结果:b'xe6x88x91xe6x98xafxe6x96x87xe5xadx97'
    

    12.练习题:

    1.需求:让用户输入任意字符串,获取字符串之后计算其中有多少个数字。
    (1).while循环:
    content = input('请输入内容:')
    index = 0
    count = 0
    while index <= len(content) - 1:
        val = content[index]
        if val.isdigit():
            count += 1
        index += 1
    print(count)
    (2).for循环:
    content = input('请输入内容:')
    count = 0
    for i in content:
        if i.isdigit():  # i.isdigit()的返回值就是True/False,如果是True(即if的条件是True),则满足if的条件,就会执行if里面的内容。
            count += 1
    print(count)
    2.需求:去除字符串的空格。
    name = '  吕 布是暖男and so handsome '
    # 一.去除前后的空格
    name = name.strip()
    print(name)
    结果:吕 布是暖男and so handsome
    # 二.去除所有的空格
    name = name.replace(' ', '')
    print(name)
    结果:吕布是暖男andsohandsome
    

    (2).不常用方法 -(了解)

    • 1.首字母大写 .capitalize() 返回值:新str

      s = 'lvbu'
      new_s = s.capitalize()
      print(new_s)   # Lvbu
      
    • 2.大小写转换 .swapcase() 返回值:新str

      s = 'liBU'
      new_s = s.swapcase()
      print(new_s)
      # 结果:LIbu
      
    • 3.统计某字符/子序列出现的次数 .count('某字符') 返回值:int

      s = 'aaaaa小吕布'
      print(s.count('a'))
      
    • 4.查找某字符的索引位置

      • .find('某字符') 若字符不存在,则返回-1
        • .find('某字符') # 从左边开始找,返回左边第一个字符的索引。
        • .rfind('某字符') # 从右边开始找,返回右边第一个字符的索引。
      • .index('某字符') 若字符不存在,则报错
        • .index('某字符') # 从左边开始找,返回左边第一个字符的索引。
        • .rindex('某字符') # 从右边开始找,返回右边第一个字符的索引。
      s = 'MrLin666先生 & Miss哈哈哈小姐'
      print(s.find('M'))  # 0
      print(s.rfind('M'))  # 13
      print(s.find('7'))  # -1
      
      print(s.index('M'))  # 0
      print(s.rindex('M'))  # 13
      print(s.index('7'))  # ValueError:substring not found -找不到字符串。
      
    • 5.居中 .center(总长度, '两边的填充物') # 不写填充物,则默认用空格填充。

      • 将str居中 .center(总长度, '两边的填充物')
      • 将str居左 .ljust(总长度, '右边的填充物')
      • 将str居右 .rjust(总长度, '左边的填充物')
      s = '暖男吕布'
      print(s.center(10))  #     暖男吕布     # 不写则默认用空格填充。
      print(s.center(10, '*'))  # ***暖男吕布***  # 居中
      print(s.ljust(10, '*'))  # 暖男吕布******   # 居左
      print(s.rjust(10, '*'))  # ******暖男吕布   # 居右
      
    • 6.将str中每一个单词的首字母变成大写 .title() 标题

      s = 'Lvbu is a handsome dog.'
      new_s = s.title()
      print(new_s)  # Lvbu Is A Handsome Dog.
      
    • 7.判断str是否是空白 .isspace() # 空str,判定为False。返回值:bool。

      s1 = ' '
      print(s1.isspace())  # True
      s2 = ''
      print(s2.isspace())  # False
      

    (三).强制转换

    写在前面-1:int和bool2种可直接转list/tuple/dict/set此4种容器类要想转成str,要通过str的join方法

    写在前面-2:list/tuple/set/dict-->str: 用join时,序列里的元素必须全部都是str类型才可以转。

    写在前面-3:当要拼接的序列是dict时,转换的只是dict的key

    • str(999) # '999'
    • str(true) # 'True'
    • list-->str ,s1 = ''.join(li) # li里的元素必须是str
    • tuple-->str,s2 = ''.join(tu1) # tuple里的元素必须是str
    • dict-->str, s3 = ''.join(dict1) # 转换的只是dict的key
    • set-->str,s4 = ''.join(set1) # set里的元素必须是str
    # 示例:
    # 示例一:list--》str
    li = ['1', '2', '3']
    v2 = ''.join(li)
    print(v2)
    # 示例二:tuple--》str
    tu1 = ('1', '2', '3', '4', )
    s2 = ''.join(tu1)
    print(s2)
    # 示例三:dict--》str
    dict1 = {"name": '吕布', 'age': 18}
    s3 = ''.join(dict1)  # 拼接起来的知识dict的键。
    print(s3)
    # 示例四:set--》str
    set1 = {'1', '2', '3'}
    s4 = ''.join(set1)   # set无序。
    print(s4)
    # 结果:
    123
    1234
    nameage
    213
    

    四.列表list -可变。有序。

    4.0定义

    def:用[ ]括起来, 每个元素之间用","隔开,可以存放各种数据类型。可以储存大量数据。有序。有索引切片步长,方便取值。(在其他 语言里叫数组eg:在JS、Java中都称之为数组。)
    eg:li = [['MrLin',520,True,7],0,'吕布',True,(1,'妥妥',666),{'age':18,'job':'teacher'}]
    

    ps-1:相比于字符串,不仅可以储存不同的数据类型,而且可以储存大量数据。

    32位python的限制是 536870912 个元素,

    64位python的限制是 1152921504606846975 个元素。

    ps-2: 列表是有序的。有索引值,可切片,方便取值。

    ps-3: 若list中盛放大量数据,则查询速度慢。不如dict/tuple的hash算法查值快。

    (一).公共功能 -共9个。list全都具备。

    4.1列表相加

    • 相加后是形成一个新列表,列表里放的是这2个小列表的所有元素;
    • 新列表依然有序
    list1 = [1,2,666,'吕布']
    list2 = ['handsome','暖男',666]
    new_li = list1 + list2
    print(new_li)
    # 结果:[1, 2, 666, '吕布', 'handsome', '暖男', 666]
    

    4.2列表*int

    • 形成一个新列表。新列表里是int个被乘列表里的元素。
    • 依然有序。
    li = ['吕布','handsome','暖男',666]
    new_li = li * 2
    print(new_li)
    # 结果:['吕布', 'handsome', '暖男', 666, '吕布', 'handsome', '暖男', 666]
    

    (1).查 -4种公共方法。索引、切片、步长、for循环。

    4.3列表的索引

    同str

    4.4列表的切片

    同str

    4.5列表的步长

    同str

    4.6for循环

    • 写在前面-1:for循环内部自加,不需要我们再去自加让其转起来。

    • 写在前面-2for循环的对象必须可迭代。eg:字符串/列表/字典/元组/集合这5种可迭代的类型and其他可迭代的序列(eg:range())。)

    • 写在前面-3:for循环可嵌套

    • 写在前面-4breakcontinue在for循环中依然适用

    • 格式

      for 变量 in 序列:
      	循环体内容
      

      示例:

      # 需求:遍历字符串中的每一个元素。
      value = ['吕布666',True,7]
      for item in value:
          print(item) 
      结果:
      吕布666
      True
      7
      
    • ps

      # ps-1:与for平齐的行,只打印for循环的序列中的最后一个元素。
      value = ['吕布666',True,7]
      for item in value:
          print(item) 
      print(item)  # 只打印最后一个元素。
      # 结果:7
      # ps-2:break和continue在for循环中依然适用。
      value = ['吕布666',True,7]
      for item in value:
          print(item)
          break
      # 结果:'吕布666'
      value = ['吕布666',True,7]
      for i in value:
          print(i)
          break
          print('啊哈')  # 不打印。
      # 结果:'吕布666'
      value = ['吕布666',True,7]
      for i in value:
          print(i)
          continue
          print('啊哈')  #不打印。
      # 结果:
      吕布666
      True
      7
      
    • for和while的应用场景:

      有穷尽优先使用for,无穷尽用while。
      
    • 练习题

      1.遍历list中的各元素

      content = ['MrLin_儒雅先生','纳兰容若']
      for item in content:
          print(item)
      

      2.遍历list各元素的索引

      content = ['MrLin_儒雅先生','纳兰容若',666,True,'Faye']
      max_index = len(content) -1
      for item in range(0,max_index + 1):
          print(item)
      

      3.for循环的嵌套

      • 练习题:
      1.看代码写结果:
      users = ['吕布','小花','流浪歌手','天赋']
      for item in users:
          for ele in item:
              print(ele)
      2.看代码写结果:
      users = ['吕布','小花','流浪歌手','天赋']
      for item in users:
          print(item)
          for ele in item:
              print(ele)
      

    4.7len

    ps:对于list,返回值是:list中的元素个数;

    li = ['吕布','handsome','暖男',666]
    print(len(li))
    # 结果:4
    

    (2).删 -1种公共方法。(3种独有方法)

    4.8删除list中的某元素。del li[索引/切片/步长]。

    写在前面-1:只适用于可变数据类型中的 list/dict。(set无序,没办法索引,del set是删除整个集合)

    写在前面-2:仅仅是删除,没有返回值。

    写在前面-3:按切片/步长删,依然保持切片/步长原有的特性

    格式: 3种。

    • del li[索引] 按索引删 # 类似于.pop(索引)。但pop可以有返回值,它没有。
    • del li[起:终] 按切片
    • del li[起:终:步长] 按步长,跳着删

    示例:

    # 示例1:按索引删
    li = [1, '二哈', 2, 666, '狗子']
    del li[1]
    print(li)
    # 结果:[1, 2, 666, '狗子']
    
    # 示例2:按切片删 -尾是开区间。
    li = [1, '二哈', 2, 666, '狗子']
    del li[:3] 
    print(li)
    # 结果:[666, '狗子']
    
    # 示例3:按步长,跳着删。-尾是开区间,步长是几就数几个间隔。
    li = [1, '二哈', 2, 666, '狗子']
    del li[::3]
    print(li)
    # 结果:['二哈', 2, '狗子']
    

    ps:此种删除序列里元素的方法,对于str、int、bool、tuple不适用

    因为:str、int、bool、tuple是不可变数据类型。变量一旦生成,它的值就在内存里写死了。不能再对这个值进行修改/删除。要想改值,只能将一个新的值再一次赋值给这个变量。但它原来的值依然在内存里存放着。

    示例:

    s = '123'
    del s[0]
    print(s)
    # 结果:TypeError: 'str' object doesn't support item deletion.str不支持这种删除方式。
    
    # 要想改值/删除,只能对这个变量进行二次赋值。但它原来的那个值依然在内存里放着呢。
    s = '123'
    s = '23'
    print(s)
    # 结果:23
    

    (3).改 -仅此1种公共方法。

    4.9修改list中的某元素 li[索引] = '新元素'。只适用于可变数据类型中的list/dict。(set无序,没办法通过索引取值)。

    写在前面-1:只适用于可变数据类型中的:list/dict。

    写在前面-2:a.最外层元素:此可变数据类型(大框)中的本层所有元素都能修改(因为本层元素均是可变数据类型list中的元素,均可做修改)。但仅限于修改本层若要修改深层的元素,则要先判断其实可变还是不可变数据类型。

    b.对于深层元素:int/bool/str/tuple 此4种不可变数据类型。不能修改。因为其不可变,值已经写死在内存了。

    list/dict/set 此4种可变数据类型。可以修改。因为其可变,故哪怕嵌套的再深,其中元素也能修改。

    格式:

    li[索引] = '新元素'  # 通过索引先取到值,再进行修改。
    

    示例:

    # 最外层元素:此可变数据类型(大框)中的所有元素都能修改。
    li = [1, '二哈', [1, 2, '123'], 2, 666, '狗子']
    li[0] = '吕布'
    print(li)
    # 结果:['吕布', '二哈', [1, 2, '123'], 2, 666, '狗子']
    
    li = [1, '二哈', [1, 2, '123'], 2, 666, '狗子']
    li[2] = [666, 10]
    print(li)
    # 结果:[1, '二哈', [666, 10], 2, 666, '狗子']
    
    # 深层元素:不可变类型不能修改。可变类型可以修改。
    a.int/bool/str 此3种不可变数据类型。不能修改。
    # 第2层元素:
    li = [1, '二哈', [1, 2, '123'], 2, 666, '狗子']
    li[1][0] = '小'  # 想把'二哈'中的'二'改成'小'。
    print(li)
    # 结果:TypeError: 'str' object does not support item assignment.
    # 第3层元素:
    li = [1, '二哈', [1, 2, '123'], 2, 666, '狗子']
    li[2][-1][0] = 9   # 想把[1, 2, '123']中的'123'的1改成9。
    print(li)
    # 结果:TypeError: 'str' object does not support item assignment.
    
    b.list/dict/set/tuple 此4种可变数据类型。可以修改。
    # 第2层元素:
    li = [1, '二哈', [1, 2, '123'], 2, 666, '狗子']
    li[2][0] = '比熊'
    print(li)
    # 结果:[1, '二哈', ['比熊', 2, '123'], 2, 666, '狗子']
    # 第3层元素:
    li = [1, '二哈', [1, 2, '123', ['射雕英雄传', '雪山飞狐', '碧血剑'], 8], '狗子']
    li[2][-2][0] = '海贼王'
    print(li)
    # 结果:[1, '二哈', [1, 2, '123', ['海贼王', '雪山飞狐', '碧血剑'], 8], '狗子']
    ...
    # 第n层元素 同理。
    

    4.10练习题

    练习1.实现一个整数加法计算器(两个个位数相加)。

    如:content = input('请输入内容:'),用户输入:5+9或5+ 9或5 + 9(含空白),然后进行分割转换最终进行整数的计算得到结果。

    解:

    (一).两个数相加

    • 方法一个位数的整数加法计算器。局限性只能计算个位相加。 eg :5+ 9或5 + 9。

      思路:根据str的索引取值。

      content = input('请输入内容:')
      content = content.replace(' ','')
      v1 = int(content[0])
      v2 = int(content[-1])
      v3 = v1 + v2
      print(v3)
      
    • 方法二个位数的整数加法计算器。局限性:只能计算个位相加。eg :5+ 9或5 + 9。

      思路:利用while循环

      content = input('请输入内容:')
      content = content.replace(' ','')
      total = 0
      index = 0
      while index <= len(content) - 1:
          char = content[index]  # char n.字符
          flag = char.isdigit()
          if flag:
              char = int(char)
              total = total + char
          index += 1
      print(total)
      
    • 拓展固定格式-两位数的整数加法计算器。 eg: 12+12,02+15,02+03。

      思路:利用while循环 + str的相加

      content = input('请输入内容:')
      content = content.replace(' ', '')
      total = 0
      index = 0
      while True:
          max_index = len(content) -1
          char1 = content[index]  # char n.字符
          if index == max_index:  # 到str的最后一个字符就得停了,因为再往后str[index +1]就取不到了。
              break               # 在最后一个能取到的下一个停,只要能取到必须取完。
          char2 = content[index + 1]
          flag1 = char1.isdigit()
          flag2 = char2.isdigit()
          if flag1 and flag2:
              sequence = char1 + char2  # sequence n.序列
              sequence = int(sequence)
              total = total + sequence
          index += 1
      print(total)
      
    • 拓展固定格式-三位数的整数加法计算器。 eg :100+666,001+100,023+003。

      思路:利用while循环 + str的相加

      content = input('请输入内容:')
      content = content.replace(' ', '')
      total = 0
      index = 0
      while True:
          max_index = len(content) - 1
          char1 = content[index]  # char n.字符
          if index == max_index - 1:  # 到str的最后一个字符就得停了,因为再往后str[index +1]就
              break                   # 取不到了。在最后一个能取到的下一个停,只要能取到必须取完。
          char2 = content[index + 1]
          char3 = content[index + 2]
          flag1 = char1.isdigit()
          flag2 = char2.isdigit()
          flag3 = char3.isdigit()
          if flag1 and flag2 and flag3:
              sequence = char1 + char2 + char3 # sequence n.序列
              sequence = int(sequence)
              total = total + sequence
          index += 1
      print(total)
      
    • 方法三不限制被加数的位数(个十百千万均可),不要求固定格式。但仅限于2个数相加

      思路将str用+号分割开,分割后自动生成一个list。通过list索引取值,强制转换后再做加法运算。

      eg :1+23,100 +2 3,1 000 +9 9999。

      content = input('请输入内容:')
      content = content.replace(" ",'')
      new_li = content.split("+")
      print(new_li)
      v1 = int(new_li[0])
      v2 = int(new_li[-1])
      total = v1 + v2
      print(total)
      

    (二).可累加

    方法:不限制被加数的位数,不要求固定格式。可累加。均不限!

    思路while循环 + str的分割。

    eg: 1+23 +10 01 + 200 +520 +66 66。and so on.

    content = input('请输入内容:')
    content = content.replace(' ', '')
    new_li = content.split('+')
    print(new_li)
    index = 0
    total = 0
    while True:
        max_index = len(new_li) - 1
        if index == max_index + 1:   # 等到list里的最后一个元素加完后,再停。否则最后一个元素加不上。
            break                    # 即在累加的最后一位的后一位停。
        value = int(new_li[index])
        total = total + value
        index += 1
    print(total)
    

    练习2.通过for循环和数字计数器实现:users = ['吕布','小花','流浪歌手','天赋'],打印出来的效果如下:

    效果如下:
    """
    0 吕布
    1 小花
    2 流浪歌手
    3 天赋
    """
    
    • 方法一:单独for
    users = ['吕布', '小花', '流浪歌手', '天赋']
    index = 0
    for item in users:
        print(index, item)
        index += 1
    
    • 方法二:for循环 + range。
    users = ['吕布', '小花', '流浪歌手', '天赋']
    for item in range(0, len(users)):
        print(item, users[item])
    

    4.11 in

    # 示例:
    li = [1, 2, 88, 100]
    if 1 in li:
        print('包含该元素')
        
    # 练习题:让用户输入任意字符串,然后判断此字符串是否包含指定的敏感字符。
    # 敏感字符:char_list = ['矮','胖','丑']
    content = input('请输入内容:')
    char_list = ['矮', '胖', '丑']
    success = True
    for item in char_list:
        if item in content:
            success = False
            break
    if success:
        print(content)
    else:
        print('包含敏感字符')
    

    (二).list的方法

    写在前面:list和str不一样。list是可变数据类型.。故,对其进行操作,会直接在原来的对象上进行修改。

    (4).增 -3种方法。append、insert、extend.

    4.9列表的增

    • -3种方法

    1.追加 .append('要追加的元素') 直接在原list上进行操作

    格式:

    li = [1,2,666]
    li.append('狗子')
    print(li)
    结果:[1, 2, 666, '狗子']  # 结果是将元素追加到原列表的最后面。
    

    示例:

    # 需求:录入用户信息,并添加到列表中。
    # 方法一:录入的用户名个数未知。留口子。
    users = []
    while True:
        name = input('请输入用户名和密码,输入Q退出:')
        if name.upper() == 'q'.upper():
            break
        users.append(name)
    print(users)
    结果:
    请输入用户名和密码,输入Q退出:小吕布,123
    请输入用户名和密码,输入Q退出:貂蝉呀,456
    请输入用户名和密码,输入Q退出:狗子,666
    请输入用户名和密码,输入Q退出:q
    ['小吕布,123', '貂蝉呀,456', '狗子,666']
    # 方法二:若需录入的用户名个数已确定。共录入3个用户名和密码。
    users = []
    for item in range(0, 3):
        name = input('请输入用户名和密码:')
        users.append(name)
    print(users)
    结果:['小吕布,123', '貂蝉呀,456', '狗子,666']
    

    练习题:

    # 需求:录入3个用户信息,并添加到列表中。然后判断用户登录信息是否正确(即用户名和密码校验)。
    
    # 1th:录入用户和密码,并添加到列表中。
    users = []
    for item in range(0, 3):
        name = input('请输入用户名和密码:')
        users.append(name)
    print(users)
    
    # 2th:用户和密码校验
    username = input('请输入要登录的用户名:')
    password = input('请输入要登录的密码:')
    for item in users:
        result = item.split(',')   # 录入信息时输入的是哪种逗号,这里就用哪种逗号分割。
        user = result[0]
        pwd = result[-1]
        if user == username and pwd == password:
            print('登录成功')
            break
        else:
            print('用户名或密码错误')
    

    2.插入 .insert(索引,'要插入的元素')。在指定索引位置处插入元素。

    格式:

    li.insert(索引,'要插入的元素')   # 将某元素插入到该索引位置,原来的元素向后移动一位。
    

    ps:插入某元素后,原来的元素往后挪了一位!!插在原有元素前面。

    示例:

    li = [1, 2, 666, '狗子']
    li.insert(1,'二哈')  # 将'二哈'插入到索引1的位置处,之前的元素后挪一位。
    print(li)
    结果:[1, '二哈', 2, 666, '狗子']
    

    3.迭代着添加 .extend(可迭代的数据类型)

    格式:

    li.extend(可迭代的数据类型)
    # ps:必须是可迭代的,才可用extend迭代着添加。
    

    示例:

    li = [1, '二哈', 2, 666, '狗子']
    li.extend('123456')
    print(li)
    结果:[1, '二哈', 2, 666, '狗子', '1', '2', '3', '4', '5', '6']
    li = [1, '二哈', 2, 666, '狗子']
    li.extend([5, 2, 0, 'Lin'])
    print(li)
    结果:[1, '二哈', 2, 666, '狗子', 5, 2, 0, 'Lin']
    

    练习题:

    # 请将列表l2 = [1, 2, 3, 4]的每一个元素追加到列表li中,并输出添加后的列表。
    li = ['a', 'b', 'c', 'd', 'e']
    l2 = [1, 2, 3, 4]
    # 方法一:list的独有方法 -extend
    li.extend(l2)
    print(li)
    # 方法二:循环实现
    # a.for循环
    for i in l2:
        li.append(i)
    print(li)
    # b.while循环
    index = 0
    while index <= len(l2) - 1:
        li.append(l2[index])
        index += 1
    print(li)
    # 结果:['a', 'b', 'c', 'd', 'e', 1, 2, 3, 4]
    

    (5).删 -3种方法。pop、remove、clear.

    4.10列表的删

    • -3种方法(都不常用!)

    1.pop通过索引删除元素。不写索引,则默认删除最后一个。可以设置返回值

    格式:

    li.pop(要删除元素的索引)
    

    示例:

    li = [1, '二哈', 2, 666, '狗子']
    li.pop(1)  # 删'二哈','二哈'的索引是1。
    print(li)
    # 结果:[1, 2, 666, '狗子']
    

    ps-1:若pop(),不写索引。则默认删除最后一个元素。

    li = [1, '二哈', 2, 666, '狗子']
    li.pop()
    print(li)
    # 结果:[1, '二哈', 2, 666]
    

    ps-2:可以设置返回值。以查看删除的元素。

    li = ['a', 'b', 'c', 'd', 'e']
    # del li[0]  # 仅仅是删除
    # print(li)
    
    deleted = li.pop(0)  # 通过索引删除list中的元素,并将删除的数据赋值给deleted。以供查看。
    print(li)
    print(deleted)
    # 结果:
    ['b', 'c', 'd', 'e']
    a
    

    2.remove 通过元素删除。若值不存在则报错

    格式:

    li.remove('要删除的元素')
    

    示例:

    li = [1, '二哈', 2, 666, '狗子']
    li.remove('二哈')
    print(li)
    # 结果:[1, 2, 666, '狗子']
    

    ps若被删除的值不存在,则会报错。

    li = ['a', 'b', 'c', 'd', 'e']
    li.remove('100')
    print(li)
    # 结果:ValueError: list.remove(x): x not in list
    

    3.clear 清空

    格式:

    li.clear()   # 清空列表。
    

    示例:

    li = [1, '二哈', 2, 666, '狗子']
    li.clear()
    print(li)
    # 结果:[]
    

    4.11列表的其他方法

    • 反转 li.reverse()
    value1 = [11, 22, 33, 100]
    value1.reverse()
    print(value1)
    # 结果:[100, 33, 22, 11]
    
    • 排序 li.sort(reverse=False/True) 默认从小到大排
    li = [1, 6, 45, 99, 10, 7, 100]
    li.sort(reverse=False)  # False 从小到大
    print(li)
    # 结果:[1, 6, 7, 10, 45, 99, 100]
    li.sort(reverse=True)   # True 从大到小
    print(li)
    # 结果:[100, 99, 45, 10, 7, 6, 1]
    li.sort()  # 默认从小到大
    print(li)
    # 结果:[1, 6, 7, 10, 45, 99, 100]
    
    • 统计 li.count(某元素)
    li = [1,2,3,4,84,5,2,8,2,11,88,2]
    num = li.count(3)   # 统计元素3出现的次数,和字符串中功能一样
    print(num)
    
    • 通过元素 获取下标/索引 li.index(某元素)
    li = [1,2,3,4,84,5,2,8,2,11,88,2]
    n = li.index(5)
    print(n)
    

    (三).list的嵌套

    写在前面-1:采用降维操作,一层一层的找。

    写在前面-2:用在何处? -当需要存储大量的数据,且需要这些数据有序的时候。制定一些特殊的数据群体:按顺序,按规则,自定制设计数据

    • 取值 -根据索引一层一层取值。0

      示例:

    li = [666, '吕布', 'MrLin', ['火影', ['柯南', '红猪'], '海贼王'], True]
    # 找到MrLin
    print(li[2])
    # 找到吕布和MrLin
    print(li[1:3])
    # 找到吕布的布字
    print(li[1][-1])
    
    • 改值 -先找到要修改的元素,根据li[索引] [索引]...[索引] = 新值的格式去做改值操作。

      示例:

    # 将MrLin拿到,然后全部变大写,再扔回去
    new_s = li[2].upper()
    li[2] = new_s
    print(li)
    # 简写
    li[2] = li[2].upper()
    print(li)
    # 把柯南换成风之谷
    li[-2][1][0] = '风之谷'
    print(li)
    # 在红猪后边添加一个起风了
    li[-2][1].append('起风了')
    print(li)
    

    练习题:

    # 8.写代码,有如下列表,按照要求实现每一个功能。
    lis = [2, 33, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"]
    # 01.将列表lis中的"tt"变成大写(用两种方式)。
    # 方法一:直接修改
    lis[-3][-2][-1][0] = lis[-3][-2][-1][0].upper()
    print(lis)
    # 方法二:先删再改
    del lis[-3][-2][-1][0]
    lis[-3][-2][-1].insert(0, 'TT')
    print(lis)
    # 02.将列表中的数字3变成字符串"100"(用两种方式)。
    # 方法一:直接修改
    lis[-3][-2][-1][1] = '100'
    print(lis)
    # 方法二:先删再改
    del lis[-3][-2][-1][1]
    lis[-3][-2][-1].insert(1, '100')
    print(lis)
    # 03.将列表中的字符串"1"变成数字101(用两种方式)。
    # 方法一:直接修改
    lis[-3][-2][-1][-1] = 101
    print(lis)
    # 方法二:先删再改
    del lis[-3][-2][-1][-1]
    lis[-3][-2][-1].append(101)
    print(lis)
    # 结果:[2, 33, 'k', ['qwe', 20, ['k1', ['tt', 3, 101]], 89], 'ab', 'adv']
    # 典型错误:
    del lis[-3][-2][-1][-1]
    lis[-3][-2][-1].insert(-1, 101)  # insert是插入到该索引位置。原有元素后挪!! 
    print(lis)
    # 结果:[2, 33, 'k', ['qwe', 20, ['k1', ['tt', 101, 3]], 89], 'ab', 'adv']
    

    (四).list的强制转换 -直接转。

    写在前面-1:只能将容器类的数据类型转换为list。

    写在前面-2:str-->list,是将str的每个字符作为list的元素。

    示例:

    # 示例一:str--》list  # 将str的每个字符作为list的每个元素。
    s = '吕布睡着了'
    l = list(s)
    print(l)
    # 结果:['吕', '布', '睡', '着', '了']
    
    # 示例二:tuple--》list
    tu1 = (1, 2, 3, )
    l1 = list(tu1)
    print(l1)
    # 结果:[1, 2, 3]
    
    # 示例三:dict--》list  # 只是将dict的key转换为list。
    dict1 = {'name': '吕布', 'age': 18}
    l2 = list(dict1)
    print(l2)
    # 结果:['name', 'age']
    
    # 示例四:set--》list
    set1 = {1, 2, 3}
    l3 = list(set1)
    print(l3)
    # 结果:[1, 2, 3]
    

    (五).list的坑 -2个。

    • 1.循环添加 ->死循环。
    # 坑1 -循环列表并在循环过程中往列表中添加元素,会形成死循环。
    li = [1, 2, 3, 4]
    for i in li:
        li.append(7)  # 这样写法就会一直持续添加7。
        # print(li)  # 死循环。
    print(li)  # 什么都不打印(因为是死循环,无尽头)
    
    • 2.列表循环删除 ->每删除1个元素,其他元素索引集体前挪1,故导致结果出错。 ***

    写在前面循环一个列表的时,最好不要改变列表的大小(长度),这样会影响你的最终的结果。

    # 坑2 -循环列表并在循环过程中删除列表中的元素,会导致结果错误。
    
    # 示例1:删除列表li中的偶数。
    # 法一:从前向后循环list,按元素删remove-失败。
    li = [2, 4, 5, 6, 7]
    for i in li:  # 按元素循环,有元素则循环,没有元素则结束循环。
        if i % 2 == 0:
            li.remove(i)  # 按元素删。
    print(li)
    结果:
    [4, 5, 7]
    

    原因剖析: 造成此种结果的原因有2个。

    1.for循环的内部机制。-for只按指针进行循环。

    2.列表本身的特性。-每删除1个元素,其他元素索引会集体前挪1。

    详细:for的运行过程,会有一个指针来记录当前循环的元素是哪一个。

    一开始这个指针指向第0 个,然后获取到第0个元素,紧接着删除第0个。 这个时候. 原来是第一个的元素会自动的变成第0个。然后指针向后移动一次, 指向1元素。这时原来的1已经变成了0, 也就不会被删除了。

    :若对list进行for循环删除元素,则每删一个元素,此元素后面的所有元素索引会集体前挪1.则挪完后的第一个元素,由于索引已被遍历过,故不会再循环它(-即漏网之鱼被略过)。如此,便会造成结果错误。

    # 法二:从前向后循环list,按索引删del -失败。
    li = [2, 4, 5, 6, 7]
    for i in range(0, len(li)):  # 总共循环5次。# 索引:0,1,2,3,4。
        if li[i] % 2 == 0:
            del li[i]  # 按索引删(公共del)
    print(li)
    # 结果:IndexError:list index out of range
    # 译:索引错误:列表索引超出范围。
    # 原因分析:range(0, len(li))代表要循环5次。但是依照上图(list特性)来看,每删除1个元素,后面元素的索引就会前挪1次。循环第一次(找索引0)后,2是偶数,删除.则最大索引由4->3;循环第二次(找索引1)后,5不是偶数,继续循环;循环第三次(找索引2)后,6是偶数,删除.则最大索引由3->2;最大索引2->1;循环第四次(找索引3),此时最大索引是2,找不到索引3,故会报错。
    
    # 法三:从前向后循环list,按索引删pop -失败。
    li = [2, 4, 5, 6, 7]
    for i in range(0, len(li)):  # 循环5次。# 索引:0,1,2,3,4。
        if li[i] % 2 == 0:
            li.pop(i)  # 正向循环删 -pop也不行。
    print(li)
    # 结果:IndexError:list index out of range
    # 译:索引错误:列表索引超出范围。
    # 原因同上。
    

    出坑:2种方法。

    # 法一:将要删除的元素添加到另一个序列中,然后根据此序列中的元素名称删除原列表中的元素。
    li = [2, 4, 5, 6, 7]
    del_li = []
    for i in li:
        if i % 2 == 0:
            l2.append(i)
    for j in del_li:
        li.remove(j)  # 根据del_li列表里的元素名,删除li中的数据。
    print(li)
    # 结果:[5, 7]
    
    # 法二:倒着删。-倒序循环list + 用pop/del按索引删。
    li = [2, 4, 5, 6, 7]
    for i in range(len(li)-1, -1, -1):
        if li[i] % 2 == 0:
            del li[i]
    print(li)
    或:
    li = [2, 4, 5, 6, 7]
    for i in range(len(li)-1, -1, -1):
        if li[i] % 2 == 0:
            li.pop(i)
    print(li)
    # 结果:[5, 7]
    

    示例2:删除列表中的所有元素。

    # 错误实例1:正序-remove
    li = [11, 22, 33, 44]
    for i in li:  # 按元素循环,有元素则循环,没有元素则结束循环。
    	li.remove(i)
    print(li)
    结果:
    [22, 44]
    # 原因分析:同实例一。
    
    # 错误实例2:正序-del
    li = [11, 22, 33, 44]
    for i in range(0, len(li)):  # 总共循环4次。# 索引:0,1,2,3。
    	del li[i]
    print(li)
    # 结果:IndexError: list assignment index out of range
    # 译:索引错误:列表分配索引超出范围。
    # 原因分析:range(0, len(li))代表要循环4次。但是依照上图(list特性)来看,每删除1个元素,后面元素的索引就会前挪了1次。删第一个元素(按0删)后,最大索引3->2;删第二个元素(按1删)后,最大索引2->1;删第三个元素时,找不到索引2了,故会报错。
    
    # 错误实例3:正序-pop
    li = [11, 22, 33, 44]
    for e in li:  # 循环的是元素。# 列表里有元素就循环,没元素则结束循环。
    	li.pop() # pop不写索引,默认删除最后一个元素。
    print(li)
    结果:
    [11, 22]
    # 原因分析:循环第一个元素时,删44;循环第二个元素时,删33;循环第三个元素时,没有元素可删,故结束循环。
    

    出坑:3种方法。

    # 法一(通用):将要删除的元素添加到另一个序列中,然后根据此序列中的元素名称删除原列表中的元素。
    li = [11, 22, 33, 44]
    del_li = []
    for e in li:
    	del_li.append(e)
    for i in del_li:
     li.remove(i)
    print(li)
    # 结果:[]
    
    # 法二:倒着删。-倒序循环list + 用pop/del按索引删。
    li = [11, 22, 33, 44]
    for i in range(len(li)-1, -1, -1): # 总共循环len(li)次, 然后从后往前删除
        li.pop(i)
    print(li)
    # 结果:[]
    
    # 法三(此题独有):倒着删。-正序循环list + 用pop()删。
    li = [11, 22, 33, 44]
    for i in range(0, len(li)): # 总共循环len(li)次, 然后从后往前删除
        li.pop()
    print(li)
    # 结果:[]
    

    五.元组(tuple) -不可变。有序。

    5.0定义

    # 元祖:俗称不可变的列表,又被称为只读列表,元祖也是python的基本数据类型之一,用小括号括起来,里面可以放任何数据类型的数据。
    # 可索引,切片,步长,for循环,len,但只可查询不能修改和删除。
    
    • 格式:
    tu = (1,True,'吕布',[1,'MrLin',(1,888,5)],'hfp')
    
    • 什么时候用tuple?
    # 将一些非常重要的不可让人改动的数据放在元祖中,只供查看。
    
    • ps-1:书写规范 - 见到元组,不管有几个元素,一定记得最后加逗号
    • ps-2:空元组是(),不用加逗号!!
    tu = (1, )
    tu2 = (1 )
    tu3 = ()
    print(type(tu))
    print(type(tu2))
    print(type(tu3))
    # 结果:
    <class 'tuple'>
    <class 'int'>
    <class 'tuple'>
    
    # 面试题:判断以下数据是什么类型。
    value1 = 1  # int
    value2 = (1)  # int
    value3 = (1,)  # tuple
    print(type(value2))
    # 另,data = [(1),(2),(3)] 等价于 data = [1,2,3]。
    
    • ps-3:关于不可变。***

      注意: 这里元组的不可变的意思是子元素不可变。而子元素内部的子元素可以变, 这取决于子元素是否是可变对象。

    # 示例一:元组中的最外层元素不可被修改/删除。
    tu1 = (1, '吕布', 'MrLin' )
    tu1[1] = '貂蝉'  # 错误
    tu1 = '貂蝉'  # 正确
    
    # 示例二:可以嵌套
    tu = (1, 2, 22, (666, 7), (0, '吕布来了', (88, 99 ,'eat apple'), 1), 10)
    
    # 示例三:元组中的最外层元素不可被修改/删除。但深层元素可以修改。取决于该元素是否是可变对象。
    tu = (11, [1, 2, 3], 22, 33)
    tu[1] = 666  # 错误
    tu[1][0] = 666  # 正确
    print(tu)
    # 结果:(11, [666, 2, 3], 22, 33)  # list可变,故对其进行修改,会直接改变它本身。
    
    # 示例四:
    tu = [11, 22, 33, (1, 2, 3), 44]
    tu[-2][0] = 9  # 错误
    tu[-2] = 9  # 正确
    print(tu)
    # 结果:[11, 22, 33, 9, 44]  # list可变,故对其进行修改,会直接改变它本身。
    

    (一).公共功能 -共8个。tuple不能删和改。

    5.1元组相加

    • 相加后是形成一个新元组,列表里放的是这2个小元组的所有元素;
    • 新元组依然有序
    tu = (1, 2, 3)
    tu2 = (666, )
    result = tu + tu2
    print(result)
    # 结果:(1, 2, 3, 666)
    

    5.2元组*int

    • 形成一个新元组。新元组里是int个被乘元组里的元素。
    • 依然有序。
    tu2 = (666, )
    result = tu2 * 3
    print(result)
    # 结果:(666, 666, 666)
    

    (1).查 -4种公共方法。索引、切片、步长、for循环。

    5.3索引

    同str

    5.4切片

    同str

    5.5步长

    同str

    5.6for循环 -同list。

    示例:

    # 需求:遍历元组中的每一个元素。
    tu = (1,True,'吕布',[1,'MrLin',(1,888,5)],'hfp')
    for item in tu:
        print(item) 
    

    ps-1:与for平齐的行,只打印for循环的序列中的最后一个元素。

    ps-2break和continue在for循环中依然适用

    5.7len

    ps:对于list,返回值是:tuple中的元素个数;

    tu = (1,True,'吕布',[1,'MrLin',(1,888,5)],'hfp')
    print(len(tu))
    # 结果:5
    

    5.8in

    # 判断某元素知否在tuple中。
    tu1 = (1, 2, 3, 0)
    if 666 in tu1:
        print('存在')
    else:
        print('不存在')
    

    (二).tuple的方法(无)

    (三).tuple的强制转换 -同list。

    写在前面-1:只能将容器类的数据类型转换为list。

    写在前面-2:str-->list,是将str的每个字符作为list的元素。

    示例:

    # 示例一:str--》tuple  # 将str的每个字符作为tuple的每个元素。
    s = '吕布睡着了'
    tu1 = tuple(s)
    print(tu1)
    # 结果:('吕', '布', '睡', '着', '了')
    
    # 示例二:list--》tuple
    li = [1, 2, 3]
    tu2 = tuple(li)
    print(tu2)
    # 结果:(1, 2, 3)
    
    # 示例三:dict--》tuple  # 只是将dict的key转换为tuple。
    dict1 = {'name': '吕布', 'age': 18}
    tu3 = tuple(dict1)
    print(tu3)
    # 结果:('name', 'age')
    
    # 示例四:set--》tuple
    set1 = {1, 2, 3}
    tu4 = tuple(set1)
    print(tu4)
    # 结果:(1, 2, 3)
    

    六.字典 -可变/无序。(3.5以后有序)

    写在前面-1字典的键和集合一样,利用哈希算法得到的内存地址存储和查询,查询速度快。查的是。然后通过键再去查值。

    写在前面-2:哈希表中,1和True被认为是同一个值。若2者同为dict的键,则采用old键,new值

    6.0字典定义

    字典(dict)是python中唯⼀的⼀个映射类型。它是以{ }括起来的键值对组成。
    在dict中key是 唯⼀的.在保存的时候, 根据key来计算出⼀个内存地址. 然后将key-value保存在这个地址中.
    这种算法被称为hash算法, 所以, 切记, 在dict中存储的key-value中的key必须是可hash(即不可变)的,这个是为了能准确的计算内存地址⽽规定的。
    目前已知的可哈希(不可变)的数据类型: int, str, tuple, bool ;
    不可哈希(可变)的数据类型: list, dict, set。
    # 字典的特点-1:数据与数据之间关联性强,查询速度快。
    # 字典的特点-2:键必须是可哈希的(不可变类型)。值可保存任意类型的数据。
    # ps:字典是无序的。python3.6版本以后才有序。
    

    格式

    dict1 = {'key1':value1,'key2':value2}
    

    ps键必须是可哈希的int, str, tuple, bool值没有要求.可以保存任意类型的数据。

    6.0’字典的创建方式 -4种

    # 面试会考
    # 方式一:
    dic = dict((('one', 1), ('two', 2), ('three', 3)))  # 大元组里套小元组。
    print(dic)  # {'one': 1, 'two': 2, 'three': 3}
    
    # 方式二:
    dic = dict(one=1, two=2, three=3)  # 类似关键字。
    print(dic)
    
    # 方式三:
    dic = dict({'one': 1, 'two': 2, 'three': 3})  # 最常见。
    print(dic)
    
    # 方式四:fromkeys 字典的快速创建方式。 # 所有值公用一个内存空间。
    # 格式:dic = dict.fromkeys(序列, value)  # 序列中的所有元素必须可hash。
    dic = dict.fromkeys(['a', 'b', 'c'], 666)
    print(dic)
    # 结果:{'a': 666, 'b': 666, 'c': 666}
    

    (一).公共功能 -6个。

    6.1索引

    ps:因为字典无序,所以只能通过键去取值。没有切片和步长。

    dic = {'name': '吕布', 'age': 8, 'hobby': 'eat'}
    print(dic['name'])
    # 结果:吕布
    

    ps:关于dict无序的问题。dict保存的数据不是按照我们添加进去的顺序保存的. 是按照hash表的顺序保存的. ⽽hash表不是连续的. 所以不能进行切片操作. 它只能通过key来获取dict中的数据

    6.2for循环

    # 1.循环打印字典的键 -2种。
    dic = {'name': '吕布', 'age': 8, 'hobby': 'eat'}
    # 法一:直接for循环字典
    for i in dic:
        print(i)
    # 法二:for循环dic.keys()
    for i in dic.keys():
        print(i)
    # 2.循环打印字典的值 -2种。
    # 法一:for循环dic.values()
    for i in dic.values():
        print(i)
    # 法二:for循环字典,然后根据键取值。
    for i in dic:
        print(dic[i])
    # 3.循环字典,获取键和值。
    for k, v in dic.items():  # 解构
        print(k, v)
    结果:
    name 吕布
    age 8
    hobby eat
    # 4.循环打印元组形式的键值对。  # 不常用。
    for i in dic.items():  # 没有对元组解构
        print(i)
    结果:
    ('name', '吕布')
    ('age', 8)
    ('hobby', 'eat')
    

    6.3len

    dic = {'name': '吕布', 'age': 8, 'hobby': 'eat'}
    print(len(dic))
    # 结果:3
    

    ps:len获取到的是字典中键值对的对数

    6.4修改 -键存在,改值;键不存在,则添加键值对. dict[键] = '新值'

    ps: dict[键] = '新值',是根据键是否存在改值

    # 改值  dict[键] = '值'
    
    # Case1.键存在 -改值
    dic = {'name': '吕布', 'age': 8, 'hobby': 'eat'}
    dic['name'] = '貂蝉'
    print(dic)
    # 结果:{'name': '貂蝉', 'age': 8, 'hobby': 'eat'}
    
    # Case2.键不存在 -添加键值对
    dic = {'name': '吕布', 'age': 8, 'hobby': 'eat'}
    dic['sex'] = '男'
    print(dic)
    # 结果:{'name': '吕布', 'age': 8, 'hobby': 'eat', 'sex': '男'}
    

    6.5删除 -通过键删除键值对 del dict[键]

    ps:删除的是整个键值对。

    dic = {'name': '吕布', 'age': 8, 'hobby': 'eat'}
    del dic['name']
    print(dic)
    # 结果:{'age': 8, 'hobby': 'eat'}
    

    6.6 in -判断字典的键/值/键值对是否在dict中。

    # 判断字典的键/值/键值对是否在dict中。
    # 写在前面:in dic 默认判断的是键。
    dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    # 1.判断键是否在dict里。
    # 法一:in
    dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    if 'k1' in dic:
        print("在里面")  # 但replace替换不了。
        
    # 法二:get -键在dict中,返回值;不在dict中,则返回'不是字典的键'。
    info = {'name': '吕布', 'age': 18}
    data = info.get('age', '不是字典的键')
    print(data)
    # 2.判断值是否在dict里:没有直接方法。只能通过遍历字典的值/将.values()转换为list再用in判断。
    # 方式一:循环判断
    flag = '不存在'
    for item in dic.values():
        if 'v1' == item:
            flag = '存在'    # 用else是错的。
            break
    print(flag)
    或:
    info = {'name': '吕布', 'age': 18}
    flag = False
    for item in info:
        if item == 'name':
            flag = True
            break
    if flag:
        print('在')
    else:
        print('不在')    
    # 方式二:.values()转换为list后,再用in
    fake_li = dic.values()
    value_li = list(fake_li)
    if 'v1' in value_li:
        print('此值存在')
    # 简写:
    if 'v1' in list(dic.values()):
        print('此值存在')
    else:
        print('不存在')
    # 3.分别判断键值对'k2':'v2','k8':'v8'是否在dict里。
    # 法一:常规git查
    value = dic.get('k8')
    if value == 'v2':
        print('存在')
    else:
        print('不存在')
    # 法二:利用git可以设置返回值的特性,健不存在,返回自定义结果;键存在,返回值不打印。
    if dic.get('k8', '不存在') == '不存在':
        print('此键值对不存在')
    else:
        print('存在')
    # 结果:此键值对不存在
    if dic.get('k2', '不存在') == '不存在':
        print('此键值对不存在')
    else:
        print('存在')
    # 结果:存在
    

    (二).字典的方法 -keys,values,items&查&删&增。

    1.查keys,values,items 3种 **

    • 获取字典的 dic.keys()
    dic = {'name': '吕布', 'age': 8, 'hobby': 'eat'}
    key_fake_l = dic.keys()
    print(key_fake_l)
    print(type(key_fake_l))
    # 结果:
    dict_keys(['name', 'age', 'hobby'])
    <class 'dict_keys'>
    

    psdic.keys()就是'dict_keys'类型。是个高仿列表,存放的都是字典中的key

    • 获取字典的 dic.values()
    dic = {'name': '吕布', 'age': 8, 'hobby': 'eat'}
    value_fake_l = dic.values()
    print(value_fake_l)
    print(type(value_fake_l))
    # 结果:
    dict_values(['吕布', 8, 'eat'])
    <class 'dict_values'>
    

    psdic.values()就是'dict_values'类型。是个高仿列表,存放的都是字典中的value

    • 获取字典的键值对 dic.items()
    dic = {'name': '吕布', 'age': 8, 'hobby': 'eat'}
    key_value_fake_l = dic.items()
    print(key_value_fake_l)
    print(type(key_value_fake_l))
    # 结果:
    dict_items([('name', '吕布'), ('age', 8), ('hobby', 'eat')])
    <class 'dict_items'>
    

    psdic.items()就是'dict_items'类型。是个高仿列表,存放的是多个元组!!元祖中第一个是字典中的键,第二个是字典中的值

    • 练习题:循环字典获取键/值/键和值。
    # 1.循环打印字典的键 -2种。
    dic = {'name': '吕布', 'age': 8, 'hobby': 'eat'}
    # 法一:直接for循环字典
    for i in dic:
        print(i)
    # 法二:for循环dic.keys()
    for i in dic.keys():
        print(i)
    # 2.循环打印字典的值 -2种。
    # 法一:for循环dic.values()
    for i in dic.values():
        print(i)
    # 法二:for循环字典,然后根据键取值。
    for i in dic:
        print(dic[i])
    # 3.循环打印元组形式的键值对。
    for i in dic.items():  # 没有对元组解构
        print(i)
    结果:
    ('name', '吕布')
    ('age', 8)
    ('hobby', 'eat')
    # 4.循环字典,获取键和值。
    for k, v in dic.items():  # 解构
        print(k, v)
    结果:
    name 吕布
    age 8
    hobby eat
    
    • 解构拆包) # interview
    # 写在前面-1:凡是可迭代的数据类型,都能进行拆包。
    # 写在前面-2:前后数量要一致。即序列里有几个元素,前面就必须要有几个变量去接收。否则报错。
    
    # 示例:
    a, b = {'name': '吕布', 'age': 8}
    print(a, b)
    # 结果:name age  # 只是键。
    a, b, c = [11, 22, 33]
    print(a, b, c)
    # 结果:11 22 33
    a, b = {111, 200}  # 集合的解构,最多2个。多了报错。
    print(a, b)     # 集合是无序的。故拆包后依然无序。
    # 结果:200 111
    a, b = {111, 200, 5}
    print(a, b, c)
    # 结果:ValueError: too many values to unpack (expected 2)
    
    # 练习题:
    # 1.需求:将字符串value = '1 + 3 + 2'用+号分割,并将分割后的结果加入列表中。然后取列表中的值。
    # 法一:常规方法 -麻烦
    value = '1 + 3 + 2'
    new_li = value.split('+')
    v1 = new_li[0]
    v2 = new_li[1]
    v3 = new_li[2]
    print(v1, v2, v3)
    # 结果:1   3   2
    # 法二:解构 -简便
    value = '1 + 3 + 2'
    a, b, c = value.split('+')
    print(a, b, c)
    # 结果:1   3   2
    # 2.字典dic.items()方法分析。
    # a.循环打印元组形式的键值对。
    for i in dic.items():  # 没有对元组解构
        print(i)
    结果:
    ('name', '吕布')
    ('age', 8)
    ('hobby', 'eat')
    # b.循环字典,获取键和值。
    for k, v in dic.items():  # 解构
        print(k, v)
    结果:
    name 吕布
    age 8
    hobby eat
    

    2.查 dict.git('键',返回值) ** # 键不存在,不会报错!可以自定义返回的结果。

    dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    s = dic['k0']     # 索引查值,如果健不存在,会报错。
    print(s)
    # 结果:KeyError: 'k0'
    s1 = dic.get('k4')      # git通过键查值,如果健不存在,会返回None。
    print(s1)
    # 结果:None
    # None是种特殊的数据类型,该类型表示空(无任何功能,专门用于提供空值)。
    s2 = dic.get('k0', '没有此值')     # git通过键查值,如果健不存在,可以自定义返回的结果。
    print(s2)                         
    # 结果:没有此值
    s2 = dic.get('k3', '没有此值')    # 如果键存在,则设置的返回值不打印。
    print(s2)
    # 结果:v3
    

    3.删 dict.pop('键') 可以看到删除的值(不常用)

    dic = {'v1': 'k1', 'v2': 'k2'}
    deleted = dic.pop('v1')
    print(dic,deleted)
    # 结果:{'v2': 'k2'} k1
    

    4.增 更新dict.update({'键':值,'键':值}) # 键不存在,则添加;存在,则更新(覆盖) -(不常用)。

    写在前面:注意hash表中1和True是同一个值。故,若键是1/True则不会增加,而是更新(覆盖)

    ps1和True等价,无优先顺序。若2者同为dict的键,哪个键在前面,则最后就留哪个键。old值被覆盖。

    格式:

    dict.update(字典)
    

    示例:

    dic = {'v1': 'k1', 'v2': 'k2'}
    dic.update({'v3': '666', 'v1': '100'})
    print(dic)
    # 结果:{'v1': '100', 'v2': 'k2', 'v3': '666'}
    

    特例: 在hash表中,1和True被认为是同一个值

    # 示例1:
    dic = {True: '吕布', 1: 18}  # 1和True同为dict的键时,则谁在前面最后就留谁。值则是old值被覆盖。
    print(dic)
    # 结果:{True: 18}
    dic = {1: '吕布', True: 18}  # 1和True同为dict的键时,则谁在前面最后就留谁。值则是old值被覆盖。
    print(dic)
    # 结果:{1: 18}
    
    # 示例2:用update时,若键是1/True,不会增加,而是更新(覆盖)。
    dic = {True: '吕布', 'age': 18}
    dic1 = {1: '貂蝉', 'name': 'MrLin'}
    dic.update(dic1)
    print(dic)
    # 结果:{True: '貂蝉', 'age': 18, 'name': 'MrLin'}
    

    练习题:

    1.请输出字典所有的键和值,并让用户输入 name/age/gender/hobby,根据用户输入的键,输出对应的值。
    dic = {'name': '吕布', 'age': 8, 'gender': '男', 'hobby': 'eat'}
    for k, v in dic.items():
        print(k, v)
    key = input('请输入键: ')
    print(dic[key])
    2.给你一个空字典,请在空字典中添加数据:k1:1,k2:'2',k3:3。
    dic = {}
    dic['k1'] = 1
    dic['k2'] = '2'
    dic['k3'] = 3
    print(dic)
    # 结果:{'k1': 1, 'k2': '2', 'k3': 3}
    3.给你一个空字典,请让用户输入:key,value,将输入的key和value添加到字典中。
    dic = {}
    key = input('请输入键:')
    value = input('请输入值:')
    dic[key] = value
    print(dic)
    # 结果:{'k1': '123'}
    4.给你一个空字典,请一直让用户输入:key,value,将输入的key和value添加到字典中。直到用户输入N,则表示不再输入。
    dic = {}
    while True:
        key = input('请输入键:')
        if key.upper() == 'N'.upper():
            break
        value = input('请输入值:')
        dic[key] = value
    print(dic)
    5.有字符串content = 'k1|v1,k2|v2,k3|123',请将其用如下方式来表示:info = {'k1':'v1','k2':'v2','k3':'123'}
    # 法一:常规 -索引取值。
    info = {}
    content = 'k1|v1,k2|v2,k3|123'
    new_li = content.split(",")
    for item in new_li:
        items_li = item.split("|")
        info[items_li[0]] = items_li[1]
    print(info)
    # 法二:解构取值 -简便。
    info = {}
    content = 'k1|v1,k2|v2,k3|123'
    new_li = content.split(",")
    for item in new_li:
        k, v = item.split("|")  # 解构取值。
        info[k] = v
    print(info)
    6.创建出一个用户列表,格式如下。然后让用户输入用户名和密码进行登陆。
    '''user_li = [
        {'user': '让用户输入:', 'password': '让用户输入:'},
        {'user': '让用户输入:', 'password': '让用户输入:'},
        {'user': '让用户输入:', 'password': '让用户输入:'},
        {'user': '让用户输入:', 'password': '让用户输入:'},
        {'user': '让用户输入:', 'password': '让用户输入:'},   # 输入N,则不再让用户输入。
    ]'''
    # 1th:构建用户列表
    # 法一:
    user_li = []
    while True:
        u = input('请输入用户名:')
        if u.upper() == 'N':
            break
        p = input('请输入密码:')
        dic = {}
        dic['user'] = u     # 单独写键和值。
        dic['password'] = p
        user_li.append(dic)
    print(user_li)
    # 法二:推荐。
    user_li = []
    while True:
        u = input('请输入用户名:')
        if u.upper() == 'N':
            break
        p = input('请输入密码:')
        dic = {'user': u, 'password': p}    # 键和值直接写进dict里。
        user_li.append(dic)
    print(user_li)
    
    # 2th:用户校验
    # [{'user': 'k1', 'password': '123'}, {'user': 'k2', 'password': '456'}]
    username = input('请输入用户名:')
    password = input('请输入密码:')
    status = '登录失败'
    for item in user_li:
        if username == item['user'] and password == item['password']:
            status = '登录成功'
            break
    print(status)
    

    (三).字典的嵌套 **

    一层一层降维去找。同list的嵌套。

    ps:通常list的嵌套会和dict的嵌套结合。

    (四).字典的坑 -fromkeys & 字典在循环时不能修改。

    • 1.字典的坑1 -fromkeys

    写在前面:fromkeys() 快速创建字典

    定义:Python 字典 fromkeys() 函数用于创建一个新字典以序列中元素做字典的键value为字典所有键对应的初始值。

    格式

    dic = dict.fromkeys(序列,value)   # 用于创建一个新字典。
    print(dic)
    

    返回值:该方法返回一个新字典。

    示例:

    dic = dict.fromkeys(['a', 'b', 'c'], ['你好'])
    print(dic)
    # 结果:{'a': ['你好'], 'b': ['你好'], 'c': ['你好']}
    

    ps序列里的元素必须全部可hash

    字典的坑1 -fromkeys:

    写在前面dict的值用的都是同一个内存空间,只有值是可变数据类型的时候才会出现坑,使用时需慎重。

    # 坑1 -用fromkeys创建dict时,当value是可变数据类型时,修改其中任何一个,其他都会变。
    
    # 看代码写结果:
    # 01.当value为可变数据类型时:字典的所有值共用1个内存空间。其中1个变,其他的都会变。
    dic = dict.fromkeys([1, 2, 3], [])  # 快速创建字典。
    # print(dic)  # {1: [], 2: [], 3: []}
    dic[1].append(666)  # 通过dic[1]找到老巢并修改。
    print(dic)  # {1: [666], 2: [666], 3: [666]}
    
    # 02.当value为不可变数据类型时:1个变,其他的不变。
    dic = dict.fromkeys([1, 2, 3], 1)
    # print(dic)   # {1: 1, 2: 1, 3: 1}
    dic[1] = 123  # 改的只是dic[1]的指向。
    print(dic)  # {1: 123, 2: 1, 3: 1}  # 1个变,其他的不变,因为是不可变数据类型
    

    • 2.字典的坑2 -字典在循环时不能修改 ***
    # 坑2 -循环问题:循环一个字典时,如果改变这个字典的大小,就会报错。 ***
    # 需求:将字典的键中含有'k'元素的键值对删除。
    # 错误示例:
    dic = {'k1': '吕布', 'k2': '妥妥', 'k3': '大黄', 'age': 18}
    for item in dic:
        if 'k' in item:
            dic.pop(item)
    print(dic)  # 会报错:RuntimeError:字典在迭代过程中更改了大小
    
    # 出坑:2种方法。
    # 法一:既然循环dict的时候不能修改,那就循环其他序列的时候修改。
    dic = {'k1': '吕布', 'k2': '妥妥', 'k3': '大黄', 'age': 18}
    for key in list(dic.keys()):  # 将字典的键放入列表中,再循环修改。
        if "k" in key:
            dic.pop(key)
    print(dic)
    或:
    for key in dic.keys():  # 循环dic.keys()这一伪列表,然后修改。
        if "k" in key:
            dic.pop(key)
    print(dic)
    # 结果:{'age': 18}
    
    # 法二:把需要修改的元素暂时先保存在一个list中, 然后循环list, 根据list中的元素再对dict做修改。
    dic = {'k1': '吕布', 'k2': '妥妥', 'k3': '大黄', 'age': 18}
    dic_del_list = []
    # 删除key中带有'k'的元素
    for key in dic:
        if 'k' in key:
            dic_del_list.append(key)
    for e in dic_del_list:  # 根据列表中的元素
        del dic[e]  # 删除dic的键值对
    print(dic)
    # 结果:{'age': 18}
    

    七.集合set -不可变。无序。

    写在前面-1集合和字典的键一样,利用哈希算法得到的内存地址存储和查询,查询速度快

    写在前面-2:哈希表中,1和True被认为是同一个值。若2者同时出现在set中,则留先出现的元素

    set1 = {1, 55, 'name', 7, True, 99}  # 1先出现,留1。
    print(set1)
    # 结果:{1, 99, 7, 55, 'name'}
    set1 = {True, 55, 'name', 7, 1}  # True先出现,留True。
    print(set1)
    # 结果:{True, 'name', 7, 55}
    

    7.0定义

    set集合是python的⼀个基本数据类型。用{}括起来。只能保存可hash(不可变)数据。但是set本身是可变的。
    # 特点:无序。元素不重复。
    # ps:1.集合中的元素必须是不可变的(int/str/bool/tuple/None);2.但set本身可变。3.用{}括起来。
    # 用处:列表去重。爬虫。
    

    格式:

    set1 = {1, '小吕布', True,}
    # 空集合:set()
    

    示例:

    # 1.利用set内元素不重复的特性,进行list去重。
    li = [45, 5, "哈哈", 45, '哈哈', 50]
    li = list(set(li)) # 把list转换成set, 然后再转换回list
    print(li)
    # 结果:[5, 50, 45, '哈哈']
    # 2.set中的元素是不重复的, 且⽆序的。
    s = {"吕布", "貂蝉", "吕布",'张飞'}
    print(s)
    # 结果:{'张飞', '吕布', '貂蝉'}
    # 结果:{'张飞', '貂蝉', '吕布'}   # 每次打印的结果元素顺序都不一样。
    

    (一).公共功能 -3个。

    写在前面:因为set无序,故不能索引、切片、步长、删除、修改(因为修改&删除是根据索引操作)。

    7.1for循环

    同list。

    7.2len

    同list。

    7.3 in

    # 判断某元素是否在set中。
    set1 = {1, 2, 3, 0}
    if 666 in set1:
        print('存在')
    else:
        print('不存在')
    

    (二).set的方法 -增&删&求交/并/差/对称差集。

    写在前面:set可变,故对其进行操作,会直接对原集合产生影响除了求交并差集

    (1).set的增 & 删 -直接对原set产生影响。

    1.增 -add追加 *

    格式:

    set1.add(元素) # 元素必须不可变

    示例

    s = {"刘嘉玲", '关之琳', "王祖贤"}
    s.add("郑裕玲")
    print(s)
    s.add("郑裕玲") # 重复的内容不会被添加到set集合中
    print(s)
    # 结果:
    {'刘嘉玲', '关之琳', '王祖贤', '郑裕玲'}
    {'刘嘉玲', '关之琳', '王祖贤', '郑裕玲'}
    

    批量增加 -update *

    格式:

    set.update({要增加的集合})
    

    示例

    s = {"刘嘉玲", '关之琳', "王祖贤"}
    s.update({'林青霞', '李若彤', '白娘子', '小青', '关之琳'})  # 重复的元素不再添加。
    print(s)
    # 结果:{'刘嘉玲', '林青霞', '小青', '王祖贤', '白娘子', '关之琳', '李若彤'}
    

    2.删 -discard * #元素不存在,不会报错(好)。

    格式:

    set1.discard(元素) # 只能根据元素删,不能索引删(因为set无序)。# discard丢弃。

    示例:

    s = {"刘嘉玲", '关之琳', "王祖贤"} 
    s.discard("关之琳")
    print(s)
    # 结果:{'王祖贤', '刘嘉玲'}
    

    ps:discard比remove好,因为remove元素不存在会报错。

    (2).求set的交/并/差/对称差集 -产生新的集合!不是在原有集合上进行操作。

    写在前面-1:结果是1个新的集合。不是在原有集合上进行操作。

    写在前面-2:intersection/union/difference后面传的值除了可以是set外,还可以是list或tuple

    写在前面-3:若用符号&|- ^ 去求交并差集,则后面传的值只能是set

    1.交集 -set.intersection(集合/列表/元组) 或 &。

    # 交集:两个集合中的共有元素。
    # 1.intersection求交集 -后面传的值可以是集合/列表/元组。
    s1 = {"刘能", "赵四", "⽪⻓⼭"}
    s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
    new_s = s1.intersection(s2)   # 是产生新的set。
    print(new_s)
    # 结果:{'⽪⻓⼭'}
    
    # 后面传的值是列表or元组。
    s1 = {"刘能", "赵四", "⽪⻓⼭"}
    li = ["刘科⻓", "冯乡⻓", "⽪⻓⼭"]
    new_s = s1.intersection(li)  
    print(new_s)
    
    s1 = {"刘能", "赵四", "⽪⻓⼭"}
    tu = ("刘科⻓", "冯乡⻓", "⽪⻓⼭")
    new_s = s1.intersection(tu)  
    print(new_s)
    
    # 2.用符号&求交集 -传的值只能是set!!
    print(s1 & s2) # 结果:{'⽪⻓⼭'}
    

    2.并集 -set.union(集合/列表/元组) 或 |。

    # 并集:不是单纯的将2个序列里的元素合到一起,而是会去重。
    # 1.用union求并集 -后面传的值是集合/列表/元组。
    s1 = {"刘能", "赵四", "⽪⻓⼭"}
    s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
    new_set = s1.union(s2)
    print(new_set)   
    # 结果:{'刘科⻓', '冯乡⻓', '赵四', '⽪⻓⼭', '刘能'}
    
    # 2.用符号|求并集 -传的值只能是set!!
    print(s1 | s2) 
    # 结果:{'刘科⻓', '冯乡⻓', '赵四', '⽪⻓⼭', '刘能'}
    

    3.差集 -set.difference(集合/列表/元组) 或 -。

    # 差集
    # 写在前面:2种方法求出来的结果都是前面那个set的差集。
    # 1.用difference求差集 -后面传的值是集合/列表/元组。结果是前面那个集合的差集。
    s1 = {"刘能", "赵四", "⽪⻓⼭"}
    s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
    new_set = s1.difference(s2)
    print(new_set) 
    # 结果:{'赵四', '刘能'}
    
    # 2.用符号-去求差集 -01.传的值只能是set。02.结果是前面那个集合的差集。
    print(s1 - s2) 
    # 结果:{'赵四', '刘能'} 
    

    4.对称差集(反交集) -symmetric_difference((集合/列表/元组) 或 ^。

    # 对称差集(反交集):先取前面这个集合的差集,再取后面这个集合的差集。放一起。
    # 1.用symmetric_difference去求对称差集 -后面传的值是集合/列表/元组。
    s1 = {"刘能", "赵四", "⽪⻓⼭"}
    s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
    new_set = s1.symmetric_difference(s2)
    print(new_set) # {'冯乡⻓', '刘能', '刘科⻓', '赵四'}
    
    # 2.用符号^去求对称交集 -传的值只能是set。
    print(s1 ^ s2) 
    # 结果:{'冯乡⻓', '刘能', '刘科⻓', '赵四'}
    

    八.None -一种特殊的数据类型。

    def:None是1种特殊的数据类型,该类型表示空(无任何功能,专门用于提供空值)。

    九.常用的类型转换

    (一).7种转bool为False的情况。

    0,'',[],(),{},set(),None。 # 空元组是(),不加逗号;空集合是set()。
    
    # 7种数据类型转bool为False的情况:
    None
    int   0
    str   ''
    list  []
    dict  {}
    set   set()  # 虽然集合的格式是v = {1,2},但空集合用set()来表示。
    tuple ()
    # None是一种特殊的数据类型,该类型表示空(无任何功能,专门用于提供空值)。
    
    # 为什么空集合是set()?
    # - 因为7种数据类型中,5种序列,在空的情况下,只有集合仅存在1种表现形式,其他数据类型都有2种表现方式。
    None  v0 = None
    int   v1 = int() --> 0
    bool  v2 = bool() --> False
    str   v3 = ''
          v3 = str()
    list  v4 = []
          v4 = list()
    tuple v5 = ()
    	  v5 = tuple()
    dict  v6 = {}
    	  v6 = dict()
    set   set()  # 仅此一种变现方式。
    

    (二).其他6种之间的转换 -常用6种。

    # 1.str --》int  # 只渡可渡之人
    s1 = '666'
    value = int(s1)  # str中的元素必须是int,才可转。
    print(value)
    结果:666
    # 2.int --》str
    value = str(999)  # '999'
    # 3.list --》tuple
    li = ['貂蝉', 123, '吕布', '熬夜长痘aaa']
    tu1 = tuple(li)
    print(tu1)
    结果:('貂蝉', 123, '吕布', '熬夜长痘aaa')
    # 4.tuple --》list
    tu = ('貂蝉', 123, '吕布', '熬夜长痘aaa')
    l1 = list(tu)
    print(l1)
    结果:['貂蝉', 123, '吕布', '熬夜长痘aaa']
    # 5.list <--str  # 字符串方法.split('str中的某字符->分割符')
    s = '1+ 2 +10 + 2 0'
    s_li = s.split('+')
    print(s_li)  
    # 结果:['1', ' 2 ', '10 ', ' 2 0']
    # 6.list -->str  # 字符串方法.join('连接符')
    li = ['吕布', '小黑', '妥妥']
    s = '&'.join(li)  # join(序列).序列里的元素必须全部是str类型才可进行拼接。
    print(s)
    # 结果:吕布&小黑&妥妥
    

    练习题:

    # 1.将列表nums = [11,22,33]转换成字符串'11_22_33'。
    nums = [11, 22, 33]
    for item in range(0, len(nums)):
        nums[item] = str(nums[item])   # 必须确保序列里的元素全部都是str,才能join拼接。
    s = '_'.join(nums)   # join拼接后的结果是个str。
    print(s)
    # 结果:11_22_33
    # 2.将'1+  2+ 3+ 4'转换成[1,2,3,4]
    s = '1+  2+ 3+ 4'
    s = s.replace(' ', '')
    li = s.split('+')
    print(li)
    

    十.七种数据类型小结

    (1).7种数据类型对比

    1.格式

    • int:1。2。666。 # 只能是整数
    • bool:True False
    • str:'内容',"内容",'''内容''',"""内容"""。 # 可以保存任意类型的数据or字符。但切片/索引取到的均是str类型
    • list[1, 2, '吕布', True, [666, 'MrLin'], (11, 22,'貂蝉')] # 可以保存任意类型的数据。
    • tuple(1, 2, '吕布', True, [666, 'MrLin'], (11, 22,'貂蝉')) # 可以保存任意类型的数据。
    • dict{1: '水', False: 0, "name": '吕布', (1, 2): [11,22]} # key不可变, value没有要求.可以保存任意类型数据
    • set{"吕布", "大黄", "妥妥"} # 只能保存不可变的数据。但set本身是可变的。

    2.可变 & 不可变

    • 可变(不可hash):list、dict、set。
    • 不可变(可hash):int、bool、str、tuple。

    3.可迭代 & 不可迭代

    • 可迭代(容器类):str、list、tuple、dict、set。
    • 不可迭代(非容器类):int、bool。

    4.有序 & 无序

    写在前面:只有容器类(可迭代)数据,说有序/无序才有意义。

    • 有序(可索引):str、list、tuple、dict(3.5版本以后有序-不能索引,只能通过键取值/查询)
    • 无序(不可索引取值):set。-集合是无序的。

    ps:通常认为dict是无序的。但dict可以通过索引取值,不过取到的只是dict的键。

    5.各自特点 -(待续)

    • str:切片/索引取到的仍然是str
    • list:str<-->list之间的转换要清楚。均用的是str方法:join,split。
    • tuple:不可变。最外层元素不可修改,但深层元素中的可变数据类型可修改。
    • dict:查询速度快( 因为内部是利用hash算法存储/查值 )。键必须可hash(不可变)。
    • set:无序元素必须可hash查询速度快( 因为内部是利用hash算法存储/查值 )。

    (2).公共功能小结

    写在前面:一共9种公共功能。加,乘数字,索引,切片,步长,for循环,len,删,改,in。

    十一.for循环

    • ps-1:for循环内部自加机制不需要我们再去自加让其转起来。

    • ps-2for循环的对象必须可迭代。eg:字符串/列表/字典/元组/集合这5种可迭代的类型and其他可迭代的序列(eg:range())。)

    • ps-3:for循环可嵌套

    • ps-4breakcontinue在for循环中依然适用

    • ps-5:与for平齐的行,只打印for循环的序列中的最后一个元素

    • :for和while的应用场景:有穷尽优先使用for,无穷尽用while

    • 格式

      for 变量 in 序列:
      	循环体内容
      

      示例:

      # 需求:遍历字符串中的每一个元素。
      value = ['吕布666',True,7]
      for item in value:
          print(item) 
      结果:
      吕布666
      True
      7
      
    • ps详细

      # ps-1:与for平齐的行,只打印for循环的序列中的最后一个元素。
      value = ['吕布666',True,7]
      for item in value:
          print(item) 
      print(item)  # 只打印最后一个元素。
      # 结果:7
      
      # ps-2:break和continue在for循环中依然适用。
      value = ['吕布666',True,7]
      for item in value:
          print(item)
          break
      # 结果:'吕布666'
      value = ['吕布666',True,7]
      for i in value:
          print(i)
          break
          print('啊哈')  # 不打印。
      # 结果:'吕布666'
      value = ['吕布666',True,7]
      for i in value:
          print(i)
          continue
          print('啊哈')  #不打印。
      # 结果:
      吕布666
      True
      7
      
    • 练习题

      1.遍历list中的各元素

      content = ['MrLin_儒雅先生','纳兰容若']
      for item in content:
          print(item)
      

      2.遍历各元素的索引

      content = ['MrLin_儒雅先生','纳兰容若',666,True,'Faye']
      max_index = len(content) -1
      for item in range(0,max_index + 1):
          print(item)
      

      3.for循环的嵌套

      • 练习题:
      1.看代码写结果:
      users = ['吕布','小花','流浪歌手','天赋']
      for item in users:
          for ele in item:
              print(ele)
      2.看代码写结果:
      users = ['吕布','小花','流浪歌手','天赋']
      for item in users:
          print(item)
          for ele in item:
              print(ele)
      

    十二.len -获取长度

    (一).len

    ps-1:仅适用于7种数据类型中的可迭代类型:str/list/tuple/dict/set,int和bool不行。

    ps-2:len(5种数据类型)的返回值判断依据。

    对于str,返回值是:str中的字符个数;

    对于list,返回值是:list中的元素个数;

    对于tuple,返回值是:tuple中的元素个数;

    对于dict,返回值是:dict中的键值对的个数;

    对于set,返回值是:set中的元素个数。

    示例

    (二).应用

    1.使用while循环 -打印str/list/tuple/dict/set中的每一个元素

    • 使用while循环遍历str中的每一个元素:
    value = '吕布666'
    index = 0
    while index <= len(value) - 1:
        val = value[index]  # 根据索引取值。
        print(val)
        index += 1
    

    2.使用for循环 -打印str/list/tuple/dict/set中的每一个元素

    写在前面:for循环时可以循环的数据结构必须是可迭代的:str/list/tuple/dict/set,int和bool不行。

    • 使用for循环遍历str中的每一个元素:
    value = '吕布666'
    for i in value:
        print(i) 
    # 结果:
    吕
    布
    6
    6
    6
    

    (三).练习题

    1.需求:让用户输入任意字符串,获取字符串之后计算其中有多少个数字。
    (1).while循环:
    content = input('请输入内容:')
    index = 0
    count = 0
    while index <= len(content) - 1:
        val = content[index]
        if val.isdigit():
            count += 1
        index += 1
    print(count)
    (2).for循环:
    content = input('请输入内容:')
    count = 0
    for i in content:
        if i.isdigit():  # i.isdigit()的返回值就是True/False,如果是True(即if的条件是True),
            count += 1   # 则满足if的条件,就会执行if里面的内容。
    print(count)
    2.需求:让用户输入任意一个str,取这个str的最后2个字符。
    方法一:
    data = input('请输入:')
    value = data[-2:]
    print(value)
    
    方法二:len -更严谨,因为可加个if判断这个str够不够2个字符再取切片。
    data = input('请输入:')
    total_len = len(data)
    value2 = data[total_len - 2:total_len]
    print(value2)
    
    # 完整版:
    value = input('请输入内容:')
    total_len = len(value)
    if total_len >= 2:
        val = value[total_len - 2:total_len]
        print(val)
    else:
        print('输入有误')
    

    十三.内置函数 -range()

    写在前面:range()是python的1个内置函数用在for循环中!!

    • 定义

      range()是一个范围。它的内部是一个乘放整数的伪列表,通过()里的参数来控制伪列表里数字的范围。

      若直接打印range(),则结果是它本身,而不会显示伪列表里的内容(若要其显示,则需将range类型转换为list类型)。

      这就是range()类型。

      剖析:

      fake_l = range(1,5,2)
      
      print(fake_l)
      print(type(fake_l))
      print(list(fake_l))
      结果:
      range(1, 5, 2)  # 一个范围。
      <class 'range'>  # 它就是range类型,不是list类型。只不过它的内部表现形式是个看似列表的伪列表而已。
      [1, 3]  # 若想看range到底是哪些范围的数字,可将其转换为list类型,再进行查看。
      
    • 格式:

      range(start, stop, step)
      

      参数说明:

      第一个参数start是范围的起始位置。默认是从 0 开始。例如range(5)等价于range(0, 5);

      第二个参数stop是范围的结束位置。但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5;

      第三个参数step是步长默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

      ps-1这里的起始位置,类似于切片。不顾尾;步长类似于str的步长,步长为负,则尾向左顺延1位

      ps-2:str的切片/步长,若取不到,是什么都不打印但不报错。但range若取不到值,则伪列表为空!!

      示例:

      >>> range(10)        # 代表 从 0 开始到 9 的数字范围
      >>> range(1, 11)     # 代表 从 1 开始到 10
      >>> range(0, 30, 5)  # 代表 从 0 开始到 29,步长为 5 的数字范围
      >>> range(0, -10, -1) # 代表 [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]的范围,但显示不出来。
      >>> range(0)  # 代表 [] ,需将range类型转换为list类型才能看到结果。eg:print(list(range(0)))。
      >>> range(1, 0)  # []   # 当范围里的参数取值,什么都取不到时,伪列表里为空。
      >>> range(0, 0)  # [] 
      >>> range(0, 1)  # [0]
      
    • 适用场景:一般用在for循环中。 (因range()本身可迭代,故可for循环)

    • 练习题:

      1.利用for循环和range打印出下面str的索引。
      s = "哈哈哈哈哈那大傻"
      for i in range(0,len(s)):
          print(i)
      2.利用for循环和range打印出下面列表的索引。
      li = ['暖男吕布','呲牙大黄','傻二妥妥','x']
      for i in range(0,len(li)):
          print(i)
      3.打印2-10 ,用for循环和while循环分别实现。
      for i in range(2,11):
          print(i)    # for循环内部自加
          
      count = 2
      while count <= 10:
          print(count)
          count += 1   # 需要自加
      4.用for打印1 2 3 4 5 6 8 9 10(没有7)。
      for i in range(1,11):
          if i != 7:
              print(i)
              
      for i in range(1,11):
          if i == 7:
              pass
          else:
              print(i)
      5.利用for循环和range从100~1,倒序打印。
      for i in range(100,0,-1):     # 步长为负,则向左顺延。
          print(i)   
      6.利用for循环和range找出100以内所有的偶数,并将这些偶数加入到一个列表中。
      # 法一:range步长
      li = []
      for i in range(0,101,2):
          li.append(i)
      print(li)
      # 法二:range切片
      li = []
      for i in range(0,101):
          if i % 2 == 0:
          	li.append(i)
      print(li)
      7.打印1-100的所有偶数,并将这些偶数放到一个列表中。
      li = []
      for i in range(2,101,2):   # 从第一个偶数开始.
          li.append(i)
      print(li)
      8.利用for循环和range找出50以内能被3整除的数,并将这些数加入到一个列表中。
      li = []
      for i in range(0,51):
          if i % 3 == 0:    # % 是取余数。
              li.append(i)
      print(li)
      # 结果:[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48]
      9.利用for循环和range找出50以内能被3整除的数,并插入到列表的第0个索引位置。 # 即倒序加入列表。
      

    li = []
    for i in range(0,51):
    if i % 3 == 0: # % 是取余数。
    li.insert(i)
    print(li)

    结果:[48, 45, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0]

    9.利用for循环和range,将1-30的数字一次添加到一个列表中,并循环这个列表,将能被3整除的数改成
    li = []
    index = 0
    for i in range(1,31):
    li.append(i)
    for i in li:
    if i % 3 == 0:
    li[index] = '
    '
    else:
    index += 1
    print(li)
    10.用range分别打印0-9和9-0。并将其放入列表中。
    print(list(range(0,10))) # 尾开区间。步长为正,向右顺延。
    print(list(range(9, -1, -1))) # 切片的尾是开区间。步长为负,则向左顺延。

    结果:

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    11.将字符串name = '吕布睡着了'进行反转。

    思路:for循环+range倒序。ps:其他方法见面试题。

    result = ''
    max_index = len(name) - 1
    for item in range(max_index, -1, -1):
    result = result + name[item]
    print(result)

    
    ### 十四.内置函数 -type()
    
    ```python
    # type()是python的一个内置函数,用来判断变量的数据类型。
    
    # 示例:判断一个变量是什么数据类型? # interview.
    v = [1, 2, 3]
    if type(v) == str:  # str是类。固定写法。
      print('v是字符串')
    elif type(v) == list:  # list是类
      print('v是列表')
    elif type(v) == tuple:  # tuple是类
      print('v是元组')
    elif type(v) == dict:  # dict是类
      print('v是字典')
    elif type(v) == set:  # set是类
      print('v是集合')
    
  • 相关阅读:
    庆祝一下开通了第一条博客!
    查看树莓派温度
    Ubuntu Server for Raspberry Pi部署Jenkins
    acme.sh部署RSA、ECC双证书(使用阿里云API)
    Ubuntu Server 20.04换用阿里源
    ESP32使用NTP同步时间
    C语言的可变参数函数
    一种Θ(1)的计算32位整数二进制中1的个数的方法
    CentOS 8安装Docker
    CentOS 8搭建LNMP + WordPress(三)
  • 原文地址:https://www.cnblogs.com/wanshizidiao/p/11005290.html
Copyright © 2011-2022 走看看