基础知识

1.list列表

Python内置一种数据结构list。

  1. classmates = ['Micle', 'Tom', 'Tonny']
  2. len(classmates)获得list的元素个数
  3. 索引访问list中的元素calssmates[0]
  4. 取最后一个元素classmates[-1],倒数第二个classmates[-2]
  5. list是一个可变的有序表,可以末尾追加元素classmates.append('Adam')
  6. 插入到指定位置classmates.insert(1,'Jack')
  7. 删除末尾元素classmates.pop(),删除指定位置元素classmates.pop(1)
  8. 若要替换其中元素,直接向索引位置赋值

2. tuple元组

Python内置另一种有序列表

1.一旦初始化以后就不可修改classmates = ( 'Micle', 'Tom', 'Tonny')。
可以读取元素,但是无法赋值或者修改。这样数据更安全,所以推荐使用。

  1. 可变tuple:t = ('a', 'b', ['A', 'B']),此时可以修改其中的list值

3. dict字典

使用键-值存储,具有极快的查找速度

  1. d = {'Micle':95, 'Tom':75, 'Tonny':85}
    >>>d['Micle']
    95
  2. 为了避免key不存在的情况,用in或get()判断
    >>>'Tomas' in d
    False
    >>>d.get('Tomas'),不存在可以返回None,此时不显示结果
    >>>d.get('Tomas',-1),自己设定返回值
  3. 和list比较,dict有以下几个特点:
    查找和插入的速度极快,不会随着key的增加而变慢;
    需要占用大量的内存,内存浪费多。
    而list相反:
    查找和插入的时间随着元素的增加而增加;
    占用空间小,浪费内存很少。
    所以,dict是用空间来换取时间的一种方法。

4.set集合

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

  1. 要创建一个set,需要提供一个list作为输入集合:
    >>> s = set([1, 2, 3])
    >>> s
    {1, 2, 3}
  2. 重复元素在set中自动被过滤
  3. 通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
  4. 通过remove(key)方法可以删除元素:
  5. set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
    >>> s1 = set([1, 2, 3])
    >>> s2 = set([2, 3, 4])
    >>> s1 & s2
    {2, 3}
    >>> s1 | s2
    {1, 2, 3, 4}

5.列表生成式

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

  1. 列表生成式则可以用一行语句代替循环生成list:
    >>> [x * x for x in range(1, 11)]
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来.
  2. for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:
    >>> [x * x for x in range(1, 11) if x % 2 == 0]
    [4, 16, 36, 64, 100]
    还可以使用两层循环,可以生成全排列:
    >>> [m + n for m in 'ABC' for n in 'XYZ']
    ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

6.生成器generator

  1. 要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
    >>> L = [x * x for x in range(10)]
    >>> L
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x1022ef630>
    创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
  2. 如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:
    >>> next(g)
    0
    >>> next(g)
    1
    >>> next(g)
    4
    不断调用next(g)实在是太变态了,正确的方法是使用for循环,因为generator也是可迭代对象:
    >>> g = (x * x for x in range(10))
    >>> for n in g:
    ... print(n)
  3. 如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。
    要把fib函数变成generator,只需要把print(b)改为yield b就可以了:
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

7. 迭代器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。

  1. 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
    可以使用isinstance()判断一个对象是否是Iterable对象:
    >>> from collections import Iterable
    >>> isinstance([], Iterable)
    True
    >>> isinstance({}, Iterable)
    True
  2. 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    可以使用isinstance()判断一个对象是否是Iterator对象:
    >>> from collections import Iterable
    >>> isinstance([], Iterable)
    True
    >>> isinstance({}, Iterable)
    True
  3. 生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
    把list、dict、str等Iterable变成Iterator可以使用iter()函数:

8. map()函数与reduce()函数

map()函数接收两个参数,一个是函数,一个是Iterator,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
reduce()把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

9. filter()函数

和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
例如,在一个list中,删掉偶数,只保留奇数,可以这么写:

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

10. sorted()函数

  1. Python内置的sorted()函数就可以对list进行排序:
    >>> sorted([36, 5, -12, 9, -21])
    [-21, -12, 5, 9, 36]
  2. 此外,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:
    >>> sorted([36, 5, -12, 9, -21], key=abs)
    [5, 9, -12, -21, 36]
    key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
  3. 要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True:
    >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
    ['Zoo', 'Credit', 'bob', 'about']

11.匿名函数lambda

当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。

  1. 匿名函数lambda x: x * x实际上就是:
def f(x):
    return x * x

关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

  1. 用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
    >>> f = lambda x: x * x
    >>> f
    <function <lambda> at 0x101c6ef28>
    >>> f(5)
    25
  2. 同样,也可以把匿名函数作为返回值返回,比如:
def build(x, y):
    return lambda: x * x + y * y

PS

  1. 赋值语句:
    a, b = b, a + b
    相当于:
    t = (b, a + b) # t是一个tuple
    a = t[0]
    b = t[1]
    但不必显式写出临时变量t就可以赋值。`
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,404评论 0 4
  • 有时候技术总是不够用,明明已经学了很多技能了,但是碰到问题还是不够用。手工处理耗时太长的问题已经困扰着希望解放双手...
    蝴蝶之梦天使阅读 326评论 0 0
  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 1,553评论 0 6
  • Python标识符 在 Python 里,标识符有字母、数字、下划线组成。在 Python 中,所有标识符可以包括...
    tianyi6677阅读 1,119评论 0 3
  • Python 是一种相当高级的语言,通过 Python 解释器把符合语法的程序代码转换成 CPU 能够执行的机器码...
    Python程序媛阅读 1,941评论 0 3