基础知识

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就可以赋值。`
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

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