列表与for循环

时间:2021-06-14 20:31:35

一、list列表

1.概述

变量:使用变量存储数据,但是,有一个缺点:一个变量每次只能存储一个数据

#需求:存储5个人的年龄,求他们的平均年龄
age1 = 29
age2 = 36
age3 = 37
age4 = 47
age5 = 10
​
average = (age1 + age2 + age3 + age4 + age5) / 5

解决方案:从内存的角度上分析,优化内存,使用列表存储数据

伪代码:列表 = [100个人的年龄]

num = 10

作用:列表相当于一个容器,可以同时存储多个数据

本质:列表是一个有序的集合

说明:有序指的是有顺序,并不是排序【数据在内存中的存储的顺序和存放的顺序是相同的】

注意:列表中实际上存储的仍然是变量

2.创建列表

创建列表其实就相当于定义一个列表类型的变量

语法:

​ 变量名 = 初始值

​ 列表名 = 列表 =====》列表名 = [数据1,数据2。。。。]

说明:

​ a.Python中使用[]表示列表

​ b.列表中存储的数据被称为元素

​ c.列表中的元素默认从头到尾进行编号,编号从0开始,编号的取值范围:0~元素的个数 -1,这些编号被称为索引,下标,角标

​ d.注意:索引的作用就是方便获取或者操作数据,如果在获取数据的过程中,超出索引的范围,则代码会报错【下标越界,索引越界】

代码演示:

#1.创建一个空列表
#list()
#注意:列表的命名一般使用listxxx,尽量不要直接使用list
list1 = []
print(list1)
​
​
#2.创建一个非空的列表
#有序的:列表中的元素是有序的【存放和在内存中的存储顺序相同】
list2 = [34,5,4,6,765,76]
print(list2)
​
#3.列表中可以存储重复数据
list3 = [34,34,5,5,6,7]
print(list3)
​
#4.列表中可以同时存储不同类型的数据【Python的特点:Python是动态类型的语言】
list4 = [23,"hello",True]
print(list4)
​
#注意:将需要存储的数据存储到列表中,不需要考虑列表的大小,
#如果数据量大的情况下,在运行代码的过程中,列表会进行自动的扩容
#list,tuple,dict,set被称为数据结构,最常用list和dict

 

3.列表元素的访问

通过索引进行访问列表中的元素

3.1获取值

语法:列表名[索引]

代码演示:

#1.获取元素
list1 = [3,54,5,45]   #索引:0~3
#列表中存储的实际上是变量,是变量的引用
num1 = list1[3]
print(num1)
print(list1[3])
print(id(num1) == id(list1[3]))  #True
print(num1 is list1[3])#True
"""
num1 = 10
num2 = num1
print(id(num1) == id(num2))  #True
"""#注意:如果超过了索引的范围,则出现索引越界问题
#print(list1[5])   #IndexError: list index out of range
#列表的下标可以是正数【从前向后访问】,也可以是负数【从后向前访问】
#索引的取值范围:0~元素个数 - 1    或者    -1~ -(元素个数)
#print(list1[-5])

3.2替换值或者修改值

语法:列表名[索引] = 新的值

代码演示:

#2.替换或者修改
print(list1[3])
list1[3] = 100
print(list1[3])
​
#列表是可变的【一个列表一旦被定义之后,在代码运行的过程中,可以随时更改元素的值,也可以随时向列表中增加元素或者删除元素】

4.列表的操作

4.1列表组合

代码演示:


#1.列表组合:将两个或者两个以上的列表合并为一个列表 :+
list1 = [3,4,5]
list2 = [34,6,56]
#注意:列表出现的顺序决定了组合之后的列表中元素的顺序
#注意:列表组合之后生成一个新的列表,原列表不受任何影响
list3 = list2 + list1
print(list3)
print(list1)

4.2列表元素的重复

代码演示:


#2.列表元素的重复
print("hello" * 3)
list4 = [34,5,56]
print(list4 * 3)

4.3判断元素是否在列表中

代码演示:


