1. 函数
- 调用函数
函数API: http://docs.python.org/3/library/functions.html#abs - 数据类型转换
int(),float(),str(),bool()… 定义函数
在Python中,定义函数使用def语句。def my_abs(x):
if x >= 0:
return x
else:
return -x
注意在dos命令下,记得缩进。
- 空函数
如果想定义一个什么事也不做的空函数,可以用pass语句。
def nop():
pass
实际上,pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。
- 参数检查
调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError。
数据类型检查可以用内置函数isinstance()实现。 - 返回多个值
Python的函数返回值其实就是返回一个tuple。 - 函数的参数
位置参数,默认参数,
可变参数:定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了*。在参数内部,参数接收的是一个tuple,因此函数的代码完全不变。
关键字参数:可变参数允许0个或任意个参数,这些可变参数在函数调用时自动组装成一个tuple,而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict。
命名关键字参数:如果要限制关键字参数的名字,就可以用命名关键字参数。
def person(name, age, *, city, job):
print(name, age, city, job)
参数组合:在Python中定义函数,可以用必选参数,默认参数,可变参数,关键字参数和命名关键字参数,这5种参数都可以组合使用,但是参数的顺序必须是:必选参数,默认参数,可变参数,命名关键字参数和关键字参数。
- 递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身,这个函数就是递归函数。
使用递归函数要注意防止栈溢出。在计算机中,函数的调用是通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
解决递归调用栈溢出的方法是通过尾递归优化,在函数返回的时候,调用自身本身,并且return语句不能包含表达式
2. 高级特性
- 切片
L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。Python支持L[-1]取倒数第一个元素,同样支持倒数切片。
L[:10:2]表示,前10个数每2个取一个。L[::2]表示,所有数,每2个取一个。
tuple也是一种List,唯一区别就是tuple不可变。因此,tuple也可以用切片操作,操作的结果仍然是tuple。
字符串’xxx’也可以看成List,每一个元素就是一个字符。因此,字符串也可以用切片操作,操作结果仍然是字符串。 迭代
如果给定一个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类型来判断一个对象是否是可迭代对象。>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
Python内置的enumerate函数可以把一个list变成索引-元素对。
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
列表生成式
列表生成式即ListComprehensions,是Python内置的非常简单却强大的可以用来创建List的生成式。list(range(1, 11))
[x * x for x in range(1, 11) if x % 2 == 0]
[m + n for m in 'ABC' for n in 'XYZ']
列出当前目录下所有文件和目录名
>>> import os # 导入os模块,模块的概念后面讲到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
把一个list中所有的字符串变成大写。
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
生成器
在Python中,这种一边循环一边计算的机制,称为生成器:generator。可以通过next()函数获得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。
>>> g = (x * x for x in range(10))
>>> for n in g:
... print(n)
...
如果一个函数的定义中包含yield关键字,那么这个函数就不是普通的函数,而是一个generator。
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和函数的执行流程不一样,函数是顺序执行,遇到return语句或者最后一行函数语句就返回,而generator的函数。在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句继续执行。
迭代器
直接作用于for循环的数据类型:- 集合数据类型。list,tuple,dict,set,str等;
- generator。包括生成器和带yield的generator function。
这些直接作用于for循环的对象统称之为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直至最后抛出StopIteration错误表示无法继续返回下一个值了。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象:>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False