【廖雪峰python教程学习】——(三)高级特性:切片和迭代

本文介绍了Python中的切片操作,如取list、tuple、字符串的子集,以及如何利用切片进行字符串截取。此外,还探讨了迭代的概念,包括dict、字符串的迭代,以及如何通过enumerate函数同时迭代索引和元素。文章强调了Python中简洁高效的编程风格,提倡使用一行代码替代多行代码提高开发效率。
摘要由CSDN通过智能技术生成


前言

在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。
基于这一思想,我们来介绍Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码。请始终牢记,代码越少,开发效率越高。


一、切片

取一个list或tuple的部分元素是非常常见的操作。

1.取一个list中的前三个元素

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
#方法1
[L[0], L[1], L[2]]
#方法二
r = []
n = 3
for i in range(3):
    r.append(L[i])
print(r)

而对于这种经常取指定索引范围的操作,使用循环十分麻烦。更简便的方法是采用python提供的切片(Slice)操作符:

#表示从索引0开始取(可忽略0: L[:3]),但不包括索引3
L[0 : 3]

List中可以L[-1]取倒数第一个元素,也同样支持倒数切片,倒数第一个元素的索引是-1:

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
L[-2:] #['Bob', 'Jack']
L[-2 : -1] #['Bob']

可以通过切片轻松取出一段数列:

L = list(range(100))
L[10:20] #[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
L[:10:2] #前10个数每两个取一个 [0,2,4,6,8]
L[::5] #所有数,每五个取一个[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
#[:]就可以原样复制一个list

2.利用切片取tuple中的元素

tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple

(0, 1, 2, 3, 4, 5)[:3] #(0,1,2)

3.字符串用切片操作

字符串’xxx’也可以看成是一种list,每个元素就是一个字符。

因此,字符串也可以用切片操作,只是操作结果仍是字符串

'ABCDEFG'[:3] #‘ABC’
'ABCDEFG'[::2] #'ACEG'

Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单

4.练习

利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
方法一

# -*- coding: utf-8 -*-
def trim(s):
    # 考虑s为'' or 全是空格
    n = len(s)
    if s == n*(' '):
        return ''
    #考虑直接对第一个和最后一个字符进行切片,采用循环不断消去‘’
    else:   
        while s[0] == ' ' :
            s = s[1:]
        while s[-1] == ' ' :
            s = s[:-1] 
        return s

方法二

# s[0:1]保证了s为''时,不进入循环且语法没有错误,如果用s[0]在s==''时出错
def trim(s):
    while s[0:1] == ' ':

            s = s[1:]

    while s[-1:] == ' ':

            s = s[:-1]
    return s

二、迭代

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)

Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。

只要是可迭代对象,无论有无下标,都可以迭代。

1. dict迭代

比如dict就可以迭代:

d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
    print(key) #a b c or a c b ...

因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()

2.字符串迭代

由于字符串也是可迭代对象,因此,也可以作用于for循环:

for ch in 'ABC':
    print(ch) # A B C

当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。

3.Iterable类型:判断可迭代对象

通过 collections.abc 模块的Iterable类型判断一个对象是否是可迭代对象。

>>> from collections.abc import Iterable
>>> isinstance('abc',Iterable) # str是否可迭代
True
>>> isinstance([1,2,3],Iterable) # str是否可迭代
True
>>> isinstance(123,Iterable) # 整数是否可迭代
False

4.enumerate函数:同时迭代索引和元素本身

Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

>>> for i, value in enumerate(['A', 'B', 'C']):
...     print(i, value)
...
0 A
1 B
2 C

在python中同时引用两个变量是很常见的:

>>> for x,y in [(1,1),(2,4),(3,9)]:
...     print(x, y)
...
1 1
2 4
3 9

5.练习

# 请使用迭代查找一个list中最小和最大值,并返回一个tuple:
# -*- coding: utf-8 -*-
def findMinAndMax(L):
# 考虑设置一个比较初始值max min = L[0]
    if L == []:
        return (None, None)
    else:
        max = L[0]
        min = L[0]
        for i in L:
            if i >= max:
                max = i
            elif i <= min:
                min = i
        return (min, max)

总结

1.python中的None类型

None类型:表示该值是一个空对象,空值是Python里一个特殊的值,用None表示。
None不能理解为0,因为0是有意义的,而None是一个特殊的空值,None的类型是NoneType。

None特性

  • None不支持任何运算也没有任何内建方法
  • None和任何其他的数据类型比较永远返回False
  • None有自己的数据类型NoneType,不能创建其他NoneType对象(它只有一个值None) None与0、空列表、空字符串不一样
    -可以将None赋值给任何变量,也可以给None值变量赋值
    None是没有像len,size等属性的要判断一个变量是否为None,直接使用
    ————————————————
    原文链接:https://blog.csdn.net/weixin_43021844/article/details/120900600

2.python报错:TypeError: cannot unpack non-iterable int object

  1. 确保函数返回值数量一致,即函数返回值数量与调用函数返回值数量需要一致
  2. 如果使用if语句,确保ifelse中的返回值数量一致!
  3. 在将列表元素赋给其他变量时,并列赋值就会报错;
>>> L = (1,2,3)
>>> max, min = L[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot unpack non-iterable int object

解决办法:分开赋值

>>> L = (1,2,3)
>>> max = L[0]
>>> min = L[0]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值