#3.判断元素是否在列表中
#成员运算符:in   not in
#语法:元素  in/not  in   列表
print(5 in list4)
print(100 in list4)
#使用场景:一般应用在if判断中
if 43 in list4:
    print("yes")

 

4.4切片【截取】【掌握】

获取字列表的过程


语法:列表名[start:end:step]
说明:start和end表示截取元素的下标的区间
step表示步长

举例:0~6
start=2
end=5
step=2

代码演示:

 
 
list1 = [54,6,5,65,6,"aa","bb"]
​
​
#列表名[start:end:step]
​
​
#指定区间
#包头不包尾,step如果不书写,则默认为1
print(list1[2:5])
print(list1[2:5:1])
​
#从指定下标到结尾,包括最后一个元素
print(list1[2:])  #[5, 65, 6, 'aa', 'bb']
print(list1[2:6]) #[5, 65, 6, 'aa']
#从开头获取到指定下标,包括开头,不包括指定下标
print(list1[:5])  #[54, 6, 5, 65, 6]
print(list1[0:5])  #[54, 6, 5, 65, 6]
#特殊情况1:如果end超出了下标的范围,则默认获取从指定下标开始到最后一个元素
#print(list1[100])
print(list1[2:100])
​
#特殊情况二:step可以是正数,也可以是负数
#下标的范围:0~6  或者   -7~ -1
print(list1[2:6:2])  #2 4
print(list1[0:5:-1]) #[]
print(list1[-1:-6])  #[]
print(list1[-1:-6:-1])
​
#需求;将指定的列表倒序输出
print(list1[-1::-1])
print(list1[::-1])

 
"""
结论:
1.不管start和end为正还是为负,如果省略step此时的step默认都是1
2.如果start和end都为正,step必须为正,否则获取出来的子列表为空
3.如果start和end都为负,step必须为负,否则获取出来的子列表为空
4.不管start和end为正还是为负,永远都包含start,不包含end
5.如果为正,则表示从前往后进行获取,如果为负,则表示从后向前获取
"""#需求:按照要求完成下面的操作
"""
1.list2[:3]   abc aaa def
2.list2[2:]    def bbb
3.list2[::-1]   bbb def  aaa abc
4.list2[-1::-2]   bbb  aaa
5.list2[1::2]    aaa bbb
"""
list2 = ["abc","aaa","def","bbb"]

 

 

4.5简单遍历

遍历:将列表中的元素挨个访问出来

代码演示:

list1 = [2,34,35,5,45]
"""
num1 = list1[0]
num2 = list1[1]
num3 = list1[2]
"""#0~4
index = 0
while index < 5:
    num = list1[index]
    print(num)
    index += 1#需求:倒序输出列表中的元素
#方式一
print(list1[::-1])
​
#方式二
index = 4
while index >= 0:
    num = list1[index]
    print(num)
    index -= 1

5.列表的功能【重点掌握】

系统内置的功能

语法:

​ 列表名.功能名(xx)

​ 功能名(xx)

5.1添加元素

代码演示:

 
 
#一、添加元素 列表名.功能名(xx)
#1.append():追加,在列表的末尾添加元素
list11 = [11,22,33,44]
print(list11)
#1.1添加单个元素
list11.append(55)
print(list11)
#1.2添加多个元素
#注意:append中每次只能添加一个数据,如果要追加多个数据,可以采用列表的方式进行追加,但是,整个列表会被当做一个整体添加进去
list11.append([66,77,88])
print(list11)
print(list11[5])
​
print("***************")
​
#2.extend():扩展,在列表的末尾添加元素
list12 = [11,22,33,44]
print(list12)
#2.1添加单个元素
#注意:extend中添加的元素必须是可迭代的【可以使用for循环和while循环遍历的数据:list,tuple,dict,set】
#在extend中添加元素,目前只能添加列表
#工作原理:并没有将整个列表添加到原列表中,而是新的列表打碎,只将其中的元素添加到原列表中
list12.extend([55])
print(list12)
#2.2添加多个元素
list12.extend([66,77])
print(list12)
​
print("***************")
​
#3.insert():插入,在列表的任意索引处插入元素   列表名.insert(index,element)
list13 = [11,22,33,44]
print(list13)
#3.1添加单个元素
#在指定的位置插入指定的元素,原来的元素依次向后顺延
list13.insert(2,100)
print(list13)
​
#3.2添加多个元素
#和append类似,将整个列表插入到指定位置
list13.insert(2,[55,66])
print(list13)
​
#append相对而言使用最多

