Python学习笔记(二)

1. 函数

  1. 调用函数
    函数API: http://docs.python.org/3/library/functions.html#abs
  2. 数据类型转换
    int(),float(),str(),bool()…
  3. 定义函数
    在Python中,定义函数使用def语句。

    1. def my_abs(x):
    2. if x >= 0:
    3. return x
    4. else:
    5. return -x

    注意在dos命令下,记得缩进。

  4. 空函数
    如果想定义一个什么事也不做的空函数,可以用pass语句。
  1. def nop():
  2. pass

实际上,pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。

  1. 参数检查
    调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError。
    数据类型检查可以用内置函数isinstance()实现。
  2. 返回多个值
    Python的函数返回值其实就是返回一个tuple。
  3. 函数的参数
    位置参数,默认参数,
    可变参数:定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了*。在参数内部,参数接收的是一个tuple,因此函数的代码完全不变。
    关键字参数:可变参数允许0个或任意个参数,这些可变参数在函数调用时自动组装成一个tuple,而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict。
    命名关键字参数:如果要限制关键字参数的名字,就可以用命名关键字参数。
  1. def person(name, age, *, city, job):
  2. print(name, age, city, job)

参数组合:在Python中定义函数,可以用必选参数,默认参数,可变参数,关键字参数和命名关键字参数,这5种参数都可以组合使用,但是参数的顺序必须是:必选参数,默认参数,可变参数,命名关键字参数和关键字参数。

  1. 递归函数
    在函数内部,可以调用其他函数。如果一个函数在内部调用自身,这个函数就是递归函数。
    使用递归函数要注意防止栈溢出。在计算机中,函数的调用是通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
    解决递归调用栈溢出的方法是通过尾递归优化,在函数返回的时候,调用自身本身,并且return语句不能包含表达式

2. 高级特性

  1. 切片
    L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。Python支持L[-1]取倒数第一个元素,同样支持倒数切片。
    L[:10:2]表示,前10个数每2个取一个。L[::2]表示,所有数,每2个取一个。
    tuple也是一种List,唯一区别就是tuple不可变。因此,tuple也可以用切片操作,操作的结果仍然是tuple。
    字符串’xxx’也可以看成List,每一个元素就是一个字符。因此,字符串也可以用切片操作,操作结果仍然是字符串。
  2. 迭代
    如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称之为迭代。
    默认情况下,dict迭代的是key,如果要迭代value,可以用for value in d.values(),如果同时迭代key和value,可以用for k,v in d.items()。
    字符串迭代: for ch in ‘abc’。
    可以通过collections模块的lterable类型来判断一个对象是否是可迭代对象。

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

    Python内置的enumerate函数可以把一个list变成索引-元素对。

    1. >>> for i, value in enumerate(['A', 'B', 'C']):
    2. ... print(i, value)
    3. ...
    4. 0 A
    5. 1 B
    6. 2 C
  3. 列表生成式
    列表生成式即ListComprehensions,是Python内置的非常简单却强大的可以用来创建List的生成式。

    1. list(range(1, 11))
    2. [x * x for x in range(1, 11) if x % 2 == 0]
    3. [m + n for m in 'ABC' for n in 'XYZ']

    列出当前目录下所有文件和目录名

    1. >>> import os # 导入os模块,模块的概念后面讲到
    2. >>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录

    把一个list中所有的字符串变成大写。

    1. >>> L = ['Hello', 'World', 'IBM', 'Apple']
    2. >>> [s.lower() for s in L]
    3. ['hello', 'world', 'ibm', 'apple']
  4. 生成器
    在Python中,这种一边循环一边计算的机制,称为生成器:generator。可以通过next()函数获得generator的下一个返回值。

    1. >>> L = [x * x for x in range(10)]
    2. >>> L
    3. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    4. >>> g = (x * x for x in range(10))
    5. >>> g
    6. <generator object <genexpr> at 0x1022ef630>

    创建l和g的区别仅在于外层的[]和(),l是list,而g是generator。

    1. >>> g = (x * x for x in range(10))
    2. >>> for n in g:
    3. ... print(n)
    4. ...

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

    1. def fib(max):
    2. n, a, b = 0, 0, 1
    3. while n < max:
    4. yield b
    5. a, b = b, a + b
    6. n = n + 1
    7. return 'done'

    generator和函数的执行流程不一样,函数是顺序执行,遇到return语句或者最后一行函数语句就返回,而generator的函数。在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句继续执行。

  5. 迭代器
    直接作用于for循环的数据类型:

    1. 集合数据类型。list,tuple,dict,set,str等;
    2. generator。包括生成器和带yield的generator function。

    这些直接作用于for循环的对象统称之为可迭代对象:Iterable。
    可以使用isinstance()判断一个对象是否是Iterable对象:

    1. >>> from collections import Iterable
    2. >>> isinstance([], Iterable)
    3. True
    4. >>> isinstance({}, Iterable)
    5. True
    6. >>> isinstance('abc', Iterable)
    7. True
    8. >>> isinstance((x for x in range(10)), Iterable)
    9. True
    10. >>> isinstance(100, Iterable)
    11. False

    而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直至最后抛出StopIteration错误表示无法继续返回下一个值了。
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    可以使用isinstance()判断一个对象是否是Iterator对象:

    1. >>> from collections import Iterator
    2. >>> isinstance((x for x in range(10)), Iterator)
    3. True
    4. >>> isinstance([], Iterator)
    5. False
    6. >>> isinstance({}, Iterator)
    7. False
    8. >>> isinstance('abc', Iterator)
    9. False




posted @ 2016-06-01 15:42  ldbmcs  阅读(187)  评论(0编辑  收藏  举报