6、Python基础之列表

一、break 和 continue 语句

break 和 continue 语句都只能用在while 和 for 循环中。

1.1 continue 语句

  • continue 语句: 用来告诉python 跳出当前循环的剩余语句,然后继续进行下一轮循环。常用在 while 和 for 循环中。
    案例分析:
    i += 1位于 continue前面时:
i = 0
while i < 6:
    i += 1
    if  i ==4:
        continue
    print(i)
else:
  print('hello')
-------------执行------------
1
2
3
5
6
hello

当 i += 1 位于 continue 后面时:

i = 0 
while i < 6:
    if i == 4:
       continue
    i += 1
    print(i)
else:
  print('hello')
--------------执行------------
0
1
2
3
4
  • 上面案例二中, i += 1在continue后时,i ==4 时,continue程序跳出if 当前循环,又重新进入下一轮循环,这样一直在continue -->跳出-->continue …… 这样程序就问题了。所以输出一直停留在0 ,1,2,3。

  • continue 语句时一个删除的效果,他的纯在时为了满足循环条件下的某些不需要的成分:

j = 10
while j > 0:
    j -= 1
    if j ==3 or j == 7:
        continue
    print(j)
else:
    print('hello python')
-------------输出-------------
9
8
6
5
4
2
1
0
hello python
  • 可以看到上面效果就是去除了 3 和7 。
    案例3:打印1-10以内的奇数
i =0
while i < 10:
  i += 1
  if i % 2 == 0:
    continue
  print(i)
--------------输出--------------
1
3
5
7
9

1.2 break 语句

  • break 用来立即跳出循环语句,包括else 语句。
i = 0 
while i < 10:
   i += 1
   if i == 4:
      break
   print(i)
else:
  print('hello python')
-----------输出----------
1
2
3

上面案例中当 i==4 时,break 直接终止了循环。

  • 如果使用嵌套循环,break 语句将停止执行最深层的循环,并开始执行下一段代码。
j = 0
while  j < 2:
   i = 0
   j += 1
   while i < 10:
       i += 1
       if i == 4:
           break
       print(i)
   else:
       print('hello')
---------------输出----------------
1
2
3
1
2
3

总结: continue 和 break 只会对当前的所在循环跳出或终止,不会对循环外的嵌套循环产生效果。

二、序列

2.1 序列 (sequence)

  • 概念: 序列是 Python中最基本的一种数据结构,用于保存一组有序的数据
  • 序列中数据都有一个唯一的索引,且数据会按照添加的顺序来分配索引
  • 数据结构:计算机中数据存储的方式。

2.2 序列分类

  • 可变序列:序列中元素可以改变 比如:list.
  • 不可变序列:序列中元素不可以改变 比如:字符串(str) , 元组(tuble)

2.3 列表

  • 多元化存储,可以存储各种数据类型
  • 数据类型: 字符串、列表、元组、字典、集合。
  • 格式:list []
    • [] 表示一个空列表。
list1 = [True, None, 'a', 111, [1,2,3]]
列表的增删改查

1) 列表取值
使用下标索引来访问列表中的值。

list1 = [True, '111', 23, [1,2,3]]]
print("list1[0]:", list1[0])
print("list1[1]:", list1[1])
print("list1[3]:", list1[3][0])
------------输出--------------
list1[0]: True
list1[1]: 111
list1[3]: 2

2) 列表更新
我们同样可以对列表的数据项目进行修改或更新。可以使用 append(), insert() ,extend()等方法来添加列表项。

list2 = []  #空列表
list2.append('k8s')
list2.append('jenkins')
print(list2)  # 使用append() 向列表最后追加一个元素。
list2.insert(1,'prometheus')) # 指定位置插入一个元素,1表示当前下标索引2之前插入。
print(list2)
list2.extend(['gitlab'])
----------输出-----------
['k8s', 'jenkins']
['k8s', 'prometheus', 'jenkins']
['k8s', 'prometheus', 'jenkins', 'gitlab']

insert() : 在索引前插入
append(): 索引值后追加
extend(): 在列表末尾追加,添加其他列表到当前列表中来。

3) 删除列表中的元素
可以使用 remove .pop 等语句来删除列表中的元素, 如下:

list1 = ['python', 'java', 'golang', 'nodejs']
list1.remove('nodejs')
print(list1)
list2 = ['111', '222', '333', '444']
res = list2.pop(1)
print(res)
res = list2.pop()
print(res)

----------输出------------
['python', 'java', 'golang']
222
444
  • pop 根据索引值删除并返回你删除的数据,如果没有传递索引值,那么会删除最后一个元素。(特点,按索引删除,并返回数据。)
  • remove 根据指定元素删除(特点:按值删除)