5.2删除元素

代码演示:

 
 
#二、删除元素   列表名。功能名(xx)
#1.pop() 弹出,移除列表中的指定位置的元素【通过索引移除元素】
list21 = [11,22,33,44,55]
print(list21)
#1.1pop如果不写索引,则默认删除最后一个元素
list21.pop()
print(list21)
#1.2删除指定下标的元素
list21.pop(2)
print(list21)
#1.3pop返回被删除的元素
num = list21.pop(2)
print(num)
​
#list21.pop(10)   #IndexError: pop index out of range
print("*******************")
​
#2.remove() 移除,移除列表中的指定元素
list22 = [11,22,33,44,55]
print(list22)
list22.remove(33)
print(list22)
​
#list22.remove(100)   #ValueError: list.remove(x): x not in list
#注意:remove只能删除列表中从左往右查找到的第一个元素
list222 = [11,22,33,44,55,33,44,55,44,44]
print(list222)  #[11, 22, 33, 44, 55, 33, 44, 55]
list222.remove(44)
print(list222)   #[11, 22, 33, 55, 33, 44, 55]
list222.remove(44)
print(list222)   #[11, 22, 33, 55, 33, 55]
​
​
#3.clear()  清除,将列表中的元素全部清空
list23 = [4,54,65,66]
list23.clear()
print(list23)
​
​
#需求:删除指定列表中指定的重复元素

5.3获取

代码演示:

#三、获取
#1.len():长度,length,获取列表的长度或者获取列表中元素的个数   功能名(列表名)
#索引的取值范围:0~len(列表) - 1
list31 = [43,54,5,454]
print(len(list31))
​
#2.max(),功能名(列表名),获取列表中的最大值
print(max(list31))
​
#3.min(),功能名(列表名),获取列表中的最小值
print(min(list31))
​
#需求:从控制台获取三个数,获取最大值
"""
n1 = int(input())
n2 = int(input())
n3 = int(input())
l1 = [n1,n2,n3]
print(max(l1))
"""#4.index():索引,从列表中获取匹配到的第一个元素的下标   列表名.功能名(元素)  \
#查找指定元素在指定列表中的位置
list32 = [2,54,5,2,46,6,2]
index1 = list32.index(2)
print(index1)
​
#5.count():个数,统计指定元素在指定列表中出现的次数
print(list32.count(2))
​
#需求:自己实现统计某个元素在列表中出现的次数
#记录次数
c = 0
#表示下标
i = 0
while i < len(list32):
    if list32[i] == 2:
        c += 1
    i += 1
print(c)
​
#优化需求:删除列表中的重复元素
"""
list3 = [11,22,33,44,55,33,44,55,44,44]
c = 0
while c < 4:
    list3.remove(44)
    c += 1
print(list3)
"""
​
list33 = [11,22,33,44,55,33,44,55,44,44]
num = 44
c = 0
all = list33.count(num)
while c < all:
    list33.remove(num)
    c += 1
print(list33)

5.4其他

代码演示:

 
 
#四、其他用法
#1.reverse(),反转,将列表中的元素倒序输出
list41 = [3,54,4,6]
print(list41)
list41.reverse()
print(list41)
print(list41[::-1])
​
#2.sort(),排序  列表名.sort(),默认为升序排序
#注意:在原列表中进行排序
list42 = [34,5,4,54,6,56]
#升序
#list42.sort()
#print(list42)
#降序
#方式一:sort(),reverse()
#方式二
list42.sort(reverse=True)
print(list42)
​
​
#3.sorted(),排序   sorted(列表),默认升序
#注意:排序之后生成一个新的列表
list43 = [34,5,4,54,6,56]
​
#升序
newList = sorted(list43)
print(newList)
print(list43)
​
#降序
newList1 = sorted(list43,reverse=True)
print(newList1)
​
#key:自定义排序规则:按照字符串的长度进行排序
list44 = ["abc","gh","sghjghjahg","hello"]
newList2 = sorted(list44,key=len,reverse=True)
print(newList2)

 

