Python高级特性

2020-04-06  本文已影响0人  夏海峰

在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。一行代码能实现的功能,决不写5行代码。请始终牢记,代码越少,开发效率越高。Python中有非常多实用的高级特性,可以帮助我们实现代码的简洁,本篇逐一介绍它们——切片、列表生成式、Generator生成器、迭代器

1、切片 Slice

对经常需要获取指定索引范围的操作,用循环十分繁琐,Python提供了切片(Slice)操作符来实现范围取值。list、tuple、字符串,都支持切片操作。

(1)list 切片:对 list 进行各种切片操作。

L = list(range(100))
print('创建0-100的数列:', L)
l1 = L[:10] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('切片:取前10个元素', l1)

l2 = L[4:8] # [4, 5, 6, 7]
print('切片:取4-8位置的元素', l2)

l3 = L[-1] # 99
print('切片:取最后一个元素', l3)

l4 = L[-10:] # [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
print('切片:取后10个元素', l4)

l5 = L[:10:2] # [0, 2, 4, 6, 8]
print('切片:前10个元素,每两个取一个', l5)

l6 = L[::20] # [0, 20, 40, 60, 80]
print('切片:所有元素,每20个取一个', l6)

l7 = L[:]  # 复制L
print('切片:复制L', l7)

(2)tuple 切片:tuple类型,是不可变list,它也支持切片操作,返回的结果仍是tuple类型。

T = (0,1,2,3,4,5,6,7,8,9)

t1 = T[:3]  # (0, 1, 2)
print('切片:取前3个元素', t1)

t2 = T[::2]  # (0, 2, 4, 6, 8)
print('切片:所有元素,每两个取一个', t2)

(3)字符串 切片:字符串'xxx'也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串。

S = 'ABCDEFG'

s1 = S[:]  # 复制字符串
print('切片:复制字符串', s1)

s2 = S[-5:]  # 取后5个字符 CDEFG
print('切片:取后5个字符', s2)

2、迭代(for...in 数据遍历)

(1)如何判断一个对象是否可迭代呢?方法是使用collections模块的Iterable类型来判断。

from collections.abc import Iterable

b1 = isinstance('abc', Iterable) # True
b2 = isinstance([1,2,3], Iterable) # True
b3 = isinstance((1,2,3), Iterable) # True
b4 = isinstance({'a':1,'b':2,'c':3}, Iterable) # True

print(b1, b2, b3, b4)
# 证明字符串、list、tuple和dict都是可迭代的、可遍历的。

(2)遍历 dict

d = {'a':1, 'b':2, 'c':3}
for k in d.keys():
    print('遍历dict:key', k)

for v in d.values():
    print('遍历dict:value', v)

for k,v in d.items():
    print('同时遍历:key - value', k, v)

(3)遍历 list

l = ['apple', 'bus', 'car', 'duck']

for v in l:
    print('遍历list:', v)
L = enumerate(l)
for i,v in L:
    print('索引:',i, ',元素:', v)
# 索引: 0 ,元素: apple
# 索引: 1 ,元素: bus
# 索引: 2 ,元素: car
# 索引: 3 ,元素: duck
# 遍历元素中的两个变量
for x,y in [(1,1),(2,2),(3,3),(4,4)]:
    print('(x,y):', x, y)

(4)遍历 tuple

for x,y in ((1,2),(2,4),(3,6),(4,8)):
    print('(x,y):', x, y)

for i,v in enumerate(((1,2),(2,4),(3,6),(4,8))):
    print('遍历tuple', i, v)

(5)遍历字符串

for v in 'hello world':
    print('遍历字符串:', v)

for i,v in enumerate('hello world'):
    print('遍历字符串:', i, v)

3、列表生成式