2.4 切片

  • 什么是切片?
    • 切片是指从现有列表中获取一个子列表。
    • 通过切片获取指定元素
  • 语法: list [起始位置:结束位置:步长]
          索引1  索引2

特性:左闭右开区间,即不包含结束位置的值
list1[1:3] : 表示取值索引1 和索引为3 的数据,即第2个和第4个数据,但是切片的特性,左闭右开区间, 最终取到就是第2和第3个数据。
(1) 切片可以取到开头元素,但是不能取到结尾数据
但是,如果切片省略了开头和结尾取到最后,就能取到整个列表 list[:]

list1 =  ['java', 'python', 'nodejs', 'golang']
print(list1[1:3])
print(list1[:])  #  省略了开头和结尾,可以取到整个列表
---------输出---------
['python', 'nodejs']
['java', 'python', 'nodejs', 'golang']

(2) 索引顺序 <重点理解>

  • 从左往右取值,索引从0开始,依次排序:0,1,2,3……
  • 从右往左取值,索引从-1开始,依次 -1,-2,-3,-4……;但是,此时需要加上步长步长决定了索引取值的方向
list1 =  ['java', 'python', 'nodejs', 'golang']
print(list1[-1:-3])
# 输出为 []
print(list[-1:-3:-1])  #步长为-1,从右往左取值,切片的特性可以取开头,但取不到结尾。所以最终取到 golang,nodejs。
#输出:['golang', 'nodejs']
print(list1[-3:-1])  # 没有指定步长,这里默认步长为1,即从左往右取值[-3 到-1。但是,切片的特性可以取开头,但取不到结尾。所以只能取到 python 和 nodejs。
# 输出: ['python', 'nodejs'] 

2.5 通用操作

  • +和*
    • + 两个列表拼接成要给列表
    • ✳ 将两个列表重复输出为指定的次数。但是列表不能相乘,相除。
list1 = [1,2,3] + [4,5,6]
print(list1)
list2 = ['a', 'b', 'c'] *2
-----------输出-----------
[1, 2, 3, 4, 5, 6]
['a', 'b', 'c', 'a', 'b', 'c']
  • in 和 not in : 判断 元素是否在当前列表中。输出 True or False.
  • len : 获取列表元素的个数
list1 = [1,2,3] + [4,5,6]
print(len(list1))
--------输出---------
6
  • max() && min(): 获取列表中最大值,最小值
  • index :
    • 在字符串中使用方式
s = 'abcd'
print(s.index('a'))  # 返回的是索引值
print(s.find('a'))   #
# 但是如果是字符串中没有的元素呢:
print(s.index('e'))  # index 直接报错
print(s.find('e'))    # 没有找到,返回-1

在列表中,只能使用 index, 不能使用find

  • 特性1:index在列表中,只能找到第一个元素得索引并返回出来。
  • 特性2:如果找不到list 中的元素直接报错
print(list2.index('a'))  # 只能找到第一个值得索引,并返回出来。
print(list2.index('d'))  # 如果找不到list 中得元素,则报错。
  • list.count(x) : 表示指定元素在列表中出现的次数。

2.6 修改列表

  • 通过索引修改: 替换
list1 =  ['java', 'python', 'nodejs', 'golang']
list1[1] = 'c++'
print(list1)
---------------输出------------
['java', 'c++', 'nodejs', 'golang']
  • 通过切片修改
情况一:
list1 =  ['java', 'python', 'nodejs', 'golang']
list1[1:2] = 'c++'  # 这里c++ 字符串是一个序列,分配三个索引值,因此会被拆分
print(list1)
------------输出------------
['java', 'c', '+', '+', 'nodejs', 'golang']

情况二:
list1 =  ['java', 'python', 'nodejs', 'golang']
list1[1:2] = ['c++']   # c++ 就是列表序列中的一个元素,分配一个索引,所以会完整替换。
print(list1)
------------输出------------
['java', 'c++', 'nodejs', 'golang']

注意: 通过切片来修改列表时,来替换的内容必须是一个序列。并且序列还会被拆开。
上面 'C++',也是一个序列,序列中保存的一组有序的数据,在序列中都有唯一的索引位置,在内存中存储时也是连续,顺序存储的,C++三个字符索引分别为:0,1,2.

图片.png

所以,我们在切片时,取出数据是一个列表。

列表中多个元素被替换成少的元素是,也是不可以的

list1 =  ['java', 'python', 'c++', 'nodejs', 'golang']
list1[1::2]   # 从索引1开始取值,步长为2 ,取出数据:python 和 nodejs
print(list1[1::2])
# 然后做替换操作会怎么样呢 ?
list1[1::2] = ['123']
结果当然会报错,因为我们取出2个元素,而只有一个替换的元素,因此会报错。
list1[1::2] = ['123', '234']
print(list1)
-----------------输出---------------
['python', 'nodejs']
['java', '123', 'c++', '234', 'golang']
  • 结论:当设置了步长时,序列中元素的个数必须和切片中元素的个数保持一致。

  • 列表反转
    reverse
    用法: list.reverse()

  • 列表排序
    sort 升序和降序排列,默认时升序排列
    用法: list.sort(reverse=True)
    当 reverser=False时不反转,reverse=True,反转。