5.5拷贝【面试题】

浅拷贝,深拷贝

代码演示:

import  copy
​
#五、拷贝
"""
浅拷贝:拷贝了最外围的实体本身,内部的元素只是拷贝了一个引用,也就是说,把实体拷贝一遍,但是该实体中的其他实体不拷贝
深拷贝:外围和内部的实体都会被拷贝,拷贝是实体本身,而不是引用
""""""
变量  num = 10
引用  num
不可变实体:一旦创建就不能发生改变,包括数字,字符串,元组
可变实体:可以进行修改的实体,包括列表,字典
"""#深浅拷贝的作用:减少内存的使用【以后做数据的清洗,修改或者其他操作的时候,对原数据拷贝一份,以防数据被修改之后,找不到原数据】
#一、对于不可变实体的深浅拷贝
a = (1,2,3)
#1.浅拷贝
#1.1浅拷贝:=
print("浅拷贝:=的拷贝")
b = a
print(a)
print(b)
print(id(a))
print(id(b))
​
#1.2浅拷贝:copy()
#第一步:导入模块  import copy
print("浅拷贝:copy的拷贝")
c = copy.copy(a)
print(a)
print(c)
print(id(a))
print(id(c))
​
#2.深拷贝
#deepcopy()
d = copy.deepcopy(a)
print(a)
print(d)
print(id(a))
print(id(d))
​
print("**********************")
​
#二、可变实体的深浅拷贝
a = [1,2,3]
#1.浅拷贝
#1.1=
print("浅拷贝:=的拷贝")
b = a
print(a)
print(b)
print(id(a))
print(id(b))
​
#1.2copy
print("浅拷贝:copy的拷贝")
c = copy.copy(a)
print(a)
print(c)
print(id(a))
print(id(c))
​
#2.深拷贝
#deepcopy()
d = copy.deepcopy(a)
print(a)
print(d)
print(id(a))
print(id(d))
​
"""
总结:
a.深浅拷贝都是对原实体的拷贝,区别在于是 实体的拷贝还是引用的拷贝【堆空间还是栈空间】
b.不可变的实体:对于深浅拷贝毫无影响,最终的地址和值都是相等的
c.可变的实体:
    =浅拷贝:值相等,地址相等
    copy浅拷贝:值相等,地址不相等
    deepcopy深拷贝:值相等,地址不相等
"""

6.二维列表

实质上还是一个一维列表,只不过该列表中的元素仍然是一个列表

变量----》一维列表-------》二维列表

举例:

没钱 零买 1根 一个变量

稍微有钱 一包 一维列表 存储了20个变量

有钱 一条 二维列表 存储了10个一维列表

代码演示:

#二维列表
list1 = [[23,4,3,5],[34,54],[100,200]]
​
#二维列表中元素的访问
print(list1[2])   #[100,200]
​
subList1 = list1[1]
print(subList1)
num1 = subList1[1]
print(num1)
​
print(list1[1][1])
​
#二维列表的遍历:嵌套循环
#外层循环:遍历外层列表
i = 0
while i < len(list1):
​
    print(list1[i])
    #内层循环:遍历内层列表
    j = 0
    while j < len(list1[i]):
        print(list1[i][j])
        j += 1
​
    i += 1

二、循环语句之for循环

1.基本用法

while语句

初始化表达式

while 条件表达式:

​ 循环体

​ 循环之后的操作表达式

for语句

for 变量名 成员运算符 列表名:

​ 循环体

说明:for主要用来遍历可迭代实体【list,string,tuple,dict,set】

​ 成员运算符一般使用in

工作原理:按照顺序获取列表中的元素,赋值给变量,再执行循环体,如此循环往复,直到将列表中的所有元素遍历完成

代码演示:

list1= [23,35,43,54,54]
​
#1.遍历列表
#while:通过索引遍历列表
i = 0
while i < len(list1):
    print(list1[i])
