Python学习-Day3
函数与高级特性
函数
函数是最基本的一种代码抽象的方法。
一些内置函数
abs(): 绝对值
max(): 最大值
min(): 最小值
int(),float()等: 数据类型转换
hex() : 将整数转为对应十六进制的字符串
定义函数
一个例子:
1 | def my_abs(x): |
在别的代码文件中引用函数:
from file_name import function_name
pass: 作为占位符。还不知道怎么写,为了让代码运行起来,pass!
多个返回值时,返回的是一个tuple
函数的参数
参数检查:在函数定义中增加检查参数的环节,合理地提示错误。比如数据类型检查:
1 | if not isinstance(x, (int, float)): |
位置参数:按顺序传入的参数。如my_func(x, y)
中的x,y是位置参数
默认参数:在定义的时候给个默认值。注意:1. 定义时,必要参数在前,默认参数在后。2. 默认参数必须指向不变对象(str,None等)
对于第二点的解释:函数定义时,默认参数被创建即它的值被计算出来了,指向某一个对象。如果默认参数指向可变对象(如list),在调用函数时如果改变默认参数,那么可变对象的内容就发生改变,在下一次调用的时候不再是最开始定义的那个值。
(也就是说,默认参数的值在函数定义时就创建了。)
可变参数:在调用时,可输入任意个参数,在调用的时候会自动组装为一个tuple。用法如下:
1 | def my_func(*nums): |
关键字参数:在调用时,可输入任意个包含参数名的参数。用法如下:
1 | def my_func(name, **kw): |
命名关键字参数:调用时必须带上参数名传参,用法(定义时用*隔开):
1 | def my_func(name, *, age, city): |
- 以上参数的组合顺序必须是:必选参数,默认参数,可变参数,命名关键字参数,关键字参数。
- 对于任意函数,都可以通过类似
func(*args, **kw)
的形式调用它
函数递归
为了避免递归产生的溢出,使用尾递归(即在函数返回的时候,调用函数本身)。
高级特性
切片
对于list,tuple,string等,可以通过切片来获得部分数据。如下:
1 | >>>l = [1,2,3,4,5,6] |
迭代
什么是迭代?
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
什么是可迭代对象?
通过collections模块的Iterable类型判断:
1 | from collections import Iterable |
enumerate()函数:将list变成“索引-元素”对:
1 | for i, value in enumerate(['A', 'B', 'C']): |
列表生成式
用法:
1 | In [1]: [x * x for x in range(10)] |
生成器
什么是生成器(generator)?
当某一个列表的元素可以按照某个算法推算出来,那么就不必创建完整的list,而在要用到的时候再推算出来。在python中,这种一边循环一边计算的机制,称为生成器(generator)。
如何创建生成器?
方法一(当算法比较简单时):
将列表生成器替换为生成器(把[]
改为()
):
1 | g = (x * x for x in range(6)) |
注意:next()函数计算出下一个数并返回,当取完了再调用next()会报错:StopIteration
。
方法二(难以用类似列表生成式的循环实现):
将函数写成生成器。在函数体中,加关键字field。如下:
1 | def fib(max): |
PS: 每次调用next(f)时,函数执行到yield语句返回。下一次调用就从上次field语句的下一句继续执行,直到field。如果没有field语句了,就报StopIteration
的错误。
迭代器
迭代器(Iterator)区别于可迭代对象(Iterable):后者只要能用于for循环就是,前者可以用next()并产生对应的值。
list
,dict
,str
都是Iterable
对象,但不是Iterator
对象。
而generator
是Iterator
对象,当然也是Iterable
对象。
小结
- 参数的类型和顺序
- 可迭代对象与迭代器
- 列表生成器
- 生成器是什么?怎么写?