L1 = list(range(11,21))
print('L1:', L1)
# L1: [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
L2 = [x*x for x in range(1,11)]
print('L2:', L2)
# L2: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
L3 = [x*x for x in range(1,11) if x%2==0]
print('L3:', L3)
# L3: [4, 16, 36, 64, 100]
L4 = [m+n for m in 'ABCD' for n in '1234']
print('L4:', L4)
# L4: ['A1', 'A2', 'A3', 'A4', 'B1', 'B2', 'B3', 'B4', 'C1', 'C2', 'C3', 'C4', 'D1', 'D2', 'D3', 'D4']
import os
L6 = [d for d in os.listdir('.')]
print('L6:', L6)
# L6: ['1.py', '2.py', '3.py']
D = {'x':'apple', 'y':'orange', 'z':'banana'}
L7 = [k+'='+v for k,v in D.items()]
print('L7:', L7)
# L7: ['x=apple', 'y=orange', 'z=banana']
S = ['HELLO','WORLD','APPLE','ORANGE']
L8 = [s.lower() for s in S]
print('L8:', L8)
# L8: ['hello', 'world', 'apple', 'orange']
L9 = [x*2 if x%2==0 else -x for x in range(1,11)]
print('L9:', L9)
# L9: [-1, 4, -3, 8, -5, 12, -7, 16, -9, 20]

4、生成器 Generator

(1)第一种方法,使用列表生成式 创建generator生成器

L = [x*x for x in range(10)]  # 列表生成式,创建list列表
print('列表生成式:', L)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
G = (x*x for x in range(5))
print('生成器:', G)
# <generator object <genexpr> at 0x0321BCD8>
print(next(G))  # 0
print(next(G))  # 1
print(next(G))  # 4
print(next(G))  # 9
print(next(G))  # 16
# print(next(G))  # Traceback (most recent call last):StopIteration
G2 = (x*x for x in range(5))
for g in G2:
    print('遍历生成器:', g)

(2)第二种方法,使用generator函数创建生成器

# 定义 generator函数
def odd():
    yield 1
    yield 3
    yield 5
    return 'done'

G3 = odd()
print('生成器', G)  # <generator object <genexpr> at 0x0321BCD8>

for g in G3:
    print('G3: ', g)
# 依次打印 1,3,5

(3)实例:用生成器定义著名的斐波拉契数列

def fib(max):
    n,a,b = 0,0,1
    while n<max:
        yield b
        a,b = b,a+b
        n+=1
    return 'done'

G4 = fib(6)
for g in G4:
    print('G4: ', g)
# 依次打印 1,1,2,3,5,8

(4)generator函数的返回值

def test():
    yield 'a'
    yield 'b'
    return 'done'

G5 = test()
while True:
    try:
        x = next(G5)
        print('G5: ', g)
    except StopIteration as e:
        print('generator函数的返回值:', e.value)  # 'done'
        break

5、迭代器 Iterator

(1)如何判断一个对象是否是Iterable可迭代的?

from collections.abc import Iterable

# 定义生成器函数
def gen():
    yield 1
    yield 2
    return 'done'
# 创建生成器
G = gen()

b1 = isinstance([], Iterable) # True
b2 = isinstance((), Iterable) # True
b3 = isinstance({}, Iterable) # True
b4 = isinstance('', Iterable) # True
b5 = isinstance((x for x in range(10)), Iterable) # True
b6 = isinstance(G, Iterable) # True

print(b1,b2,b3,b4,b5,b6)

(2)如何判断一个对象是不是Iterator生成器对象?

from collections.abc import Iterator

b7 = isinstance([], Iterator) # False
b8 = isinstance(iter([]), Iterator) # True
b9 = isinstance('abc', Iterator) # False
b10 = isinstance(iter('abc'), Iterator) # True

print(b7,b8,b9,b10)

(3)你可能会问,为什么list、dict、str等数据类型不是Iterator?

参考资源:
1、廖雪峰Python教程
2、Python官方文档


END!!!

上一篇下一篇

猜你喜欢

热点阅读