list1 = ['a', 'b', 'c']
list2 = [2, 4, 1, 5, 8, 6]
list1.sort(reverse=True)
list2.sort(reverse=True)
print('修改后:', list1) # ['a', 'b', 'c']
print('修改后:', list2)  # [8, 6, 5, 4, 2, 1]
list2.sort(reverse=False)
print('修改后:', list2)  # [1, 2, 4, 5, 6, 8]
------------输出--------------
修改后: ['a', 'b', 'c']
修改后: ['c', 'b', 'a']
修改后: [8, 6, 5, 4, 2, 1]
修改后: [1, 2, 4, 5, 6, 8]

补充 for循环遍历

for 循环
  • 作用:主要通过for 循环来遍历列表。
  • 语法:
for  变量  in  序列(遍历的规则):
      代码块

注意:
for 循环的代码块会执行多次,序列中有几个元素就会执行几次,每执行一次,就会将序列中的一个元素赋值给变量,所以我们可以通过变量来获取列表中的元素。
案例:

list1 = [1,2,3,4,5,6]
for i in list1:
    print(i)
-------------正常输出-----------
0
1
2
3
4
5
6
  • 注意:当我们对列表进行for 循环时,对list 里面的内容是无法更改的。
list1 = [1,2,3,4,5,6]
for i in list1:
    i += 1
print(list1)
--------------输出-------------
[0, 1, 2, 3, 4, 5, 6]
# list1 依然没变。
  • for 循环 else 格式:
  • 对于for 循环,我们假如要改变list 里面的数据,我们可以在循环外重新定义一个新的列表。
list1 = ['a', 'b', 'c', 'd',  'e', 123]
list2 = []
for i  in list1:
     print(i)
     list2.append(i)
else:
     print("循环正常结束")
------------输出------------
a
b
c
d
e
123
循环正常结束
['a', 'b', 'c', 'd', 'e', 123]

range() 函数

  • 特点:range() 函数 是一个左闭右开区间,可以取到开始数据,但是取不到结束数据,步长默认为1,通常可以省略。
  • 格式:
range(开始数据,结束数据,步长)

案例使用:

range(9)   # 等价于 range(0, 9, 1)  类似于 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# range函数常与 for 循环结合使用
for i in range(9):
    print(i)
    print(list(range(9)))
  • 作用:方便我们去创建一个列表。

练习:
1、现在 a = [1,2,3,4,5,6] 用多种方式实现列表的反转 ([6,5,4,3,2,1],),并写出推到过程

方法一:直接通过 reverse()函数进行列表反转
a = [1, 2, 3, 4, 5, 6]
a.reverse()
print(a)
-----------输出------------
[6, 5, 4, 3, 2, 1]

方法二:通过sort 结合reverse 进行降序排列
# sort 默认是升序排序,再加上reverse 反转,则进行降序排列
a.sort(reverse=True)
print(a)
-------------输出-----------
[6, 5, 4, 3, 2, 1]

方法三:切片
# 分析: 切片,设置步长为-1, 按照下标索引,从-1开始,从右到左取值,依次打印
print(a[-1::-1])
------------输出-------------
[6, 5, 4, 3, 2, 1]

方法四: 按照索引替换
# 分析:[1,2,3,4,5,6] 是一个列表,我们可以直接替换列表的值
根据索引替换,从下标索引0开始a[0] = 6,依次替换。
要替换6次,因此可以通过 while循环实现
i 作为索引下标,初始值为0 ,依次加1;j 作为列表元素,依次减 i 。
i = 0
j = 6
while i <6:
    a[i] = j-i
    i += 1
print(a)
------------输出-------------
[6, 5, 4, 3, 2, 1]

2、有2个列表 list1 = [11,22,33] list = [22,33,44] 获取内容相同的元素。

分析:通过 for 循环,比较2个列表中的每个元素是否相等。
方法一:分别从list1 与 list2 取出值进行比较。
list1 = [11, 22, 33]
list2 = [22, 33, 44]
for i in list1:
    for j in list2:
        if i == j:
            print(i)

方法二:  取list1 的元素,通过 if 判断 元素是否 in list2
list1 = [11, 22, 33]
list2 = [22, 33, 44]
for i in list1:
  if i  in list2:
     print('内容相同的元素有:', i)
------------输出-------------
内容相同的元素有:22
内容相同的元素有:33
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容