python基础——高级特性

时间:2023-12-17 22:40:14

1、切片 

   切片:

>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']

>>> L[:3] ['Michael', 'Sarah', 'Tracy']

>>> L = list(range(100)) >>> L [0, 1, 2, 3, ..., 99]

前10个数,每两个取一个:

>>> L[:10:2]
[0, 2, 4, 6, 8]

所有数,每5个取一个:

>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

甚至什么都不写,只写[:]就可以原样复制一个list:

>>> L[:]
[0, 1, 2, 3, ..., 99]

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

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

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

>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG'

有了切片操作,很多地方循环就不再需要了。Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。 2.迭代:
for..in ..:
可迭代的有list、tuple、dict等
因为Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。

  list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:

  是否可迭代可以用collections模块的Iterable类型:
  >>> from collections import Iterable
   >>> isinstance('123',Iterable)
   True
---------------------------------------------------------------------------------------------------------
字典迭代的几个方法:
  默认迭代key:
     >>> d = {'a': 1, 'b': 2, 'c': 3}
     >>> for key in d: ... print(key)
... a c b
迭代value:
>>> for value in d.values():
    ...     print(value)
    ...
    3
    1
    2
同时迭代key,value方法二:
    >>> for k,v in d.items():
    ...      print(k,v)
    ...
    c 3
    a 1
    b 2
同时迭代key,value:
    >>> for item in d.items():
    ...     print(item)
    ...
    ('c', 3)
    ('a', 1)
    ('b', 2)

迭代列表加索引:Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:     >>> for i,v in enumerate(['A','B','C']):
    ...     print(i,v)
    ...
    0 A
    1 B
    2 C
    >>> for i in enumerate(['A','B','C']):
    ...     print(i)
    ...
    (0, 'A')
    (1, 'B')
    (2, 'C')
3、列表生成式:
#一层:
a = [x for x in range(1,11)]
print(a)
#二层
a = [x*x for x in range(1,11) if x%2==0]
print(a)
#字符串
a = [m+n for m in 'ABC' for n in 'abc']
print(a)
#运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:
import os
print([d for d in os.listdir('.')])
#练习题
L = ['Hello', 'World', 18, 'Apple', None]
print(isinstance(18,(str)))
print([s.lower() for s in L if isinstance(s,(str)) ])
4、生成器:

    generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。


    要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。

但不能能获得generator的return返回值,但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIterationvalue中:

    #著名的斐波拉契数列(Fibonacci)
    def Fib(max):
    n, a, b = 0, 0, 1
     while n < max:
     yield b
     a, b = b, a + b
     n = n + 1
    return 'done'
    g = Fib(6)

while True:
      try:
      n = next(g)
      print('g:',n)
      except StopIteration as e:
      print('Generator return value:',e.value)
      break
              运行结果:

g: 1
    g: 1
    g: 2
    g: 3
    g: 5
    g: 8
    Generator return value: done


    请注意区分普通函数和generator函数,普通函数调用直接返回结果:


    >>> r = abs(6)
    >>> r
    6

    generator函数的“调用”实际返回一个generator对象:


    >>> g = fib(6)
    >>> g
    <generator object fib at 0x1022ef948>
 
5、迭代器(Iterator)区别于Iterable

    凡是可作用于for循环的对象都是Iterable类型;

    凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

    集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

    Python的for循环本质上就是通过不断调用next()函数实现的,例如:

    for x in [1, 2, 3, 4, 5]:
     pass

    实际上完全等价于:

    # 首先获得Iterator对象:
    it = iter([1, 2, 3, 4, 5])
    # 循环:
    while True:
     try:
     # 获得下一个值:
     x = next(it)
     except StopIteration:
     # 遇到StopIteration就退出循环
     break