03-python基础语法_2.数据类型

折月煮酒 提交于 2020-02-26 01:43:57

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时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

 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头尾两边的空格/换行符(\n)/制表符(\t)/特定字符 返回值:新str

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

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

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

ps:the meaning of strip is 去除

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

  • rstrip .rstrip() -去除str右边的空格/换行符(\n)/制表符(\t)/特定字符 返回值:新str
  • lstrip .lstrip() -去除str左边的空格/换行符(\n)/制表符(\t)/特定字符 返回值:新str
  • strip .strip() -去除str两边的空格/换行符(\n)/制表符(\t)/特定字符 返回值:新str
  • 去除str两边某个/某些字符 str.rstrip/lstrip/strip('要去除的字符') 返回值:新str

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

# 制表符:\t
s1 = 'a\tMrLin'
print(s1)  
# 结果:a     MrLin

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

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

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+'\n'+b+name+'\n'+c+age+'\n'+d+job+'\n'+e+hobby+'\n'+f)    # \n是换行符。
# 运行结果
------------ 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'\xe5\x90\x95\xe5\xb8\x83'  # 这是用十六进制表示的二进制。
结果:b'\xc2\xc0\xb2\xbc'
# 当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'\xe5\x90\x95 这是一个汉字的UTF-8的bytes表现形式。
  3. 中文:b'\xc2\xc0 这是一个汉字的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'\xe5\x90\x95\xe5\xb8\x83'

value2 = b'\xe5\x90\x95\xe5\xb8\x83'.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'\xce\xd2\xca\xc7\xce\xc4\xd7\xd6'

# 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'\xe6\x88\x91\xe6\x98\xaf\xe6\x96\x87\xe5\xad\x97'

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()

# 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是集合')
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!