​
    i += 1
​
​
#for:直接获取元素
"""
for  变量名 in  列表名:
​
    循环体
"""
for j in list1:
    print(j)
​
#2.else分支
#for循环遍历完列表中的元素之后,会执行else分支
for num in [23,5,6,5,66,7]:
    print(num)
else:
    print("else被执行了")
​
​
#需求:已知列表,list1 = [3,35,45,4,56,4],将其中的偶数元素输出
list1 = [3,35,45,4,56,4]
i1 = 0
while i1 < len(list1):
    if list1[i1] % 2 == 0:
        print(list1[i1])
    i1 += 1for i2 in list1:
    if i2 % 2 == 0:
        print(i2)
​
#需求:已知列表,list1 = [3,35,45,4,56,4],将下标为偶数的元素输出
i1 = 0
while i1 < len(list1):
    if i1 % 2 == 0:
        print(list1[i1])
    i1 += 1

2.列表生成器

range(start,end,step),注意:start和step可以省略,如果省略,start默认为0,step默认为1

start:开始数字

end:结束数字

step:步长

作用:生成具有一定规律的列表 【list(range())】

代码演示:

"""
range(100):其中的元素是0~99之间的所有的整数
range(1,100):其中的元素是1~99之间的所有的整数
range(1,100,2):其中的元素是1~99之间的所有的奇数
"""
#需求:已知列表,list1 = [3,35,45,4,56,4],将下标为偶数的元素输出
#0~len(list1) - 1
list1 = [3,35,45,4,56,4]
​
#操作索引
for i in range(0,len(list1)):
    print(list1[i])
#操作元素
for i2 in list1:
    print(i2)
​
​
#需求:求1~100之间所有偶数的和
#方式一
sum1 = 0
num1 = 0
while num1 <= 100:
    sum1 += num1
    num1 += 2
​
​
#方式二
sum2 = 0
num2 = 1
while num2 <= 100:
    if num2 % 2 == 0:
        sum2 += num2
    num2 += 1#方式三
sum3 = 0
for num3 in range(1,101):
    if num3 % 2 == 0:
        sum3 += num3
​
#方式四
sum4 = 0
for num4 in range(0,101,2):
    sum4 += num4
​
​
#注意:for循环遍历列表,如果列表已经存在,则直接遍历,如果不存在,则通过range生成

3.列表的遍历方式

代码演示:

#使用for循环遍历列表
list1 = [2,5,5,4,545]
#1.操作元素
for num in list1:
    print(num)
​
​
#2.操作索引
for i in range(0,len(list1)):
    print(i,list1[i])
​
​
#3.同时遍历元素和索引
#借助于枚举enumerate【仍然是一个容器,存储是列表中的索引和元素】
for i,num  in enumerate(list1):
    print(i,num)
​

 

4.嵌套for循环

代码演示:

 
 
#嵌套for循环
#需求:打印九九乘法表
for i in range(1,10):
    for j in range(1,i + 1):
        print("%dx%d=%d" % (j,i,i * j),end=" ")
​
    print("")
​
​
#需求:遍历二维列表
list1 = [[23,4,3,5],[34,54],[100,200]]
​
for subList in list1:
    for num in subList:
        print(num)
​

5.break、continue、pass的用法

break:跳出当前循环

continue:结束当前正在进行的循环,继续下一次循环

pass:空语句,是为保证程序的完整性,占位的作用【if,while,for,函数】

代码演示:

  

i = 0
while i < 5:
    print(i)
    if i == 2:
        break
    i += 1

print("*************")

for j in range(0,5):
    print(j)
    if j == 2:
        break

#在while和for中,都表示直接跳出当前循环
#continue:结束当前正在进行的循环,继续下一次循环
#和brak类似,可以单独使用,后面的代码没有执行的机会,在实际的项目开发中,常用break

i = 0
while i < 5:

    if i == 2:
        i += 1
        continue
    print(i)
    i += 1

print("*************")


for j in range(0,5):

    if j == 2:
        continue

    print(j)



#pass
if True:
    pass

print("hello")